飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3826|回复: 9

[原创] ORiEN 2.11 - 2.12简单脱壳及如何找MAGIC JMP

[复制链接]

该用户从未签到

发表于 2008-10-4 15:54:31 | 显示全部楼层 |阅读模式
【破文标题】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坚持下去,很快就来到这里了
  1. 004A17AE   /0F84 C1000000           je UnPackMe.004A1875
  2. 004A17B4   |3B83 BF3A0000           cmp eax,ds:[ebx+3ABF]             ; 比较是否是
  3. ExitProcess
  4. 004A17BA   |75 2B                   jnz short UnPackMe.004A17E7
  5. 004A17BC   |EB 13                   jmp short UnPackMe.004A17D1
  6. 004A17BE   |FF15 EB026996           call ds:[966902EB]
  7. 004A17C4   |83C7 00                 add edi,0
  8. 004A17C7   |EB 01                   jmp short UnPackMe.004A17CA
  9. 004A17C9   |B8 83C404EB             mov eax,EB04C483
  10. 004A17CE   |0ACD                    or cl,ch
  11. 004A17D0   |2050 E8                 and ds:[eax-18],dl
  12. 004A17D3   |E9 FFFFFFFF             jmp UnPackMe.004A17D7
  13. 004A17D8   |25 83C404EB             and eax,EB04C483
  14. 004A17DD   |01A8 8D83211F           add ds:[eax+1F21838D],ebp
  15. 004A17E3   |0000                    add ds:[eax],al
  16. 004A17E5   |EB 64                   jmp short UnPackMe.004A184B
  17. 004A17E7   |3B83 E73A0000           cmp eax,ds:[ebx+3AE7]             ; 比较是否是
  18. GetCommandLineA
  19. 004A17ED   |75 2B                   jnz short UnPackMe.004A181A
  20. 004A17EF   |EB 13                   jmp short UnPackMe.004A1804
复制代码
相信不用我说大家都能明白了吧,还不明白的话请继续看下去,我写了比较完整的脱文,上面的只是我的一些思路和过程。
比较完整的脱壳文章:
  1. 004A0000 > $ /E9 5D010000           jmp UnPackMe.004A0162            ;  OD载入到这里
  2. 004A0005     |CE                    db CE
  3. 004A0006     |D1                    db D1
  4. 004A0007     |CE                    db CE
  5. 004A0008     |CD                    db CD
  6. F8一下来到这里
  7. 004A0162   > \60                    pushad                           ;  来到这里
  8. 004A0163   .  E8 783B0000           call UnPackMe.004A3CE0           ;  典型的ESP
  9. 004A0168   .  2F                    das
  10. 004A0169   .  FC                    cld
  11. 004A016A   .  3BAC95 AA3AFCC4       cmp ebp,ss:[ebp+edx*4+C4FC3AAA]
复制代码
我们不要着急,先扫清障碍再来慢慢享受脱壳成功的喜悦o(∩_∩)o  ESP的硬件断点下好后 ALT+M 在
RESOURCE段下段,SHIFT+F9来到这里
  1. 004A26CB    0FB74E 0C               movzx ecx,word ptr ds:[esi+C]    ; RESOURCE段下段后来到这里
  2. 004A26CF    EB 01                   jmp short UnPackMe.004A26D2
  3. 004A26D1    7F 3B                   jg short UnPackMe.004A270E
  4. 004A26D3    C2 6603                 retn 366  
复制代码
CTRL+B 搜索二进制3B 83 BF 3A 00 00 75
  1. 004A17B3    003B                    add ds:[ebx],bh                  ; 找到这里
  2. 004A17B5    83BF 3A000075 2B        cmp dword ptr ds:[edi+7500003A],>; 把75改成EB
  3. 004A17BC    EB 13                   jmp short UnPackMe.004A17D1
  4. 004A17BE    FF15 EB026996           call ds:[966902EB]
  5. 004A17C4    83C7 00                 add edi,0
  6. 004A17C7    EB 01                   jmp short UnPackMe.004A17CA
  7. 004A17C9    B8 83C404EB             mov eax,EB04C483
  8. 004A17CE    0ACD                    or cl,ch
  9. 004A17D0    2050 E8                 and ds:[eax-18],dl
  10. 004A17D3    E9 FFFFFFFF             jmp UnPackMe.004A17D7
  11. 004A17D8    25 83C404EB             and eax,EB04C483
  12. 004A17DD    01A8 8D83211F           add ds:[eax+1F21838D],ebp
  13. 004A17E3    0000                    add ds:[eax],al
  14. 004A17E5    EB 64                   jmp short UnPackMe.004A184B
  15. 004A17E7    3B83 E73A0000           cmp eax,ds:[ebx+3AE7]            ; 比较是否是
  16. GetCommandLineA
  17. 004A17ED    75 2B                   jnz short UnPackMe.004A181A
  18. 004A17EF    EB 13                   jmp short UnPackMe.004A1804  
