• 标 题:去除CuteFTP Pro 2.0 Final(2001.11.20)自校验 (2千字)
  • 作 者:小楼
  • 时 间:2001-11-26 20:48:21
  • 链 接:http://bbs.pediy.com

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