ximo 发表于 2008-12-24 19:50

PESpin1.32学习笔记之API Redirection的处理

引:
“一个有信念者所开发出的力量,大于99个只有兴趣者”

本文章主要讲述PESpin1.32的API Redirection的处理方法,加壳选项如图:



而试炼品依然为98记事本.

OD载入程序,F8单步2次后,即可使用ESP定律法



下完硬件断点后,SHIFT+F9运行,来到下面的地方。(为了方便后面的调试,ESP处的硬件断点暂时不要删除!)



接下来F8单步走,即可来到OEP!



OEP:


来到OEP后,很明显的发现,API被重定位了。
众所周知,98记事本是个VC++的程序,当然,从入口代码来看,也很显然是VC++的入口点。
随便找个VC++的程序,即可知道,代码:
004010D3    FF15 E80E4100      call dword ptr ds:

处应该调用一个系统API函数。而具体为什么函数,也可以靠经验去猜测。

当然,也可以这么看,跟入这个CALL,去看下里面的东西:

跟随后可以发现下面的代码:



其实,有经验的朋友一眼就能发现,此API函数即为GetCommandLineA
当然,此试炼品为98记事本,找未加壳的程序比对下:
004010D3   
FF15 E0634000      call dword ptr ds:[<&KERNEL32.GetCommandLineA>]    ; kernel32.GetCommandLineA

也可知,此API函数为GetCommandLineA

好,知道了此函数,就方便了我们的调试
CTRL+F2,重新载入程序
在数据窗口处CTRL+G,输入GetCommandLineA



然后,下硬件访问断点



下完断点后,SHIFT+F9运行,5次后,取消该硬件断点



然后F8结合F7一路走,直到来到代码
mov dword ptr ds:,eax的地方



而此处,即为最佳的patch代码的地方!

由于离OEP最近的哪个API不一定是RVA的起始位置,为了把所有的API都处理,故在此处先下个硬件执行断点,接着CTRL+F2重新载入程序,接着SHIFT+F9,再次来到这个最佳地点!
来到后,我们找块空地,patch代码
我们可以用隐藏OD的插件来申请一段空地



申请的新空间的地址为00930000



然后先记录下patch地址处的原始代码:
0040D18A    8907               mov dword ptr ds:,eax            ;
0040D18C    EB 02                jmp short NotePad_.0040D190

二进制代码为:
89 07 EB 02

然后,把0040D18A处的代码修改为
Jmp 00930000

然后来到00930000处patch我们的代码
具体的代码为什么,我们来看堆栈处:
在堆栈的EIP的所在处往上找



可以发现,出现了SHELL32这个系统DLL,那具体的偏移地址为多少呢?我们可以双击EIP处的地址栏,就会出现以EIP处为原点的偏移值



由于堆栈所指向的值为ESP的值,故此处应为ESP-3C
而下面一行ESP-38的值为偏移大小
也就是说,真正的地址为
Address=-
以此函数为例,真正的地址=7D6110D7-0000000F=7D6110C8

所以patch如下代码:

mov eax,
sub eax,

接着就输入刚才记下的原始代码:
mov dword ptr ds:,eax
jmp 0040D190
全部二进制代码如下:
8B 44 24 C4 2B 44 24 C8 89 07 E9 81 D1 AD FF
Patch完代码后,在第一行下F2断点,接着SHIFT+F9运行
断下后,F8,2次后,即可在寄存器窗口的EAX值处看到正确的API函数了





OK,被重定位的API全部回来了,好极了!下面就取消所有除了原始的ESP处的那个断点,
SHIFT+F9运行,中断后,F8单步走,即可顺利来到OEP了!
而此时可以发现,OEP处,所以的API都回来了



哈,下面就可以dump程序了。
然后用Import REC修复
修复时可能会出现下面的问题
输入OEP的值10CC后,会出现下面的错误



可以用下面的方法来解决。
右键----高级命令------获取API调用,然后按确定就OK



按确定后,会发现,所有的IAT都出来,而且全部有效



最后就是转存修复了。当然也得注意2个问题
(1)        别忘了把OEP处的值修正为10CC
(2)        改下Import-REC的选项,如下图



最后,转存修复!然后程序就能正常运行了!



脱壳过程到此结束!

总结一下:脱壳的过程并不难,关键是如何定位和找到最佳的patch地点,以及如何自己patch代码,由此可见,汇编基础的重要性!应验了某大牛的一句话:不会汇编的人,学脱壳破解永远是菜鸟。同时,也要注意下Import-REC的几个使用下技巧!

引:
今日复今日,今日何其少!今日又不为,此事何时了!人生百年几今日,今日不为真可惜!若言姑待明朝至,明朝又有明朝事。为君聊赋今日诗,努力请从今日始。
------文嘉《今日诗》

珍惜时间,珍爱生命,努力学习,努力拼搏!

作者:ximo

[ 本帖最后由 ximo 于 2008-12-24 19:51 编辑 ]

小生我怕怕 发表于 2008-12-24 20:03

支持超兄的教程!

什么也不是 发表于 2008-12-24 20:09


膜拜大牛 还是喜欢你的视频教程 看起来让人更懂

creantan 发表于 2008-12-24 20:17

学习学习。。。。。。



今日复今日,今日何其少!今日又不为,此事何时了!人生百年几今日,今日不为真可惜!若言姑待明朝至,明朝又有明朝事。为君聊赋今日诗,努力请从今日始。

zzage 发表于 2008-12-24 20:28

终于发出来了...
超神~

tianxj 发表于 2008-12-24 20:58

偶像,出个录像吧

傻人有傻福 发表于 2008-12-24 21:13

徐老师就是强啊o(∩_∩)o

520crack 发表于 2008-12-25 00:50

学习啊:handshake

wgz001 发表于 2008-12-25 02:24

“路漫漫其修远兮,我将上下而求索”
膜拜了 :loveliness:

w3700473 发表于 2008-12-25 13:58

视频看不了 55555555
页: [1] 2 3 4 5 6 7 8
查看完整版本: PESpin1.32学习笔记之API Redirection的处理