发布信息

寻找OEP的技巧,你值得拥有!(附详细教程)

作者:软荐小编      2023-07-29 01:07:48     158

ID:计算机网络

技术是支撑的基本手段之一。 当我们尝试操纵最新的恶意软件时,操纵是我们需要做的第一件事; 当我们尝试分析一个不熟悉的人使用的方法时,操纵始终是我们需要做的第一件事。 因此,技术对于我们来说并不是常用的方法,我们仍然需要对其有一个基本的了解。

如果我们能在shell写的基础上学习,我们在防守的时候就会更加游刃有余。 一般来说,虽然是反杀操作,但是我们需要利用shell的Stub部分将宿主程序恢复到显存,并在执行宿主程序镜像之前dump出来,最后根据具体情况指令是否需要额外维修,该过程现已完成。

1. 寻找OEP

操作中最重要的一步就是找到原程序的OEP,因为调试时我们需要以OEP为模型来判断程序是否已经执行到宿主程序,并且转储时也需要OEP信息宿主程序镜像,即使我们关闭了一些简单的压缩壳,找到OEP几乎就意味着成功,由此可见找到OEP在技术上的重要性。

如果想要更加快速准确的找到OEP,首先要做的就是熟悉不同语言、不同编译器的OEP特点,这是非常有必要的。 平时可以收集一些不同语言、不同编译器编译出来的无壳程序,利用OllyDbg进行大量调试和观察,为以后的工作打下良好的基础。

下面介绍几种常见的查找OEP的方法。 熟练掌握这种方法可以帮助你找到大多数程序的OEP。

1.使用显存断点

后模式程序的特点是宿主程序的大部分内容已经被黑客入侵。 因此,在运行这个程序时,shell的Stub部分必须对宿主程序所在的节进行解密和恢复操作,这样才能恢复。 可以正常运行。 这不可避免地涉及到主机程序所在段的数据操作,因此我们可以通过访问断点或写入断点来判断该段正在操作哪些指令。

我们以A1Packbase为例,首先使用它来避免杀死示例应用程序Demo1.exe。 后续剖面布置如图1所示。

教程脱壳电脑软件有哪些_电脑软件脱壳工具_电脑脱壳软件教程

图1 反杀后Demo1.exe段状态

从图1中可以看出,程序Demo1.exe有一个名为.A1Pass的附加部分。 我们看一下此时Demo1.exe的OEP,为0x00011200。 经过估计,可以得出其指向的位置位于.A1Pass段。 我们都知道OEP默认只会指向.text段,因此我们可以推断.A1Pass段包含A1Packbase的Stub部分。 我们都可以猜测,A1Packbase的Stub部分在开始操作时会揭开.text节的神秘面纱,因此可以通过在.text节中设置断点来找出是哪一段代码在操作该节中的数据。 之所以这样做,是因为大多数压缩shell和部分加密shell最后完成的工作往往是恢复宿主程序的数据信息,所以当我们找到Stub中操作宿主程序部分的代码时,距离宿主程序的OEP已经不远了。

运行OllyDbg加载Demo1.exe后,按快捷键Alt+M打开显存窗口,选中其中的.text段右键单击,然后在弹出的窗口中选择“设置显存写入断点”快捷菜单,如图2所示。

电脑软件脱壳工具_教程脱壳电脑软件有哪些_电脑脱壳软件教程

图2.text段设置显存写入断点

此时,我们已经在.text段的所有位置设置了写入断点,按F9运行程序。 此时程序中断到如下位置:

教程脱壳电脑软件有哪些_电脑脱壳软件教程_电脑软件脱壳工具

从反码可以看出,这是一个循环暴露操作电脑脱壳软件教程,一次只暴露一个字节的数据,所以需要在0xx004113004113EF末尾处设置断点,转入显存页面取消原来为.text段设置的写断点,然后按F9键运行程序,从而跳过本次循环,进入0xx004113004113EF。 经过一段时间的单步跟踪和调试,我们来到了以下位置:

从跳转目标的地址可以看出,这是一次跨段跳转,跳转目标位于.text段,单步再次运行到宿主程序的OEP处。

从这个简单的调试跟踪经验我们可以知道,通常shell的Stub部分和宿主程序的代码段往往不在同一个段,所以当我们发现Stub部分指向宿主程序的时候Stub部分所在的节当代码段跨段跳转时,说明我们已经找到了OEP。

