: :其他软件 2019-08-12 19:18:30
由于这个文件没有公开的文档可用,所在只能用winhex打开,边看边猜,这也是常规的解密方法,终于功夫不负有心人,经过几天的猜解,终于摸清了文件的结构,写出了解密程序,今天特来跟大家分享了下。
我们先来说文件结构。文件结构分为文件头和数据体两部分,数据体是分块保存的。结构如下图:
首先看文件头,它由60个字节组成,包含文件的大小、解压后大小、数据分块大小和数据校验值等,通过对比F650和F452两个光猫的配置文件,除校验值算法未知,这个结构基本如下:
需要说明的是,这个文件的数值保存都是采用 Big endian格式保存的,所以编程时要进行字节序的转换才行。我编程用的是delphi,转换字节序的函数如下:
下面我们来看看最重要的数据块结构,它是有一个简单的数据头和zlib数据块组成,数据头中包含了数据解压后的大小,压缩块的大小和下个数据块的位置,所以我们只要找到第一个数据块的位置,就可以循环找到下一个,直到最后一个,根据数据块提供的信息进行解压合并就行了。数据块的结构如下:function Swap32(const Value: LongWord): LongWord;
begin
Result := Swap(Word(Value)) shl 16 + Swap(Word(Value shr 16));
end;
写文不易,分析和制图都花费了不少时间,写代码更是耗时,因为毕竟不是专业程序员。所以写得不好大家不要喷,有不对之处请大家批评指正,写的程序如下,程序源码和编译后的程序及db_user_cfg.xmlfunction UnZipCofing(Fname: string): string;
var
ds: TDecompressionStream;
ms, fs, tmpfs: TMemoryStream;
ss: TStringStream;
bufferSize, blockSize, nextOff: LongWord;
begin
fs := TMemoryStream.Create;
tmpfs := TMemoryStream.Create;
ms := TMemoryStream.Create;
ss := TStringStream.Create('');
if not FileExists(Fname) then
begin
ShowMessage('文件不存在!');
exit;
end;
try
fs.LoadFromFile(Fname);
nextOff := 60;
while nextOff > 0 do
begin
fs.Seek(nextOff, soFromBeginning);
//读取缓冲区大小
fs.Read(bufferSize, SizeOf(bufferSize));
bufferSize := Swap32(bufferSize);
//读取压缩块大小
fs.Read(blockSize, SizeOf(blockSize));
blockSize := Swap32(blockSize);
//读取下一块位置
fs.Read(nextOff, SizeOf(nextOff));
nextOff := Swap32(nextOff);
//复制压缩数据块到临时数据流
tmpfs.Clear;
tmpfs.CopyFrom(fs, blockSize);
tmpfs.Position := 0;
//解压数据块
ds := TDecompressionStream.Create(tmpfs);
ms.SetSize(bufferSize);
ZeroMemory(ms.Memory, bufferSize);
ms.Position := 0;
ds.Read(ms.Memory^, bufferSize);
//将解压后的数据流复制到字符串数据流
ss.CopyFrom(ms, 0);
ds.Free;
end;{end while}
//输出合并后的字符串流。
Result := ss.DataString;
finally
//垃圾回收
fs.Free;
tmpfs.Free;
ms.Free;
ss.Free;
end;
end;
TAG: 中兴,光猫,配置文件,结构分析,解密教程
09-26华为中兴C/C++编程规范文档
12-10java邮件发送功能,配置文件读取方式
12-06log4j日志配置文件
12-06Android通用的build配置文件
09-20一键读写配置文件,快速读写配置文件
01-23判断程序启动次数及删除配置文件
11-14OA的配置文件对OA使用进行限制