去除CuteFTP Pro 2.0 Final(2001.11.20)自校驗 (2千字)

看雪資料發表於2001-11-26

去除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

相關文章