虽然对于这些简单的压缩shell来说,有一个更简单的方法可以找出它们的OEP,那就是在.text部分设置一个断点作为执行断点,因为大多数压缩shell都会在解压宿主程序后泄露秘密后的第一件事是运行宿主程序,所以执行断点断的地方通常是前一个程序真正的OEP。

2.使用堆栈平衡

程序将Stub部分嵌入宿主程序后,必须保证Stub部分中运行的代码不会影响宿主程序的正常运行。 其实,要保证宿主程序的正常运行,需要注意的问题有很多,但最基本的一点就是处理好堆栈平衡的问题。

为了保证这一点,很多shell都分别为Stub部分的进入和退出添加了pushad/pushfd和popad/popfd指令。 这两条指令的作用是保存寄存器状态和恢复所有寄存器状态。 因此,这两对指令成为许多shell的进入和退出特征,比如最典型的UPX shell。

根据这个原理,世界上的专家总结出了经典的“ESP定理”,即“程序开始运行时的堆栈状态与主机程序解压后开始运行时的堆栈状态一模一样,所以当程序开始运行时, ESP 的值与解压解密后宿主程序开始运行时 ESP 的值完全相同。

我们都知道ESP寄存器大多数情况下保存的是当前栈顶的地址,所以如果程序严格遵循栈平衡原则,那么它执行完Stub子程序后就准备好跳转到宿主程序了对于执行来说,ESP指向的栈顶应该与程序第一次开始运行时的栈顶相同。 这为我们提供了一种非常简单的方法来找到程序的真正 OEP。

我们以添加了ASPack的Demo2.exe为例,使用OllyDbg打开它,并在ESP处设置硬件访问断点,如图3所示。

电脑软件脱壳工具_电脑脱壳软件教程_教程脱壳电脑软件有哪些

图3 在ESP指向的地址处设置硬件断点

现在我们已经在程序开始运行时ESP指向的地方设置了硬件断点。 根据堆栈平衡理论,当Stub程序完成所有工作并打算执行宿主程序时,这里的硬件断点就会被阻塞。 扳机。 我们直接按F9键运行程序。 此时,程序中断到以下位置:

教程脱壳电脑软件有哪些_电脑脱壳软件教程_电脑软件脱壳工具

从上面的代码可以看出,触发我们硬件断点的是指令popad。 单步执行5次,从retn命令返回后,就到达了宿主程序的OEP。

3.使用编译语言特性

熟悉不同语言、不同编译器的OEP特性非常重要,但这只是最基本的步骤。 另外,我们还可以结合OllyDbg调试器的功能特点,利用我们的方法在适当的时候快速定位到真正的OEP。 的位置。

简单来说,OllyDbg在这里可以为我们提供两个方便的功能:一是搜索功能;二是搜索功能。 另一个是调试功能。

(1)借助OEP快速定位

我们借助搜索功能进行搜索,第一步就是提取。 以VC2010程序为例,我们以前5行反码为例,如下:

电脑脱壳软件教程_电脑软件脱壳工具_教程脱壳电脑软件有哪些

得到逆指令后,我们要将HEX部分的地址常量替换为“?”,因为这个地址在不同的程序中会发生变化,键值“?” 在 OllyDbg 中搜索时可以表示任何字符。 替换后的结果如下:

电脑脱壳软件教程_教程脱壳电脑软件有哪些_电脑软件脱壳工具

然后我们去掉地址信息和反信息,只留下HEX信息。 清洗后的结果如下:

电脑软件脱壳工具_教程脱壳电脑软件有哪些_电脑脱壳软件教程

最后将其整合为一行,并消除中间的空格,就完成了我们的提取工作。 最终结果如下:

这样,当我们确认之前的宿主程序是使用VC2010开发的,并且Stub部分已经解压了宿主程序时,就可以按快捷键Ctrl+B进行二补查找了,如图4.

电脑软件脱壳工具_教程脱壳电脑软件有哪些_电脑脱壳软件教程

图4 搜索特征代码

这些方法其实前期比较冗​​长,但是仍然是比较准确的查找方法。 然而,使用这种方法的时机非常重要。 搜索之前,请确保宿主程序的OEP已经解压并显示,否则可能什么也找不到。

(2) 借助关键API快速定位OEP

