【文章标题】E语言+hying's PE-Armor壳程序的爆破
【文章作者】Ptero
【作者邮箱】thestral@sina.com
【软件名称】大头贴制作系统
【使用工具】OD,PEID,,LordPE,ImportIAT,UltraEdit,KeyMake
【软件限制】Nag,功能限制
【破解平台】win xp sp2
【保护方式】hying's PE-Armor 0.7x
【开发语言】易语言
【本文写于】2006-03-12
【文章声明】hying's PE-Armor和易语言我都是首次接触,写一篇破解笔记

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

先用PEiD查壳, Excalibur 1.03 -> forgot [Overlay] *

看入口点:

0073D09D > /E9 00000000     jmp 大头贴制.0073D0A2
0073D0A2   \60              pushad
0073D0A3    E8 14000000     call 大头贴制.0073D0BC

0073D0BC    58              pop eax
0073D0BD    61              popad
0073D0BE  ^ E9 0E00FFFF     jmp 大头贴制.0072D0D1

到这里,和 Excalibur 1.03 一模一样, 再往下就露出狐狸尾巴来了:

0072D0D1    60              pushad                      ; 这个是旧版hying壳的
0072D0D2    E8 00000000     call 大头贴制.0072D0D7      ; 典型入口,新版伪装成了
0072D0D7    5D              pop ebp                     ; Excalibur
0072D0D8    81ED D7000000   sub ebp, 0D7
0072D0DE    8DB5 EE000000   lea esi, [ebp+EE]
0072D0E4    55              push ebp
0072D0E5    56              push esi
0072D0E6    81C5 FD010000   add ebp, 1FD
0072D0EC    55              push ebp
0072D0ED    C3              retn

把EP改为32D0D1, 绕过那个伪装的头部,再用PEiD查: hying's PE-Armor V0.7X -> hying [Overlay] *
哈哈,查出来了!

不过改了EP后程序运行后自动退出, 看来是有自校检. 还是先脱壳吧.

第一次接触 hying's PE-Armor, 感觉像恶梦一样, 这个壳的anti功能极强, 是个考验耐心的累活.
这里就不细说了, 有兴趣的情参考几位斑竹的文章.

手动脱在短时间内是没指望了, 用 forgot 的 romra755 脱掉. 可是在修复输入表的时候遇到了难题,
ImportIAT 说入口点无效. 我只能手动一个区段一个区段地查找IAT, 好在这个程序的IAT不多, 只有
kernel32和user32中的几个.

修复后运行说是 Invalid PE, 还要用 LordPE 的 RebuildPE 功能.

再用PEiD查: Microsoft Visual C++ 6.0 [Overlay]
当时看到这个就放心了, 但事后证明, 如果在这里放心那就完了.

修复、重建后的dumped_.exe运行后提示非法数据, 用OD跟跟看.
从入口到WinMain()的代码几乎和VC++一样(难怪PEiD又被骗了一次).
进入WinMain()以后, 看看调用了哪些API吧:

GetModuleFileNameA
CreateFileNameA
SetFilePointer
ReadFile
GetTempPath
wsprintfA
CreateDirectoryA
WriteFile
CloseHandle
LoadLibrary
GetProcAddress
MessageBoxA

这就是全部的API调用, 连创建窗口的函数都没有. 而且这个程序还把文件解压到temp文件夹来加载.
脱壳后的文件末尾没有这些附加数据, 要从原文件的0x28E800(这个值可以看section算出来)处至文件末

尾的字节全部附加到dumped_.exe末尾.
用OD跟出加载的文件是krnln.fnr(UPX壳). (后来才知道这是易语言的标志)

当运行到这里时:

004014DA  |$  810424 267B0000 add dword ptr [esp], 7B26
004014E1  |.  FFD0            call near eax                 ;  从这里真正进入易语言的领空

esp指向一个字符串 "WTNE / MADE BY E COMPILER - WUTAO " 看到这个我才知道这是易语言

