【文章标题】关于E语言写的使用硬盘序列号加密的程序通用切入点
【文章作者】hcbajiao(蓝雨[PCG])
【作者主页】http://www.9ycn.com
【作者邮箱】bj_008@163.com
【所属组织】[PCG],http://poje.kmip.net:81QQ群成员
【软件名称】冒险岛加强外挂
【使用工具】OD,PEID
【软件限制】注册码
【破解平台】win xp sp2
【保护方式】UPX,Aspack
【开发语言】易语言
【本文写于】2005-04-27
【文章声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)

—————————————————————————————————
【破解分析】

先用PEID查有壳,ASPack 2.12 -> Alexey Solodovnikov [Overlay],载入OD,手动解决,
430001  pushad                        OD载入程序停在这里
430002  call 冒险岛加.0043000A        F7追入
430007  jmp 45A004F7
43000C  push ebp
43000D  retn
到这里
43000A  pop ebp
43000B  inc ebp
43000C  push ebp
43000D  retn                          返回
到这里
430008  jmp short 冒险岛加.0043000E
43000A  pop ebp
43000B  inc ebp
43000C  push ebp
43000D  retn
43000E  call 冒险岛加.00430014         F7追入
430013  jmp short 冒险岛加.00430072
430015  mov ebx,-13
到这里
430014  pop ebp
430015  mov ebx,-13
43001A  add ebx,ebp
43001C  sub ebx,30000
430022  cmp dword ptr ss:[ebp+422],0
430029  mov dword ptr ss:[ebp+422],ebx
43002F  jnz 冒险岛加.0043039A
430035  lea eax,dword ptr ss:[ebp+42E]
43003B  push eax
43003C  call dword ptr ss:[ebp+F4D]
430042  mov dword ptr ss:[ebp+426],eax
430048  mov edi,eax
43004A  lea ebx,dword ptr ss:[ebp+5E]
43004D  push ebx
43004E  push eax
43004F  call dword ptr ss:[ebp+F49]
向下找POPAD指令
在这里
4303AF  popad                        在这里按F4
4303B0  jnz short 冒险岛加.004303BA  
4303B2  mov eax,1
4303B7  retn 0C
4303BA  push 0
4303BF  retn
按F4后指令变成这样
4303AF  popad
4303B0  jnz short 冒险岛加.004303BA   跳
4303B2  mov eax,1
4303B7  retn 0C
4303BA  push 冒险岛加.0042EADF        这里压入第二层壳的入口
4303BF  retn                          返回到第二层壳的入口
第二层壳的入口是这样
42EADF  nop
42EAE0  popad
42EAE1  mov esi,冒险岛加.0041B000
42EAE6  lea edi,dword ptr ds:[esi+FFFE6000]
42EAEC  add word ptr ds:[edi+2E704],5
42EAF5  push edi
42EAF6  or ebp,FFFFFFFF
42EAF9  jmp short 冒险岛加.0042EB0A
向下找PUSHAD指令
在这里
42EC36  pushad                   在这里按F4
42EC37  jmp 冒险岛加.00403831    跳到真正的入口403831
42EC3C  add byte ptr ds:[eax],al
42EC3E  add byte ptr ds:[eax],al
42EC40  add byte ptr ds:[eax],al
42EC42  add byte ptr ds:[eax],al
42EC44  add byte ptr ds:[eax],al
真正的入口代码是这样
403831  push ebp                  停在这里,现在用LOADPE选完全脱壳DUMP内存中的文件
403832  mov ebp,esp
403834  push -1
403836  push 冒险岛加.004062F0
40383B  push 冒险岛加.00404CA4
403840  mov eax,dword ptr fs:[0]
403846  push eax
403847  mov dword ptr fs:[0],esp
40384E  sub esp,58
403851  push ebx
403852  push esi
403853  push edi
403854  mov dword ptr ss:[ebp-18],esp
DUMP好文件然后用ImportREC修复导入表
OEP填00003831
这样就脱掉了,但是脱壳的过程中源文件的覆盖数据被丢弃了,要补回去,不然程序不能运行!
用HEXWORKSHOP将源文件物理地址15800后的数据全部拷贝到内存,然后贴到脱壳后文件的最后就可以了!
OD重新载入,F9运行,ALT+E,找到这个可执行模块,项目 5
 基数=00E50000
 大小=00116000 (1138688.)
 入口=00EE96B4 krnln.<ModuleEntryPoint>
 名称=krnln
 文件版本=1, 0, 0, 1
 路径=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\E_80003\krnln.fnr
