• 标 题:去除HyperSnap-DX ver.4.20.00 CRC校验 (3千字)
  • 作 者:小楼
  • 时 间:2001-11-18 18:03:23
  • 链 接:http://bbs.pediy.com

去除HyperSnap-DX ver.4.20.00 CRC校验

    一个具有很强CRC校验的软件,将hprsnap.exe、hprsnap.xxx、hprres.dll、hprres.xxx四个文件更名或修改(汉化)都不能运行程序。如果随便修改程序跳转将很容易导致“程序执行非法操作”。

1. 复制HprSnap.exe更名为test.exe,复制HprRes.xxx更名为test.xxx。用smartcheck载入后运行,执行完毕后终止进程。
  选择smartcheck中的“显示所有事件”按钮,了解一下作了些什么?
  hprsnap.exe中
  createfilea 路径\hprsnap.exe (hprsnap.exe offset 00076E9D)
  createfilea 路径\hprsnap.xxx (hprsnap.exe offset 00076E9D)
  createfilea 路径\hprres.dll  (hprsnap.exe offset 00076E9D)
  createfilea 路径\hprres.xxx  (hprsnap.exe offset 00076E9D)

  test.exe中
  createfilea 路径\test.exe (test.exe offset 00076E9D)
  createfilea 路径\test.xxx (test.exe offset 00076E9D)
  随后不久就是nag。

2. wdasm反编译test.exe
* Reference To: KERNEL32.CreateFileA, Ord:0037h
                                  |
:00476E9C    Call dword ptr [00524358]
//smartcheck计算offset与wdasm有少许偏差
:00476EA2    mov esi, eax
:00476EA4    cmp esi, edi
//文件不存在就end,所以要同时伪造test.xxx
:00476EA6    jne 00476EBC

F10一直走,直到开始标准CRC32校验
                |
:0045FD2D    mov al, byte ptr [ebp+edx-00000430]
//自第一个字节开始,顺次取test.exe每个字节,每个字段长度为0x400
:0045FD34    mov ebx, ecx
:0045FD36    and ebx, 000000FF
:0045FD3C    xor eax, ebx
:0045FD3E    shr ecx, 08
:0045FD41    mov eax, dword ptr [4*eax+0056E6F0]
//自0056E6F0,length=0x400,为CRC32密码表
:0045FD48    xor eax, ecx
:0045FD4A    inc edx
:0045FD4B    cmp edx, edi
:0045FD4D    mov dword ptr [esi], eax
:0045FD4F    jl 0045FD29
:0045FD51    mov ebx, dword ptr [ebp+0C]
:0045FD54    mov eax, dword ptr [ebp-18]
:0045FD57    add esi, 00000004
:0045FD5A    dec eax
:0045FD5B    mov dword ptr [ebp-18], eax
:0045FD5E    jne 0045FCF9
:0045FD34    mov ebx, ecx
:0045FD36    and ebx, 000000FF
:0045FD3C    xor eax, ebx
:0045FD3E    shr ecx, 08
:0045FD41    mov eax, dword ptr [4*eax+0056E6F0]
:0045FD48    xor eax, ecx
:0045FD4A    inc edx
:0045FD4B    cmp edx, edi
:0045FD4D    mov dword ptr [esi], eax
//每个字段的CRC值依次保存在dword ptr [esi], ,长度为文件大小除以0*400
:0045FD4F    jl 0045FD29
:0045FD51    mov ebx, dword ptr [ebp+0C]
:0045FD54    mov eax, dword ptr [ebp-18]
:0045FD57    add esi, 00000004
:0045FD5A    dec eax
:0045FD5B    mov dword ptr [ebp-18], eax
:0045FD5E    jne 0045FCF9

再来,看看以后对CRC校验表作什么
bpm dword ptr [esi]  (参照:0045FD4D    mov dword ptr [esi], eax处)
中断于:004537B0    mov ecx, ebx处,
由此开始进行第二次计算,也不知道是如何作的,hash?

3.从:004537B0    mov ecx, ebx那里用F12出来,随后就是F10一直走,比较hprsnap.exe与test.exe运行的不同,关键在
:0045FF04    call 004C71A7
:0045FF09    add esp, 0000000C
//hprsnap.exe: EAX==0
//test.exe:    EAX==FFFFFF68

以EAX值为旗帜,层层深入
:004C7301      call 004C6F82  <== F8

  :004C7088      call [eax+54]  <== F8

    :00445B76      call 004463D8
    :00445B7B      pop ecx
    :00445B7C      test eax, eax  <-- EAX=0, CRC正确
    :00445B7E      pop ecx
    :00445B7F      je 00445B91    <-- je==> jmp, job done.
    :00445B81      xor eax, eax
    :00445B83      cmp dword ptr [ebp-04], eax
    :00445B86      jne 00445B93
    :00445B88      mov [ebp-04], FFFFFF66
    <--否则最后赋值EAX=FFFFFF66,这就是随便改跳转导致“程序非法操作”的原因

    如果愿意进入:00445B76    call 004463D8看看,最后就是
    :00446435      mov edx, dword ptr [esi+ecx]
    :00446438      mov ebx, dword ptr [ecx]
    :0044643A      cmp edx, ebx
    <--一切归根到比较两组长度为0x14的hash值。

4.总结
  改:00445B7F  7410    je  00445B91
  为          EB10    jmp 00445B91

end.

FROM CCG