第16课 手动脱壳的常规方法

更新时间:2024-04-05 07:33:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第16课 手动脱壳的常规方法

手动脱壳主要分为三大步骤(你可以将其想像为程咬金的三板斧):①寻找入口点(OEP)、②转储(Dump)程序、③修复输入表(Import Table)。对于复杂的加密壳,还需要在①②之间再加上一个步骤:寻找魔力跳(Magic Jump)。

直接跟踪法

直接跟踪法的基本原则为:

1.时刻把自己想像成中国象棋中的“兵”或“卒子”,只准前进,不准后退。一旦往回跳,则在程序的下一行按F4,继续向下走(解释:F4——运行到指定行)。

2.一般情况下,一路按F8走。一旦追踪的过程中,目标程序运行起来,宣告脱壳失败。则需要重新来过,通常的术语被称为“程序跑飞”。 3.注意识别变形call(其实质是一种变形的jmp)。不能直接F8带过,会跑飞。这种情况下应该按F7。判断的方法是它所call的地址和它自身所在的当前行地址极其接近,感觉离得不远,像近房亲戚、孪生兄弟或姐妹。

4.遇到在循环中跑来跑去时,要想办法跳出循环圈。时刻留意其中一些跳的比较远的跳转,可以ctrl+G,直接到那个位置;或者按F2设断,F9或点

按钮,断下后再F2取消断点。

〔例1〕 目标程序:UnPackMe_EZIP1.0.exe。壳为ezip1.0。

程序载入后,来到这里。

F8,来到这里

F8走,直到这里,看到类似下图的跳转,由于是向下跳,注意看红线和V形向下小箭头,任由它跳即可。

来到下图的跳转时,当心,已经来到46861A,却要跳回到46855F。注意看红线和 ^形向上小箭头,不让它跳,在下一行(即46861F)用鼠标点住,按F4。

继续F8向下走,直到468688这行:

程序在46××××,却要跳到4271B0(42××××),如此大的跨段大跳跃,就是跳到入口点(传说中的OEP)的典型标志,看EAX的值也可知道=4271B0。所以OEP=4271B0

F8走一下,来到入口点。如下图:

经验:入口点处的代码一般为 push ebp mov ebp,esp 或 Push 0

我们用peid的找入口点插件验证一下:

确实没错。有时OEP的东西比较混乱,看着不像,这时需要在ollyDBG中

选择“插件”中的ollyDump脱壳插件脱壳

由于为压缩壳,没有破坏输入表,选项设置如下图:不要勾选“重建输入表”

点脱壳按钮,即可完成脱壳,命名为aa.exe 运行正常。Peid显示如下:可见,脱干净了。

最后,用lordpe的pe rebuilder减肥aa.exe。脱壳完成。 〔例2〕 脱壳UnPackMe_MEW1.1.exe 用例1的方法追踪,留意这里

留意这里(发现以后快速脱壳,可以用bp GetProcAddress,然后Alt+F9)

一路西天取经,不一会儿来到这里

鼠标点住4001FD行,按F4

注意返回值。由40XXXX到42XXXX。

堆栈窗口也能看到4271B0。F8一下,来到OEP,到站了,用ollyDUMP下车,dump下。

直接dump下来,命名为aa.exe。无论勾选哪些选项,均无法运行。这时,需要修复输入表(import table)。

于是,请出传说中唯一的注册表修复工具Import REConstructor v1.7 FINAL。 运行ImportREC,选择这个进程。如图:

把OEP改为000271B0,如图:

点IAT AutoSearch按钮,如图 ,弹出对话框,点确定

点“Get Imports”按钮,点“Show Invalid”按钮。如图:

没有错的,点“Fix Dump”按钮,选择aa.exe,进行修复,出来个aa_.exe,运行正常。 ++++++++++++++++++++++++++++++++++++++ 一些经验:在壳跳到OEP的时候一般是个跨段跳转, 跳转方法有很多, 如 JMP EAX 如EZIP

JMP XXXXXXXX, 如UPX$hit JMP [XXXXXXXX], JE [XXXXXXXX],

PUSH XXXXXXXX 然后紧跟一个RET 如aspack2.12,pecompact早期版本1.XX RETN 如MEW1.1 CALL XXXXXXXXX, CALL [XXXXXXXX], CALL EAX...

还有的是在SEH中直接指定EIP等等。

修复IAT一般用ImportREC, 填写好OEP的RVA, 先点IAT AutoSearch, 再点Get Import, 如果找到的API全部有效,就可以点Fix Dum了;如果有无效的,就需要修复。 先点Show Invalid, 再对这些无效的API点右键, 共有3个修复级别, 推荐直接使用第3个,效果比较好。全部API有效时就可以点Fix Dump了, 如果修复不了就只有用手工修复了。

没有错的,点“Fix Dump”按钮,选择aa.exe,进行修复,出来个aa_.exe,运行正常。 ++++++++++++++++++++++++++++++++++++++ 一些经验:在壳跳到OEP的时候一般是个跨段跳转, 跳转方法有很多, 如 JMP EAX 如EZIP

JMP XXXXXXXX, 如UPX$hit JMP [XXXXXXXX], JE [XXXXXXXX],

PUSH XXXXXXXX 然后紧跟一个RET 如aspack2.12,pecompact早期版本1.XX RETN 如MEW1.1 CALL XXXXXXXXX, CALL [XXXXXXXX], CALL EAX...

还有的是在SEH中直接指定EIP等等。

修复IAT一般用ImportREC, 填写好OEP的RVA, 先点IAT AutoSearch, 再点Get Import, 如果找到的API全部有效,就可以点Fix Dum了;如果有无效的,就需要修复。 先点Show Invalid, 再对这些无效的API点右键, 共有3个修复级别, 推荐直接使用第3个,效果比较好。全部API有效时就可以点Fix Dump了, 如果修复不了就只有用手工修复了。

本文来源:https://www.bwwdw.com/article/gzxr.html

Top