手动脱壳简简单单
在我们进行逆向
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
的时候,通常会遇到有些文件被加密处理过,也就是我们通常所说的
被加了壳, 这时他的内部结构都已经改变,我们想要继续分析是很麻烦的, 所以我们需要把它从
壳中分离出来,也就是我们常说的脱壳。 现在越来越多的软件都使用了加壳的保护
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
, 所以脱
壳是我们在逆向分析过程中很主要的步骤,掌握它至关重要
壳是最早出现的一种专业加密软件。不同的壳的侧重点也不同,有的侧重于压缩,有的侧
重于加密, 所以出现了压缩壳和加密壳。 压缩壳的特点是减小软件的体积, 我们常见的有: UPX ,
ASPack,PECompack 等。加密壳的则侧重于加密, 保护强度较大, 常见的有:ASProtect ,Armadillo ,
Themida 等。
第一步 寻找 OEP
★OEP(Original Entry Point ):程序的原入口点,就是壳程序在完成了对原程序的还原后,
开始跳转到刚还原的程序执行,此时的地址就是入口点的值。
1 单步跟踪
首先,我们运行 peid, 将我们要检测的程序拖到上面 ,可以看到它是用 aspack 加的壳,如图 1。
我们运行 OD ,点击菜单栏中的“文件”→“打开”,把我们需要脱壳的文件加载进来,接
着就会弹出一个对话框“模块 ,, 你仍要继续分析吗”, 如图 2,
我们选择“否”(不管什么方法脱壳都要按“否”),程序就会停以下的代码处:
01013001 > 90 nop
01013002 60 pushad
01013003 E8 03000000 call 0101300B
01013008 - E9 EB045D45 jmp 465E34F8
0101300D 55 push ebp
0101300E C3 retn
0101300F E8 01000000 call 01013015
01013014 EB 5D jmp short 01013073
我们按 F8 来跟踪一下,当到了 call 0101300B 这里的时候,记事本自己打开了,我们按
Ctrl+F2 重新载入文件,再来跟踪,当我们再次遇到 call 0101300B 这一句的时候我们按 F7 跟
进,代码会来到这里:
0101300B 5D pop ebp
0101300C 45 inc ebp
0101300D 55 push ebp
0101300E C3 retn
我们继续 F8 来跟踪,当到了 retn 一句时,程序返回了,停在了 call 的下面一句 jmp
465E34F8 上,跳转以后代码来到了下面的这一句 call 01013015,继续 F8,如果遇到程序往回
跳,那么我们就在下一句代码处按 F4,这样跟踪一段时间以后,我们会看到这样的代码:
010133BB 68 9D730001 push 0100739D
010133C0 C3 retn
再 F8 一下我们的程序就返回了了这里:
0100739D 6A 70 push 70
0100739F 68 98180001 push 01001898
010073A4 E8 BF010000 call 01007568
到这里,我们就已经到达 OEP,单步跟踪法测试成功。
2 堆栈平衡
★ 堆 栈 :一种数 据项 按序排 列的 数据结 构 ,只能 在一 端 (栈顶 )对数 据项进 行插 入和删 除。
★ ESP:是 CPU 中的寄存器,它的值是指向堆栈栈顶的指针。
加壳时, 必须保证加壳后文件与我们的原始文件的环境现场是不变的, 所以在外壳程
序运行的时候, 就会把刚载入时的各寄存器值保存到堆栈中来保护环境现场, 所以我们在它向堆
栈保存环境现场时对这时的堆栈 栈 顶 设置 硬件 访问( 写入 )断点 ,当 壳程序 执行 完毕 ,恢
复 环境现场时就需要访问(写入)在保存环境现场时的堆栈地址,而我们已经在这里设置了 硬
件 访问 (写入 )断 点,所 以程 序就 会被断 下来 。
在根据堆栈平衡原理,首先要说的就是 ESP定律法。
在 OD 中载入我们需要脱壳的文件,注意 OD 右上角寄存器窗口中的 ESP 值,刚载入的时
候它是红色的,我们按 F8 跟踪一下,当它再次变红时(数据发生变化),如图 3,
这时我们在 OD 左下脚的指令窗口中输入 hr(hw) 当前 ESP值, 按 回 车 , 来设置 一个 硬件
访 问( 写入) 断点 ,如图 4,
接 着我 们按 F9 让 程序运 行起 来, 代码会 来到 如图 5 所示的 地方 ,
按 只需 要在这 里按 F8 跟 踪一 下, 程序就 会跳到 OEP 了, ESP 定律法测试成功。
有一部分加壳软件在保存和恢复现场环境时会使用 pushad 和 popad 指令。那么当我们在程
序中遇到 popad 指令时就说明外壳程序已经开始恢复现场环境,准备返回 OEP 了,所以我们也
可以通过搜索 popad 指令的方法来寻找 OEP 了。
打开 OD 把我们要脱壳的文件加载进来,按快捷键 Ctrl+f 搜索 popad 指令,如图 6,
点“搜索”,在如图 7 的地方我们找到了一处 popad 指令,
我们选中这一条指令,在上面按 F4 运行到这里,看这里的
代码:
010133B0 61 popad
010133B1 75 08 jnz short 010133BB
010133B3 B8 01000000 mov eax, 1
010133B8 C2 0C00 retn 0C
010133BB 68 9D730001 push 0100739D
010133C0 C3 retn
我们来 F8 单步跟踪一下,当运行来到最后一句的时候,代码就会跳到这里:
0100739D 6A 70 push 70
0100739F 68 98180001 push 01001898
010073A4 E8 BF010000 call 01007568
这里就是程序的 OEP,搜索 popad 指令法测试成功。
3 内存断点
程序在加壳时,会对原文件进行加密压缩,在执行加壳后的文件时,则会读取被压缩的代
码进行解密, 这时我们在被加密的部分设置内存断点, 那么加壳程序在读取被加密的代码时就会
断下来。
将加壳后的文件载入 OD,按快捷键 Alt+m 打开内存窗口, 找到第一个代码段 .text 选中它在
上面按 F2 下一个断点,如图 8,
按 F9 运行,它在第一个 call 的地方停下了,我们再按一次 F9 就可以看到我们设置的内存
断点自动取消了,这时我们再 F8 跟踪几下,就到达程序的 OEP 了, 内存断点法测试成功。
4 动态链接库
动 态链 接库在 运行 结束的 时候 还会 来到程 序的 入口点 一次 ,根据这个特征,我们还有
一种专门针对动态链接库的 OEP 寻找法,我就以 OD 目录下的 DBGHELP.DLL 给大家做演示。
把我们需要脱壳的文件载入 PEID ,如图 9,
已经用 ASPack 加壳了, 我们把它载入 OD,会提示“文件 ** 是一个动态 链接库,windows
无法直接启动,要启动 loaddll.exe吗?”如图 10,
我们选择“是”,按 n 次 F9 让它运行起来,如图 11,
现在我们把上面的那个小窗口给关闭了, OD 会来到外壳程序的入口点,按 F8 跟踪,当遇
到第一个 call 时按 F7 跟进,因为这是第二次运行外壳程序,所以程序会略过解密部分,接着 F8
再来跟踪,很快就会来到程序的 OEP 了,如图 12,
我们已经来到了程序的 OEP 处,在 OD 工具栏的插件中选择“ OllyDump ” →“ Dump
Debugged process”,如图 13,
这时会弹出一个如图 14 所示的窗
口,
我们只要按一下 Dump 按钮,把文件保存起来就可以了,用 PEID 查看一下
Dump 后的文件,如图 15,
已经脱壳成功了。
LoadPE抓取 DLL
首先我们让 OD 来到 DLL 的 OEP 处,然后我们打开 LoadPE,在上面的窗口中选
择 loaddll 的进程,下面的窗口选中我们载入 loaddll 的 DLL 进程,点击右键选择
“dump full”保存起来就好了,如图 16
重建输入表
在加壳过程中,破坏原程序的输入表是必有的功能,在 Dump 后重建输入表也是
非常关键的。
ImportREC 是很专业的输入表重建工具,首先我们要确保我们已经找到程序的
OEP,并且文件已经 Dump,而且正在运行中。
打开 ImportREC ,如图 17,
在上面的下拉框中选中, Dump 后的文件进程,点击左下脚的“自动查找
IAT ”,在点击先面的“获取输入表”,最后点击“修复转存文件”,包修复好
的文件保存起来就 OK 了。
到此为止,我已经介绍了所有的基本脱壳方法