去除CuteFTP Pro 2.0 Final(2001.11.20)自校驗
我們看看CuteFTP Pro 2.0 Final的自校驗情況。
用exescope修改cftppro.exe(1,966,080 位元組)資源後儲存為test.exe。
執行後得到提示“CuteFTP ... check failed”。
用smartcheck載入test.exe,程式執行,最後自動退出。
搜尋createfilea,看到如下:
CreateFileA("E:\CUTEFTP PRO\TEST.EXE")
(test.exe offset 0007F4D5)
wdasm反編譯test.exe:
* Reference To: KERNEL32.CreateFileA, Ord:0034h
|
:0047F4D4 FF1568945200 Call dword ptr
[00529468]
......
......
* Reference To: KERNEL32.CreateFileMappingA, Ord:0035h
|
:0047F4E3 FF1570945200 Call dword ptr
[00529470]
<-- 建立檔案test.exe記憶體映象
......
......
* Reference To: KERNEL32.MapViewOfFile, Ord:01D6h
|
:0047F569 FF1574945200 Call dword ptr
[00529474]
<-- 分段讀入
......
......
//自校驗開始
:0047F588 8A0439
mov al, byte ptr [ecx+edi]
:0047F58B 8D54142C lea
edx, dword ptr [esp+edx+2C]
:0047F58F 3002
xor byte ptr [edx], al
:0047F591 8B542410 mov
edx, dword ptr [esp+10]
:0047F595 41
inc ecx
:0047F596 42
inc edx
:0047F597 3BCE
cmp ecx, esi
:0047F599 89542410 mov
dword ptr [esp+10], edx
:0047F59D 72D8
jb 0047F577
//自校驗結束
<-- 檔案test.exe自頭開始,每8個位元組為一組,依次進行“異或XOR”計算,最後得到8位元組的校驗值
* Reference To: KERNEL32.UnmapViewOfFile, Ord:02B0h
|
:0047F5A0 FF156C945200 Call dword ptr
[0052946C]
:0047F5A6 8B4C2424 mov
ecx, dword ptr [esp+24]
<-- 釋放檔案記憶體映象
......
......
:0047F5E8 8A4C041C mov
cl, byte ptr [esp+eax+1C]
:0047F5EC 84C9
test cl, cl
:0047F5EE 7510
jne 0047F600
:0047F5F0 8BD0
mov edx, eax
:0047F5F2 48
dec eax
:0047F5F3 85D2
test edx, edx
:0047F5F5 75F1
jne 0047F5E8
<-- 對整個檔案的校驗值再進行一些計算,
<-- 若最後8位元組值為00000000 00000000,則檔案沒有被修改
:0047F5F7 B801000000 mov eax,
00000001
<-- 所以放入記號,eax==1
:0047F5FC 83C448
add esp, 00000048
:0047F5FF C3
ret
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047F5EE(C)
|
:0047F600 33C0
xor eax, eax
<--不然,eax==0
:0047F602 83C448
add esp, 00000048
:0047F605 C3
ret
因此改:0047F5EC 84C9 test cl, cl
為 30C9
xor cl, cl
去除其自校驗。
End.
From CCG
2001.11.26