- UID
- 29646
注册时间2007-3-4
阅读权限30
最后登录1970-1-1
龙战于野
该用户从未签到
|
【破文标题】ORiEN 2.11 - 2.12简单脱壳及如何找MAGIC JMP
【破文作者】水平太菜,就不用写名字了吧o(∩_∩)o
【作者邮箱】
【作者主页】
【破解工具】PEID+OD+IMPORTREC
【破解平台】WINDOWS XP
【软件名称】
【软件大小】
【原版下载】
【保护方式】
【软件简介】
【破解声明】菜鸟学脱壳的一点学习过程,仍有很多不足,感谢脱壳前辈们的教导
------------------------------------------------------------------------
【破解过程】 最近在吾爱破解学脱壳,脱的是置顶贴的脱壳训练,我其实对脱壳一点都不懂,随便哪个压缩壳给我,我都不一定会脱,汗!今天已经是做练习7了,脱的是ORiEN,其实这壳不难,很多前辈写出了很多脱壳教程,黑鹰破解提高班里面也有关于这个壳的脱壳教程,还教了我们如何手动跟踪加密指针。在这里先向前辈们表示感谢!我今天也脱了一下,修复的时候也是2个无效指针,大家比较有经验的都知道这2个指针是ExitProcess和GetCommandLineA,我刚想要复习一下手动跟踪指针的时候忽然想到一个问题:我这样不是重复别人的思维,按照别人的套路来脱壳吗?虽然菜鸟都是要从模拟别人的方法开始的,可现在我可不想这样了,我觉得也应该提升自己的脱壳能力,学习一下如何分析壳了。
我们言归正传开始进入正题,脱壳步骤我就先不写了 我们从那2个加密指针开始说起吧。我这里的记录是这样的,IMPORTREC修复的时候,那2个指针的RVA是0005518C和0005519C,我们用OD载入程序在左下角的数据窗口 来到0045518C(0005518C+00400000)这个位置,下硬件写入断点 SHIFT+F9运行几次 直到出现我们原本要找的GetCommandLineA这个指针,这时断点不要取消,我们F8单步走一下,稍微走一下会发现F8走过一个CALL的时候指针都出来了,除了那个GetCommandLineA,有意思的是连ExitProcess都出来了,这说明呢?或许不说明什么,但我觉得关键点离我们越来越近了,当时我是认为GetCommandLineA被加密了,但ExitProcess还没有,我们继续F8的话说不定有大收获,我们F8坚持下去,很快就来到这里了- 004A17AE /0F84 C1000000 je UnPackMe.004A1875
- 004A17B4 |3B83 BF3A0000 cmp eax,ds:[ebx+3ABF] ; 比较是否是
- ExitProcess
- 004A17BA |75 2B jnz short UnPackMe.004A17E7
- 004A17BC |EB 13 jmp short UnPackMe.004A17D1
- 004A17BE |FF15 EB026996 call ds:[966902EB]
- 004A17C4 |83C7 00 add edi,0
- 004A17C7 |EB 01 jmp short UnPackMe.004A17CA
- 004A17C9 |B8 83C404EB mov eax,EB04C483
- 004A17CE |0ACD or cl,ch
- 004A17D0 |2050 E8 and ds:[eax-18],dl
- 004A17D3 |E9 FFFFFFFF jmp UnPackMe.004A17D7
- 004A17D8 |25 83C404EB and eax,EB04C483
- 004A17DD |01A8 8D83211F add ds:[eax+1F21838D],ebp
- 004A17E3 |0000 add ds:[eax],al
- 004A17E5 |EB 64 jmp short UnPackMe.004A184B
- 004A17E7 |3B83 E73A0000 cmp eax,ds:[ebx+3AE7] ; 比较是否是
- GetCommandLineA
- 004A17ED |75 2B jnz short UnPackMe.004A181A
- 004A17EF |EB 13 jmp short UnPackMe.004A1804
复制代码 相信不用我说大家都能明白了吧,还不明白的话请继续看下去,我写了比较完整的脱文,上面的只是我的一些思路和过程。
比较完整的脱壳文章:- 004A0000 > $ /E9 5D010000 jmp UnPackMe.004A0162 ; OD载入到这里
- 004A0005 |CE db CE
- 004A0006 |D1 db D1
- 004A0007 |CE db CE
- 004A0008 |CD db CD
- F8一下来到这里
- 004A0162 > \60 pushad ; 来到这里
- 004A0163 . E8 783B0000 call UnPackMe.004A3CE0 ; 典型的ESP
- 004A0168 . 2F das
- 004A0169 . FC cld
- 004A016A . 3BAC95 AA3AFCC4 cmp ebp,ss:[ebp+edx*4+C4FC3AAA]
复制代码 我们不要着急,先扫清障碍再来慢慢享受脱壳成功的喜悦o(∩_∩)o ESP的硬件断点下好后 ALT+M 在
RESOURCE段下段,SHIFT+F9来到这里- 004A26CB 0FB74E 0C movzx ecx,word ptr ds:[esi+C] ; RESOURCE段下段后来到这里
- 004A26CF EB 01 jmp short UnPackMe.004A26D2
- 004A26D1 7F 3B jg short UnPackMe.004A270E
- 004A26D3 C2 6603 retn 366
复制代码 CTRL+B 搜索二进制3B 83 BF 3A 00 00 75- 004A17B3 003B add ds:[ebx],bh ; 找到这里
- 004A17B5 83BF 3A000075 2B cmp dword ptr ds:[edi+7500003A],>; 把75改成EB
- 004A17BC EB 13 jmp short UnPackMe.004A17D1
- 004A17BE FF15 EB026996 call ds:[966902EB]
- 004A17C4 83C7 00 add edi,0
- 004A17C7 EB 01 jmp short UnPackMe.004A17CA
- 004A17C9 B8 83C404EB mov eax,EB04C483
- 004A17CE 0ACD or cl,ch
- 004A17D0 2050 E8 and ds:[eax-18],dl
- 004A17D3 E9 FFFFFFFF jmp UnPackMe.004A17D7
- 004A17D8 25 83C404EB and eax,EB04C483
- 004A17DD 01A8 8D83211F add ds:[eax+1F21838D],ebp
- 004A17E3 0000 add ds:[eax],al
- 004A17E5 EB 64 jmp short UnPackMe.004A184B
- 004A17E7 3B83 E73A0000 cmp eax,ds:[ebx+3AE7] ; 比较是否是
- GetCommandLineA
- 004A17ED 75 2B jnz short UnPackMe.004A181A
- 004A17EF EB 13 jmp short UnPackMe.004A1804
复制代码 其实- 004A17B3 003B add ds:[ebx],bh ; 找到这里
- 004A17B5 83BF 3A000075 2B cmp dword ptr ds:[edi+7500003A],>; 把75改成EB
- 004A17BC EB 13 jmp short UnPackMe.004A17D1
复制代码 的原型应该是这样的,我们在004A17B3 这行代码上NOP掉一个字节代码就出来了- 004A17B3 90 nop ;
- 004A17B4 3B83 BF3A0000 cmp eax,ds:[ebx+3ABF] ; 比较是否是
- ExitProcess
- 004A17BA 75 2B jnz short UnPackMe.004A17E7 ; 不是则跳
- 004A17BC EB 13 jmp short UnPackMe.004A17D1
复制代码 这段代码其实是比较当前指针是否是ExitProcess,是的话就跳向加密,不是则继续处理。我们把JNZ改
成JMP 即75改EB 让它强制跳走 就不会进行加密了 同样在下面一点的地方就可以看到壳处理
GetCommandLineA指针的部分了 同样把75改EB 让它不加密。
这时我们最早的ESP断点就要起作用了 这下知道为什么要先下ESP断点了吧
用ESP定律来到这里(记得要先把内存访问断点给去掉)- 004A1ADB B8 9C150500 mov eax,5159C ; ESP定律来到这里
- 004A1AE0 83F8 00 cmp eax,0
- 004A1AE3 74 13 je short UnPackMe.004A1AF8
- 004A1AE5 05 00004000 add eax,UnPackMe.00400000 ; ASCII "MZP"
- 004A1AEA EB 08 jmp short UnPackMe.004A1AF4
复制代码 接着F8继续往下走 走几步就会有发现- 004A1AF1 - FFE0 jmp eax ; 跳向OEP
复制代码 F8一次来到OEP- 0045159C 55 push ebp ; OEP
- 0045159D 8BEC mov ebp,esp
- 0045159F 83C4 F0 add esp,-10
- 004515A2 B8 BC134500 mov eax,UnPackMe.004513BC
- 004515A7 E8 8846FBFF call UnPackMe.00405C34
复制代码 DUMP出来 用IMPORTREC修复的时候指针是全部有效的 我们看看转储修复结果如何 修复一下可以运行 呵呵 看来我们的思路是正确的 菜鸟也可以学会如何对付指针加密和修改MAGIC JMP了
后记:我自己为了验证一下我的办法是否正确 又下了一个ORiEN 2.12 汉化版来加了一个记事本 发现同
样是可行的,而且不用修复直接OD脱壳出来就可以运行了o(∩_∩)o
------------------------------------------------------------------------
【破解总结】 小弟第一次写脱文,没什么技术含量,只是想把自己的一点经验和心得和大家分享一下,主要就是处理ORiEN 2.11 - 2.12的MAGIC JMP的问题,我暂时还没有看到有人写关于ORiEN的MAGIC JMP的文章(当然了,我看过的脱文很少很少啊),所以不自量力的乱写了一篇,希望能开拓大家的思路和给大家另一种不用手动跟踪IAT脱ORiEN 2.11 - 2.12的方法。非常欢迎大家来评论、补充和指点。
------------------------------------------------------------------------
【版权声明】脱文版权归我,转载版权归你。欢迎转载,盗版不究o(∩_∩)o
[ 本帖最后由 傻人有傻福 于 2008-10-4 16:14 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入我们
x
|