在看雪精华中看了易语言的破文, 依葫芦画瓢地在OD中搜字符串, 结果失败了. 难道是脱壳不干净?

因为有自校检, 脱壳后到程序不能运行, 只能静态分析了.

这个程序是KeyFile的注册方法, 不能跟踪的话就没法得出算法, 只得爆破了.

程序启动时会弹出一个Nag, 大意是没注册有功能限制.

在UltraEdit中搜"您正在使用的是未注册的版本", 在 Offset 0x29493处.
在OD中按 Ctrl+B 搜索 93 94 42 00, 在 006D3A31处(这个是动态解码的)

006D3A98   > \E8 E2BDFDFF     call dumped_.006AF87F         ; 关键call
006D3A9D   .  8945 FC         mov [ebp-4], eax              ; eax≠0 就行了
006D3AA0   .  F9              stc
006D3AA1   .  72 01           jb short dumped_.006D3AA4
006D3AA3      80              db 80                         ; 花指令
006D3AA4   .  837D FC 00      cmp dword ptr [ebp-4], 0
006D3AA8   .  0F85 3D000000   jnz dumped_.006D3AEB          ; 这里可以跳过Nag
006D3AAE   .  F9              stc
006D3AAF   .  72 01           jb short dumped_.006D3AB2
006D3AB1      B5              db B5                         ; 花指令
006D3AB2   .  68 04000080     push 80000004
006D3AB7   .  6A 00           push 0
006D3AB9   .  68 79944200     push dumped_.00429479
006D3ABE   .  68 01030080     push 80000301
006D3AC3   .  6A 00           push 0
006D3AC5   .  68 00000000     push 0
006D3ACA   .  68 04000080     push 80000004
006D3ACF   .  6A 00           push 0
006D3AD1   .  68 93944200     push dumped_.00429493         ; 这里指向我们搜索的字符串
006D3AD6   .  68 03000000     push 3
006D3ADB   .  BB 00030000     mov ebx, 300
006D3AE0   .  EB 01           jmp short dumped_.006D3AE3
006D3AE2      0F              db 0F                         ; 花指令
006D3AE3   >  E8 A98E0200     call dumped_.006FC991
006D3AE8   .  83C4 28         add esp, 28
006D3AEB   >  E8 00000000     call dumped_.006D3AF0

006D3AA8处的jnz可以改为jmp爆掉, 但这是治标不治本的方法.
我们只要让006AF87F这个call返回1就行了. 跟进:

…………………………
…………………………
006AF97E  |> \837D F4 00      cmp [local.3], 0              ; 很经典的cmp+je/jne模式
006AF982  |.  0F84 12000000   je dumped_.006AF99A           ; 这里nop掉就OK了
006AF988  |.  EB 01           jmp short dumped_.006AF98B
006AF98A  |   70              db 70                         ; 花指令
006AF98B  |>  B8 01000000     mov eax, 1
006AF990  \.  E9 12000000     jmp dumped_.006AF9A7
006AF995   .  E9 0D000000     jmp dumped_.006AF9A7
006AF99A  />  EB 01           jmp short dumped_.006AF99D
006AF99C  |   0F              db 0F                         ; 花指令
006AF99D  |>  B8 00000000     mov eax, 0
006AF9A2  |.  E9 00000000     jmp dumped_.006AF9A7
006AF9A7  |>  8BE5            mov esp, ebp
006AF9A9  |.  5D              pop ebp
006AF9AA  \.  C3              ret

最后, 因为脱壳的文件不能运行, 只能做内存补丁了.
在KeyMake中将006AF982处的0F8412000000改为909090909090就OK了.
运行补丁, 原程序所有的功能限制解除! Nag窗口也不见了!

【总结】
1. hying's PE-Armor的花指令和anti crack让我佩服, 也让我心寒.
2. 易语言很好地伪装成VC++, 差点被骗了.
3. 易语言的代码有小花, 影响破解速度. 对付易语言, 动静结合的分析尤为重要.