复制代码
其实
  1. 004A17B3    003B                    add ds:[ebx],bh                  ; 找到这里
  2. 004A17B5    83BF 3A000075 2B        cmp dword ptr ds:[edi+7500003A],>; 把75改成EB
  3. 004A17BC    EB 13                   jmp short UnPackMe.004A17D1
复制代码
的原型应该是这样的,我们在004A17B3 这行代码上NOP掉一个字节代码就出来了
  1. 004A17B3    90                      nop                              ;
  2. 004A17B4    3B83 BF3A0000           cmp eax,ds:[ebx+3ABF]            ; 比较是否是
  3. ExitProcess
  4. 004A17BA    75 2B                   jnz short UnPackMe.004A17E7      ; 不是则跳
  5. 004A17BC    EB 13                   jmp short UnPackMe.004A17D1  
复制代码
这段代码其实是比较当前指针是否是ExitProcess,是的话就跳向加密,不是则继续处理。我们把JNZ改
成JMP 即75改EB 让它强制跳走 就不会进行加密了 同样在下面一点的地方就可以看到壳处理
GetCommandLineA指针的部分了 同样把75改EB 让它不加密。

这时我们最早的ESP断点就要起作用了 这下知道为什么要先下ESP断点了吧

用ESP定律来到这里(记得要先把内存访问断点给去掉)
  1. 004A1ADB    B8 9C150500             mov eax,5159C                    ; ESP定律来到这里
  2. 004A1AE0    83F8 00                 cmp eax,0
  3. 004A1AE3    74 13                   je short UnPackMe.004A1AF8
  4. 004A1AE5    05 00004000             add eax,UnPackMe.00400000        ; ASCII "MZP"
  5. 004A1AEA    EB 08                   jmp short UnPackMe.004A1AF4
复制代码
接着F8继续往下走  走几步就会有发现
  1. 004A1AF1  - FFE0                    jmp eax                          ; 跳向OEP
复制代码
F8一次来到OEP
  1. 0045159C    55                      push ebp                         ; OEP
  2. 0045159D    8BEC                    mov ebp,esp
  3. 0045159F    83C4 F0                 add esp,-10
  4. 004515A2    B8 BC134500             mov eax,UnPackMe.004513BC
  5. 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
PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2015-8-12 00:27
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2008-10-4 20:48:42 | 显示全部楼层
    脱文很详细,比你在吾爱教的作业要详细些,加了自己的领悟!
    学习下!
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2017-10-17 17:46
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2008-10-5 09:06:55 | 显示全部楼层
    谢谢楼主发布分享

    学习之
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-10-14 10:53:20 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-10-30 09:59:54 | 显示全部楼层
    /:014        呵呵  在这里学习到了啊   支持了 啊 /:018
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2018-12-18 12:34
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2008-10-31 21:39:03 | 显示全部楼层
    向兄弟学习了。/:good
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-11-1 16:21:30 | 显示全部楼层
    下了学习下先
    向兄弟学习了
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2018-3-5 11:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2008-11-2 00:00:22 | 显示全部楼层
    总结的很好,说明动了脑筋了。
    PYG19周年生日快乐!
  • TA的每日心情

    2021-7-30 09:06
  • 签到天数: 131 天

    [LV.7]常住居民III

    发表于 2008-11-2 04:28:33 | 显示全部楼层
    值得学习的东西。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-1-26 06:47:34 | 显示全部楼层
    感谢分享学习经验
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表