手脱Polycrypt PE 2.1.5
或许,这该是我在52发的最后个教程了,大四了,该为今后的工作和生活打算一下了,毕竟,脱壳破解当不了什么职业.不过,有空的话,我还是会写写什么学习心得,脱壳破解的文章的.
手脱Polycrypt PE 2.1.5一:简单的脱壳法
Polycrypt PE 2.1.5是个很老的壳了,说来惭愧,最近才看到这壳,于是拿来试炼了下,幸好是个软柿子,于是,写个笔记,供大家交流学习.
首先看下加壳选项:
除了Use File Locking,几乎是加了所有保护了
下面开始简单的脱壳吧(至于完美的脱壳法,下一讲再具体讲).
OD载入后,会出现一个错误的提示,不用管它,直接点确定就行了.异常设置为忽略所有异常,隐藏下OD
看到这个载入代码,大家就很容易想到用ESP定律了
(我说过,尽量不要用ESP定律去脱壳,虽然ESP定律很方便,但是会错过好多可以学习的东西.再者,在52pojie论坛里也看到了几个不能版本的脱壳方法,虽然没用ESP定律了,但是,我觉得都没有好好的去分析壳,因此,没多大意义.由于此讲只是简单的脱壳法,因此我还是用ESP定律来进行脱壳)
0040D00D >60pushad
0040D00EE8 EDFFFFFF call unpackme.0040D000 //单步到这里后,就可以用ESP定律了
0040D013^ EB 80 jmp short unpackme.0040CF95
0040D015F5cmc
0040D0163E:F5 cmc
0040D018A0 50F53891 mov al,byte ptr ds:
0040D01D4Cdec esp
0040D01E15 4CF54258 adc eax,5842F54C
0040D023F5cmc
hr ESP,SHIFT+F9,来到下面的地方(OD可能会很卡)
这时候应该很明显了吧,已经把OEP的地址给压栈了,F8单步2次,就可以来到OEP了.
然后打开LordPE,完整转存下来吧
接着就修复.用I-REC
不过,发现有2个无效的指针,无论用等级1,等级3,都无法进行修复.
没办法,只有手动查找了
PS:不过有个简单的方法,那就是把无效的指针给删除,而不是我们一般所使用的剪切,就可以正常修复成功了!
下面就手动查找吧!
在I-REC中记下无效地址为:6394,而加上基址就是00406394
OD重新载入程序,然后在命令窗口输入
dd 00406394
接着下硬件写入断点
F9运行多次,注意在寄存机窗口观察
5次后,看寄存器
哈哈,找到了吧,这个指针就是GetModuleHandleA吧
另外一个也用同样的方法跟
另外一个就是CreateFileA
接着就手动输入2个指针,转存修复一下吧,程序正常运行!
至此,简单脱壳方法到此结束!
其实这个壳跟ORiEN非常类似,大家可以同样去试炼一下,附件中是主程序+试炼品 手脱Polycrypt PE 2.1.5二:全保护的完美脱壳法
现在来讲下完美处理这个壳的方法.
既然是完美来脱,我就加上全部的保护方式
这样,前面的脱壳方法就会失效.出现的异常情况我们可以来看一下
载入后的代码没发生任何改变,同样使用ESP定律.也同样来到OEP
哈哈,可别高兴的太早!不要以为到了OEP就大事告生了,好戏还在后头呢!
打开I-REC,载入所要脱壳的进程,就傻眼了,哈~
晕,原来PE头被壳给毁掉了,还真够狠啊,汗,没办法,从头来,只能重开头进行分析了.
CTRL+F2,重新载入程序
F8单步走2次
在retn处F2下断,接着SHIFT+F9,然后取消断点,F7跟进,来到下面的地方
在下面的NOP处F2下断,SHIFT+F9,取消断点.
这时候可以发现,上面的代码全为空代码了,下面的代码也开始解码了,非常好!
接下来,就开始处理有些垃圾东西了.
其实,好多人都会说脱这个壳时候很卡,也都知道是CC(int 3)异常引起的,但为什么没人去处理这些垃圾呢?汗,想不明白...
来查找下面形式的垃圾代码:
retn
int 3
lea XXXXXXXX
可以直接这么查找:
CTRL+B,查找 C3 CC 8D 85
找到后,把int 3命令给NOP掉,因为是垃圾东西
接着找
CTRL+B,查找66 C7 42 06 FF FF
把下面的4个mov语句全NOP掉,顺手把下面的rep stos byte ptr es:也给NOP掉
理由,仍然是因为都是垃圾语句,只会让程序出现异常或机器卡
接着,继续查找垃圾
push0
push0
push4
push0
push0
push80000000
或者CTRL+B 查找6A 00 6A 00 6A 04 6A 00 6A 00 68 00 00 00 80
把第一个push 0的2个字节改为EB 19
目的是为了跳开createfile
接着,CTRL+G,输入GetModuleHandleA
查找到后,F2下断
F9运行2次后,取消断点,ALT+F9返回
继续处理垃圾,把所看到的int 3语句都给NOP,一共有4个
下面来处理IAT的加密,上讲也已经看到,有2个指针被加密了.
CTRL+B 查找80 BD ?? ?? ?? ?? 01 75 5E
(至于原理,下讲具体讲解下吧)
找到后,把cmp下面的je改为jmp,也就是我们一般叫的magic jump
下面,就直达OEP了.
CTRL+B 查找5D 9D 61 68 ?? ?? ?? ?? C3
或者,F8单步跟下去也一样.
在pop ebp处F2下断,SHIFT+F9,取消断点
可以发现,原来的push 0变化成了push 10cc
很明显,把OEP的地址压入栈了,F8几次后,就到达OEP了!
可以发现,OEP处的代码都是红色的,那所谓了.
再打开I-REC来看一下,一切正常了吧
指针也全部有效了吧
下面,用Lord PE脱壳后,修复一下,就大功告成了!
附件中是试炼程序 手脱Polycrypt PE 2.1.5三;IAT加密的简单分析
本讲只对其IAT加密进行分析,分析下如何查找magic jump
由于只讲解IAT的处理,故我就不加全保护了,对第一讲中的程序直接拿来分析了
首先用ESP定律到达OEP,然后,就查找IAT
找到第一讲中所找到的加密地址00406394
为了便于分析,我们从前面几个指针开始分析吧,比如:00406388
然后,CTRL+F2,重新载入
在数据窗口CTRL+G查找00406388
然后,下硬件写入断点.接着就F9运行
5次F9后,在寄存器中就开始出现IAT了
这时候,我们就取消断点,F8跟吧.
0040D32F8B95 516D4000 mov edx,dword ptr ss://把基址放到EDX中
0040D3358B06mov eax,dword ptr ds:
0040D3370BC0or eax,eax
0040D33975 04 jnz short unpackme.0040D33F
0040D33B8B46 10 mov eax,dword ptr ds:
0040D33ECCint3//NOP
0040D33F03C2add eax,edx
0040D3410385 3D6D4000 add eax,dword ptr ss:
0040D3478B18mov ebx,dword ptr ds:
0040D3498B7E 10 mov edi,dword ptr ds:
0040D34C03FAadd edi,edx
0040D34E03BD 3D6D4000 add edi,dword ptr ss:
0040D35485DBtest ebx,ebx //判断是否处理完IAT,处理完则跳
0040D3560F84 96000000 je unpackme.0040D3F2
0040D35CF7C3 00000080 test ebx,80000000
0040D36275 06 jnz short unpackme.0040D36A
0040D36403DAadd ebx,edx
0040D36683C3 02 add ebx,2
0040D369CCint3//NOP
0040D36A81E3 FFFFFF0F and ebx,0FFFFFFF
0040D37053push ebx//下一个IAT压栈
0040D371FFB5 356D4000 push dword ptr ss:
0040D377FF95 C26E4000 call dword ptr ss://GetProcAddress函数
0040D37D80BD 326E4000 01cmp byte ptr ss:,1//判断是否加密,magic jump
0040D38475 5E jnz short unpackme.0040D3E4
0040D3863B85 0D6C4000 cmp eax,dword ptr ss:
0040D38C75 08 jnz short unpackme.0040D396
0040D38E8D85 40674000 lea eax,dword ptr ss:
0040D394EB 4E jmp short unpackme.0040D3E4
0040D3963B85 1D6C4000 cmp eax,dword ptr ss:
0040D39C75 08 jnz short unpackme.0040D3A6
0040D39E8D85 026A4000 lea eax,dword ptr ss:
0040D3A4EB 3E jmp short unpackme.0040D3E4
0040D3A63B85 ED6B4000 cmp eax,dword ptr ss:
0040D3AC75 08 jnz short unpackme.0040D3B6
0040D3AE8D85 726A4000 lea eax,dword ptr ss:
0040D3B4EB 2E jmp short unpackme.0040D3E4
0040D3B63B85 D16B4000 cmp eax,dword ptr ss:
0040D3BC75 08 jnz short unpackme.0040D3C6
0040D3BE8D85 256B4000 lea eax,dword ptr ss:
0040D3C4EB 1E jmp short unpackme.0040D3E4
0040D3C63B85 F16B4000 cmp eax,dword ptr ss:
0040D3CC75 08 jnz short unpackme.0040D3D6
0040D3CE8D85 566B4000 lea eax,dword ptr ss:
0040D3D4EB 0E jmp short unpackme.0040D3E4
0040D3D63B85 F96B4000 cmp eax,dword ptr ss:
0040D3DC75 06 jnz short unpackme.0040D3E4
0040D3DE8D85 F26A4000 lea eax,dword ptr ss:
0040D3E48907mov dword ptr ds:,eax
0040D3E68385 3D6D4000 04add dword ptr ss:,4
0040D3ED^ E9 3CFFFFFF jmp unpackme.0040D32E
0040D3F2CCint3
0040D3F383C6 14 add esi,14
0040D3F68B95 516D4000 mov edx,dword ptr ss:
0040D3FC^ E9 FBFEFFFF jmp unpackme.0040D2FC
0040D4018DBD D7644000 lea edi,dword ptr ss:
跟踪可以发先,没被加密的IAT,magic jump下面的跳均能实现,若加密,则至少有1个跳不会实现,而是压入错误的信息
于是,2种处理方法
1:改magic jump,把JNZ改成JMP
2:把下面的lea语句全给NOP
用任何一种方法,都能跳过IAT的加密
下面的操作就是找OEP和dump了.
分析到此结束 超人终于来了!!!
占楼···狂学习!!!!!!!!!!!! 手动输入2个指针,转存修复一下
这个不知道怎么做,超人,再讲讲!!! 引用第4楼zapline于2008-08-27 21:05发表的:
手动输入2个指针,转存修复一下
这个不知道怎么做,超人,再讲讲!!!
这个很简单的嘛,比如有什么指针无效,自己手动查找后,双击,再输入函数,点确定就OK
说过我是菜鸟嘛!
我脱得第二种壳,第一种是 UPX
所以我的方法和脱 UPX一样,找到了OEP ,但成功不了 关于 PE头无效的问题 可以用
ImportREC设置 从磁盘载入PE头解决..
鼓励多发高质量文章 谢谢 小MO大哥````` 牛哇 狂学习下
页:
[1]
2