返回介绍

第四十八章 - PeSpin V1.3.04 脱壳-Part1

发布于 2025-01-31 21:07:02 字数 7069 浏览 0 评论 0 收藏 0

如果有的童鞋看了前两个章节,还是没有搞定那个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文