利用ESP定手动律脱UPX0.89.6-1.02/1.05-1.24壳实例
- 时间:2015年04月02日 15:14:50 来源:魔法猪系统重装大师官网 人气:19270
利用ESP定律不仅使得脱压缩壳变得非常简单,而且可以应付不少加密壳。
简单地说,ESP定律就是利用了堆栈平衡的原理。
可以把壳假设为一个子程序,当壳把代码解压前和解压后,必须要做的是遵循堆栈平衡的原理。
让ESP执行到OEP时,使ESP和壳初始入栈时的ESP相一致。
ESP定律的使用方法:载入加壳程序,当ESP中的值第一次改变时记下这个值。
对这个值下的硬件访问断点,运行程序后,一般的压缩壳都会停在待转向OEP的那条语句上。
利用ESP定律脱 UPX 0.89.6 - 1.02 / 1.05 - 1.24 壳实例
1.OllyDbg打开加了UPX壳的Crackme.exe
地址 HEX数据 反汇编 注释
00457B40 60 PUSHAD 程序的入口点
寄存器 ( FFU )
EAX 00000000
ECX 0012FFB0
EDX 7C92EB94 ntdll.KiFastSystemCallRet
EBX 7FFDD000
ESP 0012FFC4
EBP 0012FFF0
ESI FFFFFFFF
EDI 7C930738 ntdll.7C930738
EIP 00457B40 Crackme.<模块入口点>
C 0 ES 0023 32位 0(FFFFFFFF)
P 1 CS 001B 32位 0(FFFFFFFF)
A 0 SS 0023 32位 0(FFFFFFFF)
Z 1 DS 0023 32位 0(FFFFFFFF)
S 0 FS 003B 32位 7FFDF000(FFF)
T 0 GS 0000 NULL
D 0
O 0 LastErr ERROR_SUCCESS (00000000)
EFL 00000246 (NO,NB,E,BE,NS,PE,GE,LE)
ST0 empty -UNORM BCE0 01050104 00000000
ST1 empty 0.0
ST2 empty 0.0
ST3 empty 0.0
ST4 empty 0.0
ST5 empty 0.0
ST6 empty 0.0
ST7 empty 0.0
3 2 1 0 E S P U O Z D I
FST 0000 Cond 0 0 0 0 Err 0 0 0 0 0 0 0 0 (GT)
FCW 027F Prec NEAR,53 掩码 1 1 1 1 1 1
2.按F8键单步运行到第二句
地址 HEX数据 反汇编
00457B41 BE 00B04300 MOV ESI,Crackme.0043B000
发现ESP寄存器中的值发生变化 -- 变为0012FFA4 ( 硬件不同 - 此值可能不相同 )
EAX 00000000
ECX 0012FFB0
EDX 7C92EB94 ntdll.KiFastSystemCallRet
EBX 7FFDD000
ESP 0012FFA4
EBP 0012FFF0
ESI FFFFFFFF
EDI 7C930738 ntdll.7C930738
EIP 00457B41 Crackme.00457B41
C 0 ES 0023 32位 0(FFFFFFFF)
P 1 CS 001B 32位 0(FFFFFFFF)
A 0 SS 0023 32位 0(FFFFFFFF)
Z 1 DS 0023 32位 0(FFFFFFFF)
S 0 FS 003B 32位 7FFDF000(FFF)
T 0 GS 0000 NULL
D 0
O 0 LastErr ERROR_SUCCESS (00000000)
EFL 00000246 (NO,NB,E,BE,NS,PE,GE,LE)
ST0 empty -UNORM BCE0 01050104 00000000
ST1 empty 0.0
ST2 empty 0.0
ST3 empty 0.0
ST4 empty 0.0
ST5 empty 0.0
ST6 empty 0.0
ST7 empty 0.0
3 2 1 0 E S P U O Z D I
FST 0000 Cond 0 0 0 0 Err 0 0 0 0 0 0 0 0 (GT)
FCW 027F Prec NEAR,53 掩码 1 1 1 1 1 1
3.HR 地址 -- 设置硬件访问断点
在命令行输入 hr 0012FFA4
[ Enter... ]
然后按F9键调用程序运行,
可以发现已经来到了 00457C65 - E9 D295FAFF JMP Crackme.0040123C 地址处,
这正好是跳向OEP的那条指令Jmp语句,
再按F8键跳向0040123C地址处。
4:对其右键,选择“用OllyDump脱壳调试进程”,
起始地址一般都是400000,文件大小自动识别即可。
入口点地址也自动定位到了程序OEP的偏移地址123C处,
代码起始RVA和数据起始也按默认识别的就可以。
5:勾选下面的重建输入表,OllyDump会自动修复引入表。
一般选择方式1,如果方式1脱壳后修复的效果不理想,可以尝试方式2,
不过最好还是用专业的 Import REConstructor 修复最好。
6:单击“脱壳”按钮
用PEiD扫描一下,检测到程序是用 Microsoft Visual Basic 5.0 / 6.0 编写的。
[ Finish... ]
可以看出,ESP定律的效果是非常明显的,
熟练掌握ESP定律对于手动脱壳是非常有用的。