如何取整java 如何取整个鸡蛋壳
  rdCsxAuFPYyT 2023年11月08日 79 0

一、基本概念的理解

壳的脱壳:如果我们将一个应用程序比喻成一个鸡蛋,程序中对我们有用的程序代码为鸡蛋清,而我们需要获取鸡蛋清的时候,就必须打破鸡蛋外面的鸡蛋壳,也就是进行脱壳的处理。
脱壳的方式:不同的壳对应的脱壳方式会不一样,甚至相同的壳但是不同的版本,脱壳的方式也会可能不同。

二、示例程序演示

示例程序为win7自带的notepad.exe ,该程序原本没有加壳

如何取整java 如何取整个鸡蛋壳_压缩壳

对该应用程序notepad-UPX.exe进行UPX加壳

如何取整java 如何取整个鸡蛋壳_压缩壳_02


压缩之后查壳

如何取整java 如何取整个鸡蛋壳_如何取整java_03

进行upx加壳前后对比

如何取整java 如何取整个鸡蛋壳_解压缩_04

三、脱UPX壳

1、脱壳的基本过程
手动跟踪到程序的OEP(程序原始入口点),将程序和数据dump下来,然后再进行IAT的相关修复即可。

2、如可查找OEP
(1)需要熟悉各种编译器生成的程序的入口点的指令。例如vs 程序的入口点一般为:
push ebp
mov ebp,esp
(2)壳进行解压缩的代码通常在一个自己的区段里面运行,解压缩完成后通常会跳转到原始程序入口点进行运行,此时跳转到OEP往往需要一个JMP或CALL,保证EIP指针指向了原始的OEP地址。注:原始的OEP与解压缩的代码通常不在一个区段内,所以JMP与CALL往往实现的是跨区段的跳转。

3、手动的跟踪脱UPX壳

OD载入程序后,先运行的是壳的解压缩代码,逐步F8往下跟踪,跟踪完解压缩代码后,跳转到OEP。

(1)UPX壳所用到的API:LoadLibraryA和GetProcAddress,这两个API将进行对原始程序的导入函数进行还原。LoadLibraryA进行加载导入函数相关的动态链接库,GetProcAddress在动态链接库里面获取导入函数的地址进行还原。

LoadLibraryA

如何取整java 如何取整个鸡蛋壳_解压缩_05


GetProcAddress

如何取整java 如何取整个鸡蛋壳_脱壳_06

(2)注意相关的逻辑循环,使用F4运行到指定位置,跳出循环(注意:如果碰到nop的指令,F4定到下一条语句,否则程序会跑飞)。UPX在完成解压缩之后,会进行跳转到原始程序入口点,这是跨区段的跳转,在F8与F4往下运行的同时,注意跨区段的JMP

如何取整java 如何取整个鸡蛋壳_解压缩_07


地址 0x0055B9D4与0x004E53C2,地址之间相差巨大,此时往往为跨区段的跳转。该条指令就是跳转到原始程序的入口点,F8自动步入到OEP

如何取整java 如何取整个鸡蛋壳_upx_08

(3)打开LoadPE,选中该应用程序进程,右键先“修正镜像大小”,再“完整转存”,将OD跟进到OEP的程序转储下来。

如何取整java 如何取整个鸡蛋壳_脱壳_09


此时转储下来的dumped.exe程序无法运行,因为导入表还没有进行修复

如何取整java 如何取整个鸡蛋壳_脱壳_10


接下来我们进行导入表的修复(4)计算出OEP的RVA值,也可以在我们跟进的OEP处,右键选中Dump Process插件(注:不同的OD的名称有细微的差别),获取当前EIP作为OEP的RVA值(Get EIP as OEP)

如何取整java 如何取整个鸡蛋壳_解压缩_11


获取到OEP的值为 0x000E53C2(5)使用ImpREC进行对导入表的修复

如何取整java 如何取整个鸡蛋壳_脱壳_12


填写我们的OEP值,然后点击“自动查找IAT”,再点击“获取输入表”,最后进行转储到文件,进行修复dump下来的导入表(无效的指针在脱UPX壳中可以不用删除)

如何取整java 如何取整个鸡蛋壳_upx_13


修正后的可执行文件dumped_.exe

如何取整java 如何取整个鸡蛋壳_upx_14


dumped_.exe就是可以正常运行的程序了,我们最后再来查壳看看该程序,此时没有壳

如何取整java 如何取整个鸡蛋壳_upx_15

脱upx壳小技巧:通过脱壳发现,upx壳的解压缩完成后跳转到OEP的jmp指令后面为nop指令,通常只需要鼠标往下滚动,发现很多nop指令时,就能找到该jmp指令。

四、脱壳找IAT小技巧

我们在进行跟进到OEP后,有可能壳的解压缩程序并没有完全的帮我们恢复IAT(例如:FSG壳),而ImpREC并不能帮我们完整的修复,此时就需要我们手动进行修复,如何查找到IAT?
调用系统的API的call指令的二进制指令代码为 FF 15,所以我们只需要在OD中,查找FF 15二进制指令就能找到某个导入函数的地址,然后再数据窗口中跳转到该地址就能到IAT的位置,再进行上下滚动就能查找了。

基本步骤:

1、Ctrl+B或在OD中右键->查找->二进制子串

如何取整java 如何取整个鸡蛋壳_upx_16


输入FF 15,点击确定就能查找到某一个导入函数的地址2、此时查找到的API为kernel32里面的GetCommandLineA,它在内存中的地址为0x53230C,我们在数据窗口中Ctrl+G,输入该导入函数的地址跳转到0x53230C(注:数据窗口中需要右键->长型->地址才能查看到API的名称)

如何取整java 如何取整个鸡蛋壳_upx_17


此时查找到IAT,就可以进行一些相关恢复。

upx壳的解压缩代码已经进行了完全的恢复,所以此处并不需要进行相关修复。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

rdCsxAuFPYyT
作者其他文章 更多