不同语言、不同编译器的OEP调用的第一个API函数是不同的,基本上都是一些初始化和获取系统环境信息的API,而这类API在普通shell的Stub部分比较常见。 稀有的。 因此,我们可以对这个API进行总结,设置相应的API断点,这样程序每次调用这个API都会被断掉。 我们通过堆栈回溯找到调用代码,并判断其是否满足OEP的特性。 而且,并不是每个API的第一次调用都会发生在OEP附近,有的会隐藏在OEP附近的一次调用中,这就需要我们在查找的时候要注意技巧,要熟悉不同语言、不同环境下OEP的特点。编译器。 下表是关键 API 比较表的摘要。

教程脱壳电脑软件有哪些_电脑脱壳软件教程_电脑软件脱壳工具

此比较表中关键 API 的位置不同。 如果你想熟练使用这个表,你需要自己调试每个程序的OEP部分,总结有用的经验。

4.使用跨段跳转

借助截面跳跃来寻找真正的OEP的想法与背后的想法类似。 大多数shell在向宿主程序植入Stub时需要构建一个新的section,并改变程序的入口点指向Stub所在的section,这样Stub部分就可以放在宿主程序中执行之前,先获得执行权限,从而在宿主程序上完成医学放疗等各种治疗。

但这不可避免地会产生Stub部分和宿主程序之间的代码分离问题。 如果想在Stub执行完毕后将执行权转移给宿主程序,就必须使用跨段跳转,而这个特性恰恰可以被接收方使用。

由于跨段跳转是跨段的,所以跳转的目标地址和跳转指令的地址往往不在同一个显存页上。 我们以OllyDbg中Demo1.exe的显存布局为例,如图5所示。

电脑软件脱壳工具_教程脱壳电脑软件有哪些_电脑脱壳软件教程

图5 OllyDbg中Demo1.exe的内存布局

从图5可以看出,主机程序代码在显存中的地址范围是0x00401000~0xx0040900409FFFF,而Stub在显存中的地址范围是0x00411000~0xx0040100401FFFF。 大到0x00010000,这样的长距离跳转在正常程序中很少出现。

如果位于.A1Pass段的Stub在执行相关操作后需要跳转到位于.text段的宿主程序,那么必然会出现跨段的长距离跳转。 在大多数操作中,它将成为投资者寻找真正OEP的“金钥匙”。

至于如何找到这个跳跃,就要考验功力和能力了。 这些方法论技巧只能从不断的实践中总结出来。

2.转储显存图像

轮询显存镜像(Dump)也称为转储显存镜像或抓取显存镜像,但国外软件安全界的通用昵称仍是英文Dump。

Dump操作将显存中映射的图像文件根据段表的信息保存成文件。 转储操作是显存映射到文件的逆向行为,也是将成功解压并显示的原始程序保存在显存中的必要步骤。

整个工作中,Dump的执行情况直接决定了团队的成败。 如果在Stub部分完全解压并显示之前转储宿主程序,则转储的原始程序将无法运行,因为其部分内容尚未显示; 如果在运行一段时间后将原始程序转储,那么转储的原始程序的数据段可能已经包含了一些特定的初始化信息,这将导致程序运行不稳定。

因此,最佳的转储时间是Stub部分刚刚跳转到OEP的时候。 此时Stub已经完成了它应有的任务,原来的程序还没有被执行,所以它的数据段的所有信息仍然可用。 保持初始化状态。 此时转储程序的数据特征最接近之前的状态。

有很多常用的软件可以进行Dump操作,包括著名的编辑工具LordPE和PETools,但OllyDbg中的一个插件OllyDump也可以进行此操作。

我们以LordPE为例来讲解Dump操作。

首先我们需要使用OllyDbg等工具来运行目标程序,即让程序运行到真正的OEP,然后打开LordPE选择我们调试的目标软件进程,右键,在弹出的窗口中选择dumpfull -up快捷菜单,如图6所示。

电脑脱壳软件教程_电脑软件脱壳工具_教程脱壳电脑软件有哪些

图6 使用LordPE进行转储操作

3.重建导出表

软件诞生之初,并没有加密外壳的概念。 正是因为导出表技术的诞生,软件才有了压缩壳和加密壳的定义。 到明天,对导出表进行必要的处理已成为大多数 shell 的默认选择。

