【文章标题】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. 易语言的代码有小花, 影响破解速度. 对付易语言, 动静结合的分析尤为重要.
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)