- 第一章 - OD 的各个窗口介绍
- 第二章 - 数值系统
- 第三章 - 寄存器
- 第四章 - 汇编指令
- 第五章 - 数学指令
- 第六章 - 比较和条件跳转
- 第七章 - call ret
- 第八章 - 循环 字符串指令和寻址方式
- 第九章 - 基本概念
- 第十章 - 断点
- 第十一章:硬件断点与条件断点
- 第十二章 - 消息断点
- 第十三章 - 硬编码序列号寻踪-Part1
- 第十四章 - 硬编码序列号寻踪-Part2
- 第十五章 - 硬编码序列号寻踪-Part3
- 第十六章 - 序列号生成算法分析-Part1
- 第十七章 - 序列号生成算法分析-Part2
- 第十八章 - 序列号生成算法分析-Part3
- 第十九章 - OllyDbg 反调试之 IsDebuggerPresent
- 第二十章 - OllyDbg 反调试之检测 OD 进程名
- 第二十一章 - OllyDbg 反调试之检测 OD 进程名,窗口类名,窗口标题名
- 第二十二章 - OllyDbg 反调试之 UnhandledExceptionFilter,ZwQueryInformationProcess
- 第二十三章 - OllyDbg 反调试之 ProcessHeap,NTGlobalFlag,OutputDebugStringA
- 第二十四章 - OllyDbg 反调试之综合 CrackMe
- 第二十五章 - 异常处理
- 第二十六章 - Visual Basic 程序的破解-Part1
- 第二十七章 - Visual Basic 程序的破解-Part2
- 第二十八章 - Visual Basic 程序的破解-Part3
- 第二十九章 - P-CODE-Part1
- 第三十章 - P-CODE-Part2
- 第三十一章 - 脱壳简介
- 第三十二章 - OEP 寻踪
- 第三十三章 - 神马是 IAT 如何修复
- 第三十四章 - 手脱 UPX,修复 IAT
- 第三十五章 - 手脱 ASPack V2.12
- 第三十六章 - IAT 重定向
- 第三十七章 - 论 IAT 重定向之修复
- 第三十八章 - 手脱 Yoda's Protector v1.3(Yoda's Crypter)
- 第三十九章 - 神马是 stolen bytes
- 第四十章 - OllyDbg 脚本的编写
- 第四十一章 - 神马是 AntiDump
- 第四十二章 - ACProtect V1.09 脱壳(寻找 OEP 绕过硬件断点的检测 修复 Stolen code)
- 第四十三章 - ACProtect V1.09 脱壳(编写脚本修复 IAT)
- 第四十四章 - ACProtect V1.09 脱壳(修复 AntiDump)
- 第四十五章补充章节-ReCrypt v0.80 脱壳(续)
- 第四十六章 - Patrick 的 CrackMe-Part1
- 第四十七章 - Patrick 的 CrackMe-Part2
- 第四十八章 - PeSpin V1.3.04 脱壳-Part1
- 第四十九章 - PeSpin V1.3.04 脱壳-Part2
- 第五十章 - 再谈 ReCrypt v.0.80 脱壳(调戏 OutputDebugString)
- 第五十一章 - ASProtect v2.3.04.26 脱壳-Part1
- 第五十二章 - ASProtect v2.3.04.26 脱壳-Part2
- 第五十三章 - TPPpack 脱壳
- 第五十四章 - EXECryptor v2.2.50.a 脱壳-Part1
- 第五十五章 - ExeCryptor v2.2.50.a-Part2
- 第五十六章 - EXECryptor v2.2.50.b 脱壳
- 第五十七章 - ExeCryptor v2.2.50.c/d/e/f/g 脱壳
- 第五十八章 - ExeCryptor v2.2.50
第四十八章 - PeSpin V1.3.04 脱壳-Part1
如果有的童鞋看了前两个章节,还是没有搞定那个 CrackMe 的话,可能考虑先跳过这两章从第 48 章开始看,可能确实这两章难度有点大。(PS:其实还好,基础扎实的话,看起来还是没有问题的)
本章我们来脱 PeSpin 这款壳,版本是 1.3.04。
首先我们来定位该壳的 OEP。
我们用专门定位 OEP 的 OD(olly_parcheado_para_vb) 来加载它,断在了入口点处。
接着我们单击工具栏中的 M 按钮打开区段列表窗口,我们对主程序的代码段设置内存访问断点,大家还记得这个内存断点吧,这个 OD 的内存断点被 Patch 过,其仅仅是内存执行断点,只有执行才会断下,读取和写入并不会断下。
这里检查下看看要忽略的异常选项是否都勾选上了。
我们运行起来。
这里大家需要等待一段时间,不一会儿工夫断在了这里,应该是 OEP,但是入口点特征又不太像,应该是存在 Stolen Bytes。
我们来看看堆栈:
从堆栈中我们可以看到在到达伪造的 OEP 之前经过了多层函数调用,执行了很多代码,这些代码应该就是我们要找到的 stolen bytes。
这里我们在反汇编窗口中单击鼠标右键选择 Search for-All intermodular calls,查看下主模块调用了哪些 API 函数。
我们可以看到只有少量调用处显示了 API 函数名称,我们随便选择一个。
这里可以看到少量的间接调用 API 函数的指令-跳转表,我们任选一项定位到 IAT。
这里我们可以看到 IAT 的结束地址为 460F28,我们往上拉。
我们可以看到这些 IAT 项好像是经过重定向的,我们随便选中一项查看一下参考引用。
我们会发现这些项并没有参考引用处,我们继续往上翻,马上就可以看到 IAT 的起始地址了,所以说明刚刚这些查不到参考引用的项的确是 IAT 项,这些项被该壳重定向过了而已。
现在我们 IAT 的起始地址和结束位置都知道了,起始地址为 460818,结束地址为 460F28,下面我们的任务就是要修改 IAT 以及 stolen bytes 了。
首先我们来定位 stolen bytes,定位到伪造的 OEP 处,往上拉,可以看到一片零区域。
下面我们重启 OD,看下堆栈。
这里我们可以首次断在壳的入口点处时,栈顶指针指向了 12FFC4,也就是说,基于堆栈平衡的原理,当壳解密区段完毕,跳往真实的 OEP 处时,此时的栈顶指针也应该是指向的 12FFC4。我们知道通过情况下 OEP 处的第一个指令为 PUSH EBP,执行了这条指令后,栈顶指针应该指向的是 12FFC0,所以在数据窗口中定位到 12FFC0,给该内存单元设置硬件写入断点。如果该壳对硬件断点没有检测,我们这么做就没有问题,如果该壳对硬件断点有检测的话,就另当别论了。
我们运行起来。
断在了这里,这里壳还没有解密完毕,我们继续按 F9 键运行。
断在了这里,这里有条 PUSH EBP 指令,有点像 OEP 处的指令,嘿嘿,我们继续往下单步跟踪,验证一下看看到底是不是 OEP 处的指令,对于无 JMP 指令我们并不会感兴趣,因为其并不影响寄存器组以及堆栈的状态。
这里我们可以看到 PUSH FBF7BA08 这条指令,FBF7BA08 被压入堆栈以后,下面又要加上 44D5458 这个值。
我们来看看相加的结果等于多少。
这里我们可以看到相加的结果等于 450E60,以上两条指令的作用等价于 PUSH 450E60。
接下来两条指令是类似的,等价于 PUSH 4292C8。
我们继续。
这里又是一条语句,我们继续。
继续:
这里应该是调用一个 API 函数,等我们修改了 IAT 就可以看出来了。
跟到了这里,可以看到这里将要跳往伪造的 OEP 了,嘿嘿,stolen bytes 都知道了。
我们将 stolen bytes 都拷贝到 OEP 处。
好了,我们可以看到空间刚刚好,这里 stolen bytes 我们就修复完毕了,下一章节我们来修改 IAT。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论