双击,使用OD插件 Ultra string Reference的Find ASCII功能,找到\\.\PhysicalDrive0双击,到这里:
E5DC46   68 CC7FF200    push krnln.00F27FCC           ; ASCII "\\.\PhysicalDrive0"
E5DC4B   FF15 00D4F000  call dword ptr ds:[<&KERNEL32.Create>; kernel32.CreateFileA
E5DC51   8BF0           mov esi,eax
E5DC53   83FE FF        cmp esi,-1
E5DC56   0F84 C0000000  je krnln.00E5DD1C
E5DC5C   57             push edi
E5DC5D   B9 06000000    mov ecx,6
E5DC62   33C0           xor eax,eax
E5DC64   8D7C24 14      lea edi,dword ptr ss:[esp+14]
在1000DC46上按F2下断
现在关闭外挂程序,重新载入
F9运行程序后,断在这里了
F8走回到主程序里
422F68   83C4 10           add esp,10
422F6B   C745 F0 00000000  mov dword ptr ss:[ebp-10],0
422F72   68 00000000       push 0
422F77   BB C4060000       mov ebx,6C4
422F7C   E8 D2310000       call 冒险岛加.00426153
422F81   83C4 04           add esp,4
422F84   68 01030080       push 80000301
422F89   6A 00             push 0
422F8B   50                push eax
422F8C   68 01000000       push 1
422F91   BB 68010000       mov ebx,168
422F96   E8 B8310000       call 冒险岛加.00426153
422F9B   83C4 10           add esp,10            这里看到机器码:1347656527
422F9E   8945 E8           mov dword ptr ss:[ebp-18],eax
422FA1   68 04000080       push 80000004
422FA6   6A 00             push 0
。。。。。向下走,这里
4236A6   83C4 04           add esp,4
4236A9   8B5D F0           mov ebx,dword ptr ss:[ebp-10]
4236AC   85DB              test ebx,ebx
4236AE   74 09             je short 冒险岛加.004236B9
4236B0   53                push ebx
4236B1   E8 7F2A0000       call 冒险岛加.00426135
4236B6   83C4 04           add esp,4
4236B9   8B45 D8           mov eax,dword ptr ss:[ebp-28]
4236BC   8945 F0           mov dword ptr ss:[ebp-10],eax
4236BF   8B45 F0           mov eax,dword ptr ss:[ebp-10]
4236C2   85C0              test eax,eax
4236C4   74 15             je short 冒险岛加.004236DB
4236C6   50                push eax              这里到看到注册码:DF65CDC2
4236C7   8BD8              mov ebx,eax
4236C9   E8 0AF7FFFF       call 冒险岛加.00422DD8
4236CE   40                inc eax
4236CF   50                push eax
4236D0   E8 8A2A0000       call 冒险岛加.0042615F
内存注册机:
地址:4236C6
次数:1
第一字节:50
指令长度:1
内存方式寄存器EAX
完工

—————————————————————————————————
【总结】

这个方法对E语言写的使用硬盘序列号加密的程序应该有通用性。
好了,就写到这里,大家一起多研究研究。。。。。。
—————————————————————————————————
【版权说明】本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!

特此感谢Phoenix及PCG成员的帮助和支持   

附软件原版可以自己试试
地址:http://www.9ycn.com/attachment.php?...&download=1