WinUPacK 通用快脱方法二则
【文章作者】: XuZhenG【作者邮箱】: xuzheng1111@126.com
【作者主页】: http://hi.baidu.com/xuzheng1111
http://xz.bee.pl
【软件名称】: 恕在下保护作者利益不公布了
【下载地址】: 自己到天草教程中复制
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
如有人将此用入商业用途,给作者造成损失本人概不负责。
--------------------------------------------------------------------------------
【详细过程】
哈哈,因为快要没时间弄逆向了,所以这次写得比较详细
加上了吾爱破解的字样
用ESP应该可以脱哈,而且我以前也脱过从来没有出现过问题...
这次天草 按道理来说不会出现这样的失误,没想到用ESP脱...
可能程序确实不能用ESP,可我还是不信,就复制出来试了试...
里面有两个程序,一个能用一个不能用,很奇怪哈...
我们来开始看看,我这里有三个程序都是加的这个壳,两个能用 ESP 另一个很奇怪 ESP断点拦不住...
天草是用单步法脱壳的,本人比较喜欢投机取巧,找个简单方法...
先研究两个可以ESP脱的壳...
00401018 > BE B0114000 mov esi, 004011B0
0040101D AD lods dword ptr
0040101E 50 push eax
0040101F FF76 34 push dword ptr ; 这里用ESP定律可以直接到OEP
00401022 EB 7C jmp short 004010A0
入口点是这样的,正如上面的注释,两个程序都是可以用ESP到达OEP...
而最后一个很怪,不仅不可以用上面的那种ESP定律,
而且按天草单步法到OEP后 代码也很奇怪,不知道是什么IDE写的(我判断肯定是C++写的,但不知道是什么IDE,,本人孤陋寡闻哈,高手指教下)...
OD载入那个怪程序...
入口点一样...
00401018 > BE B0114000 mov esi, 004011B0
0040101D AD lods dword ptr
0040101E 50 push eax
0040101F FF76 34 push dword ptr
00401022 EB 7C jmp short 004010A0
所不同的是 到刚才的地方用ESP就会跑飞...
纳闷中... 难道真的不能用ESP吗?
经过本人的摸索,发现其实这个程序也可以用ESP而且这种ESP虽然略为麻烦,可颇具有通用性,这里给大家介绍下...
单步到第五句... 就是
00401022 EB 7C jmp short 004010A0
然后dd esp下断,F9就到了这里哈(三个程序都可以,停在同一个位置)...
0040ACD2 46 inc esi ; 断在这里...
0040ACD3 AD lods dword ptr
0040ACD4 85C0 test eax, eax
0040ACD6 74 1F je short 0040ACF7
0040ACD8 51 push ecx
0040ACD9 56 push esi
0040ACDA 97 xchg eax, edi
0040ACDB FFD1 call ecx
0040ACDD 93 xchg eax, ebx
0040ACDE AC lods byte ptr
0040ACDF 84C0 test al, al
0040ACE1 ^ 75 FB jnz short 0040ACDE
0040ACE3 3806 cmp byte ptr , al
0040ACE5 ^ 74 EA je short 0040ACD1
0040ACE7 8BC6 mov eax, esi
0040ACE9 79 05 jns short 0040ACF0
0040ACEB 46 inc esi
0040ACEC 33C0 xor eax, eax
0040ACEE 66:AD lods word ptr
0040ACF0 50 push eax
0040ACF1 53 push ebx
0040ACF2 FFD5 call ebp
0040ACF4 AB stos dword ptr es:
0040ACF5 ^ EB E7 jmp short 0040ACDE
0040ACF7 C3 retn
到了这里以后取消所有硬件断点,然后再 40ACF7 就是 RETN那句用 F2下断 F9 停在RETN之后F8 就能看到OEP了
(再看那个很奇怪程序的OEP,用的函数是WindowsAPI 但是RVA的格式又像是VB,入口点更奇怪... PEiD(三种扫描)和fi都查不出是什么语言写的,高手可以指教下...)
00403C54 68 703C4000 push 00403C70
00403C59 68 3E124000 push 0040123E
00403C5E 6A 00 push 0
00403C60 FF15 30504000 call dword ptr ; kernel32.GetModuleHandleA
00403C66 A3 F04B4000 mov dword ptr , eax
00403C6B ^ E9 98FFFFFF jmp 00403C08
00403C70 50 push eax
00403C71 50 push eax
00403C72 FF35 34504000 push dword ptr ; kernel32.ExitProcess
00403C78 ^ E9 77FFFFFF jmp 00403BF4
虽然略为繁琐,其实利用的是壳对 LoadLibrary的访问 断下来的,只要不是变态的人修改了壳代码,这个方法就可以通用哈。
直接停留在OEP的断点有时就不保险,有时程序并不在开头就访问第4句里的ESP的内容,那你下断点就断不下来...
所以当你在第4句用ESP行不通时,就可以试试这种方法
第二部分 关于WinUPacK 0.39 final 更快脱壳方法的探讨...
看上面的跳转到OEP的代码用的是RETN 就是返回到堆栈中的最顶端的地址,那么这个地址是什么时候被压入堆栈的呢?
重新进入入口点
00401018 > BE B0114000 mov esi, 004011B0
0040101D AD lods dword ptr
0040101E 50 push eax ;单步到这句...
0040101F FF76 34 push dword ptr
00401022 EB 7C jmp short 004010A0
此时在寄存器窗口中右击 EAX的数值 点 在反汇编窗口中跟随
停在一个空区域哈
00403C54 0000 add byte ptr , al
00403C56 0000 add byte ptr , al
00403C58 0000 add byte ptr , al
00403C5A 0000 add byte ptr , al
00403C5C 0000 add byte ptr , al
00403C5E 0000 add byte ptr , al
00403C60 0000 add byte ptr , al
00403C62 0000 add byte ptr , al
没关系 ,我们在这句话下硬件执行断点(新手可以想想为什么F2断点不可以呢?)
然后F9执行就可以到看到...
那么为什么要单步到第三句呢? 因为最后返回到OEP的RETN的地址就是由第三句的 push eax压入的...
这是目前为止比较通用的方法了,因为利用的是壳的特征,跟程序本身的特征没有关系,程序的流程对此没有影响。
所以这种方法应该也是具有较高的通用性了,速度也很快哈...
第一部分 关于一般常用的ESP定律快脱法缺陷的探讨...
今天 看了天草的WinUPack 0.39 final 脱法 很奇怪哈...
这个壳按道理来说是个简单壳,其简单程度不亚于ASPacK 2.12 UPX等... 高手迅速飘过...
(斑竹如果觉得好可以加*华 呵呵~~~) 这壳很简单的。
加条件断点的方法。很简单脱掉
天草的教程满好的 其实我个人绝得断点的方法是最快的,就看个人运用如何! 下条件断点最快的!!! 天草都说是奇怪的OEP了 我们没技术 不敢讨论```` 下载学习 想大牛学习哈 看不明白,只想脱壳而已 学习学习~~~~~~看到一个软件用这壳不知道怎么破正好
页:
[1]