-
-
我的还原经历
-
发表于:
2004-8-24 15:49
7131
-
题目:我的还原经历
由于曾经用自己未完全破解(当然在一个偶然才发现)的 EasyCHM 编译了一本定名为abc.chm,并将相关的源文件痛快地删除了,后来发现后,就顺便把 EasyCHM 破解完全!可惜该abc.chm文件内的所有文件都被附加 Unregistered 的东西(“加料料理”,我不太接受),它特征为:每个文件尾部都加上 F1h 长度的固定16进制串。因为释放文件数量比较大,如果人工用16进制工具进行还原,天啊,所以需要批量处理释放文件,于是到 bbs.pediy.com 求助,谁知不久后论坛就给人攻击了,无奈只好亲自就从反编译功能方面着手调试跟踪。反编译当然是释放文件啦,那么就是要写文件,跟踪发现程序(功能已破解完全,不然反编译还会“加料料理”)反编译中会对每一个被释放文件以每次1000h的长度划分到缓冲区(待写),不足1000h就认为是该文件的最后一次写操作。
下面跟踪到写文件必经地方(具体地址已忽略):
00333314 jmp dword ptr ds:[<&kernel32.WriteFile>]; // 可从这修改到指定代码实行的地方,如:999900
0033331C push ebp
0033331D mov ebp,esp
0033331F push ecx
00333320 push ebx
00333321 push esi
00333322 push edi
00333323 mov esi,ecx
00333325 mov edi,edx
00333327 mov ebx,eax
00333329 mov eax,dword ptr ss:[ebp+10]
0033332C movzx edx,word ptr ds:[ebx+4]
00333330 and edx,eax
00333332 cmp eax,edx
00333334 jnz short EasyCHM.0033338E
00333336 push 0 ; // lpOverlapped 倘若在指定FILE_FLAG_OVERLAPPED的前提下打开文件,这个参数就必须引用一个特殊的结构。那个结构定义了一次异步写操作。否则,该参数应置为空
00333338 lea eax,dword ptr ss:[ebp-4]
0033333B push eax ; // lpNumberOfBytesWritten 实际写入文件的字节数量
0033333C mov eax,dword ptr ds:[ebx+8]
0033333F imul esi
00333341 push eax ; // nNumberOfBytesToWrite 要写入数据的字节数量。
00333342 push edi ; // lpBuffer 要写入的一个数据缓冲区
00333343 mov eax,dword ptr ds:[ebx]
00333345 push eax ; // hFile 文件的句柄
00333346 call dword ptr ss:[ebp+C] ; // 实际是 Call 00333314 ; kernel32.WriteFile
00333349 test eax,eax ; // 写文件成功则返回 1
0033334B jnz short EasyCHM.0033335E
0033334D call <jmp.&kernel32.GetLastError>
0081E760 00333349 /CALL 到 WriteFile 来自 EASYCHM.00333346
0081E764 000000C8 |hFile = 000000C8 (region)
0081E768 0081E7E8 |Buffer = 0081E7E8
0081E76C 00001000 |nBytesToWrite = 1000 (4096.)
0081E770 0081E784 |pBytesWritten = 0081E784
0081E774 00000000 \pOverlapped = NULL
0081E778 01281D0C ASCII "<br><hr><br> This file is decompiled from a .CHM file <br>by an UNREGIST>......"
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)