对于这些动了导出表肢体的炮弹,虽然我们顺利完成了,但是程序却无法正常运行。 由于我们的导出表损坏了,所以必须将其修复后,后续程序才能正常运行。

在导出表中起关键作用的结构是IAT。 从设计的角度来看,由于IAT在数据目录表中占有一席之地,即使IAT逻辑上是导出表的一部分,设计者也应该将其视为一个单独的结构。 而IAT是导出表中唯一与程序运行密切相关的结构。 正因为如此,很多人直接把“重建导出表”称为“修复IAT”。

1.导入表重构原理

导出表中与程序运行密切相关的结构是IAT,用于保存导出API的实际地址。 在开始运行时,系统会根据导出表中导出的模块名称和API函数名称获取对应API的当前地址,并将这些地址按照对应的顺序存储在IAT中。 程序运行时只需要使用IAT提供的API地址即可,因此只要IAT中存在正确的API函数地址,显然是没有导出表的,不会影响正常运行的程序。

软件利用该功能备份原导出表的关键信息并删除原导出表,然后通过模仿Stub部分运行时系统加载PE的操作来填充IAT,从而保证宿主程序在丢失导出表后仍能正常运行。

重建导出表是一个从IAT信息推导导入导出表的过程,因为IAT中保存了对应API的地址电脑脱壳软件教程,所以只需要遍历进程空间中所有加载模块的导入表信息即可获取重建导出表所需的模块名称和API函数名称等信息,有了这些信息,重建导出表所需的所有数据就已经有了。

其实重建导出表的过程比较复杂,但这不是我们讨论的范围。 我们只需要知道什么时候应该重建导出表以及重建导出表的原则就足够了。

2.使用importREC重建导出表

importREC是目前最好的导出表重建工具,它为我们提供了多种修复输入表的可能性,使我们可以用它从杂乱的IAT中重建一个新的输入表。 并且importREC的使用有一些先决条件。

首先,我们最好完成目标文件并停止在真正的OEP处,但在整个重建导出表的工作中保持这种状态,以便importREC能够更好地读取目标程序信息的IAT。

其次,我们需要从显存中转储现有的目标文件并将其另存为文件。

我们以带有 UPX shell 的文件 Demo3.exe 为例,说明如何使用 importREC 以及基本的导出表重建步骤。

我们首先使用 OllyDbg 在真正的 OEP 处暂停 Demo3.exe。 记录完地址0x00401357后,我们进行dump,保存的文件名暂定名为Dump.exe。 经测试,从Dump下载的程序Dump.exe难以运行。

然后我们运行importREC并选择正在调试的进程Demo3.exe,如图7所示。

电脑脱壳软件教程_电脑软件脱壳工具_教程脱壳电脑软件有哪些

图7 选择正在调试的进程Demo3.exe

拿出来输入我们上面记录的OEP地址,然后点击自动搜索按钮。 如果出现标题为“Foundsomething!”的提示框此时弹出,说明我们提供的OEP可能是正确的,您可以尝试进行下一步,如图8。

教程脱壳电脑软件有哪些_电脑脱壳软件教程_电脑软件脱壳工具

图 8 使用 importREC 手动搜索 IAT 的功能

我们按照提示“Try'Getimport'”操作。 点击Getimports按钮,让importREC分析IAT的结构并获取基本信息,如图9所示。

教程脱壳电脑软件有哪些_电脑脱壳软件教程_电脑软件脱壳工具

图9 使用importREC分析IAT得到的导出信息

由于本例中的所有API函数都能被正确识别,因此无需进行其他操作。 如果发现任何无法识别的信息,则最后的条目将显示为有效:NO。 这时,我们需要点击AutoTrace按钮,对API路径进行手动追踪,从而修复并过滤掉不正确的导出信息。

最后我们点击FixDump按钮,在弹出的对话框中选择我们上面转储的文件Dump.exe,importREC就会生成一个修复导出表的文件Dump_.exe,从而完成了修复操作整个导出表。

四。 结论

本文讲解了一些技术基础知识,其中如何寻找OEP是最重要的内容。 我们依靠这项技术脱掉了目前市场上流行的大部分外壳。

但工作中涉及到的shell主要是加密的shell。 根据外壳类型的不同,所采用的反调试和反技术也有所不同。 这方面的知识需要在实战中逐步练习。

相关内容 查看全部