• 标 题:易语言3.5很暗的暗桩分析:)
  • 作 者:linson
  • 时 间:2003年11月08日 10:36
  • 链 接:http://bbs.pediy.com

这个程序很多人破解不成功其实是因为它发现你修改了他 :lol: 
作者的方法是检测程序运行后代码段校验和是否为作者预先设置好的,不是就无声无息的编译垃圾出来:twisted:这个是他的发现你修改它代码的代码(有点绕口),可以通过构造数据(CRC)或者爆破掉这个桩子。
同时很佩服作者呀 :wink: 
.text:004BDD50 ; 内存代码段校验
.text:004BDD50 
.text:004BDD50 MemoryCodeCheck proc near               ; CODE XREF: .text:00454AA6p
.text:004BDD50                 push    ebx
.text:004BDD51                 push    ebp
.text:004BDD52                 mov     ebpecx
.text:004BDD54                 push    esi
.text:004BDD55                 push    edi
.text:004BDD56                 push    4               ; DataSize = 0x4(DWORD)
.text:004BDD58                 mov     edi, [ebp+68h]  ; ImageBase -> EDI
.text:004BDD5B                 push    edi             ; DataAddress = 0x00400000
.text:004BDD5C                 call    ds:IsBadReadPtr ; IsBadReadPtr
.text:004BDD62                 test    eaxeax
.text:004BDD64                 jnz     short loc_4BDDC5 ; IsBadReadPtr返回不为0直接返回
.text:004BDD66                 mov     eax, [edi+3Ch]  ; DOS Stub -> EAX
.text:004BDD69                 xor     ecxecx
.text:004BDD6B                 add     eaxedi        ; PE Header -> EAX
.text:004BDD6D                 mov     ebx, dword_533C88 ; 预设校验和 -> EBX
.text:004BDD73                 xor     esiesi
.text:004BDD75                 mov     cx, [eax+14h]   ; File Header -> CX
.text:004BDD79                 lea     edx, [ecx+eax+18h] ; Section Name -> EDX
.text:004BDD7D                 xor     ecxecx
.text:004BDD7F                 mov     cx, [eax+6]     ; NumberOfSections -> CX
.text:004BDD83                 test    ecxecx
.text:004BDD85                 jle     short loc_4BDDC5 ; NumberOfSections不大于0直接返回
.text:004BDD87                 mov     eax, 20000000h  ; 0x20000000 -> EAX
.text:004BDD8C 
.text:004BDD8C loc_4BDD8C:                             ; CODE XREF: MemoryCodeCheck+47j
.text:004BDD8C                 test    [edx+24h], eax
.text:004BDD8F                 jnz     short loc_4BDD9E ; Characteristics不为0x20000000则为代码段
.text:004BDD8F                                         ; 跳到校验部分
.text:004BDD91                 add     edx, 28h
.text:004BDD94                 inc     esi             ; 计数器自加
.text:004BDD95                 cmp     esiecx        ; 没有取完节循环
.text:004BDD97                 jl      short loc_4BDD8C
.text:004BDD99                 pop     edi             ; 没有找到代码段返回
.text:004BDD9A                 pop     esi
.text:004BDD9B                 pop     ebp
.text:004BDD9C                 pop     ebx
.text:004BDD9D                 retn
.text:004BDD9E ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:004BDD9E 
.text:004BDD9E loc_4BDD9E:                             ; CODE XREF: MemoryCodeCheck+3Fj
.text:004BDD9E                 mov     ecx, [edx+0Ch]
.text:004BDDA1                 mov     eax, [edx+8]
.text:004BDDA4                 add     ecxedi
.text:004BDDA6                 push    eax
.text:004BDDA7                 push    ecx
.text:004BDDA8                 call    CRC32_hash      ; 进行循环冗余校验
.text:004BDDAD                 mov     edx, [ebp+674h]
.text:004BDDB3                 add     esp, 8          ; 清理堆栈
.text:004BDDB6                 cmp     eax, [ebx+edx*4] ; 比较内存代码校验和与预设的是否符合
.text:004BDDB9                 jz      short loc_4BDDC5 ; 胜利
.text:004BDDBB                 or      dword ptr [ebp+77Ch], 938Fh ; 往下就不好玩了:(
.text:004BDDC5 
.text:004BDDC5 loc_4BDDC5:                             ; CODE XREF: MemoryCodeCheck+14j
.text:004BDDC5                                         ; MemoryCodeCheck+35j ...
.text:004BDDC5                 pop     edi
.text:004BDDC6                 pop     esi
.text:004BDDC7                 pop     ebp
.text:004BDDC8                 pop     ebx
.text:004BDDC9                 retn
.text:004BDDC9 MemoryCodeCheck endp
---
written by linson