

使用x64dbg脱壳的开源Shell upx
大家好,我是Blue Iron,您的旧铁,^ _ ^
我们知道,在分析病毒时,最常见的外壳类型是upx. 使用upx的优点是压缩率非常好,原始程序可以加倍以便在网络上轻松传输. 本节以开源shell upx为例,说明x64dbg中的拆包方法.
首先,让我介绍与脱壳有关的概念.
拆包是软件逆向工程中相对困难的技术,并且有很多方法. 我将首先介绍代表性的方法:
单步跟踪(实用方法)
逐步分析每个汇编指令,了解每一行汇编背后的含义,阅读shell代码,找到原始OEP并将其解压缩. 这种方法是最训练,最困难的. 即使有经验的逆向分析人员分析不熟悉的打包程序,也要花费很多时间,但这是逆向工程的魅力. 挑战自己,挑战突破. 通常,当我们正在学习逆向工程或无法使用技能时,将使用此方法. 耐心是此方法的关键.
平衡堆栈(也称为ESP法,技能方法)
通常,打包程序运行时,它将首先执行外壳程序代码upx壳分析,然后将原始程序还原到内存中,然后跳回原始OEP以执行原始程序的代码. 我们可以将Shell代码理解为一个大函数,因为它是一个函数,所以在进入函数和退出函数时应平衡堆栈. 基于此功能,我们可以在Shell代码操纵堆栈之后在堆栈上设置访问断点,然后让程序运行. 当程序暂停时,即要执行外壳程序代码,然后在其附近进行单步跟踪时,您可以找到原始的OEP. 此方法更适合仅压缩代码和数据的upx. 如果代码也已加密,则很难找到. 加密需要结合单步跟踪方法.
三步脱壳方法
无论哪种脱壳方法,都需要遵循三步脱壳方法,分为以下三个步骤:

①寻找原始OEP
此步骤的主要功能是确定原始程序代码在哪里. 如果可以找到原始程序代码,则表示已执行外壳程序代码. 只有找到原始的OEP,我们才能继续进行下一步.
②将内存转储到文件
找到原始OEP并调试并运行到原始OEP时,只要恢复了代码,我们就可以在此位置转储内存,在内存中获取恢复的代码和数据,然后再次将其保存到一份文件. 当外壳完成时,我们可以使用静态分析工具来分析程序.
③修复文件
此步骤主要是修复IAT,修复从内存转储到本地的文件.
下载upx
upx shell的官方网站是:
下载最新版本的upx:
此实验使用Windows版本的upx,因此下载的版本为:

使用upx打包文件

下载后,解压缩并打开主程序upx.exe以查找upx打包程序. 我们可以打包任何程序,并使用命令行打包.
以以VC6.0编写的程序为例进行打包. 在打包之前,让我们使用x64dbg检查其OEP:

您能观察到OEP的特征吗?
然后我们使用命令行打包vc6.0演示程序

您可以看到打包后文件大小已从200K更改为90K以上.
打包后使用x64dbg观察程序的OEP:

可以发现打包后的过程与打包前的过程确实不同,因此我们必须解压缩.
有许多方法可以解决OEP. 在这里,我们使用前面介绍的平衡堆栈方法. 我们使用x64dbg调试打包的程序并遵守oep上的说明. 您会发现OEP的第一条指令是pushad. 该功能通常是为了节省寄存器环境,并且可以将8个通用寄存器压入堆栈,然后我们可以单步执行程序(F8)并执行pushad,以便更改堆栈,然后我们可以在堆栈顶部,即ESP指向. 在内存中,设置硬件访问断点,

我们可以在x64dbg的寄存器窗口中选择esp,然后右键单击以选择并转到内存窗口

然后在内存窗口中,右键单击以设置硬件访问断点

然后,您可以使用快捷键F9运行该程序,该程序将再次暂停,让我们观察附近的命令

可以发现popad指令在我们暂停的指令上方. 通常,遇到popad指令时,它与原始OEP并不遥远,因为执行popad指令意味着Shell代码已经结束.
继续单步操作,您可以找到更大的jmp跳跃. 实际上,此jmp会跳到原始OEP.

实际上,在分析过程中,我们首先进入了jmp跳转到的代码,并观察它是否是原始的OEP. 这部分要求我们了解解压缩程序的OEP. 例如,VC6.0程序通常在OEP开始时调用GetVersion. 在OEP中看到GetVersion就像看到vc6.0程序一样.
我们跳转到409376之后的代码,这是原始的OEP,然后我们要做的就是在此转储.
找到原始的OEP后,运行到此处,然后转储当前程序的内存,我们需要在x64dbg中使用一个插件: Scyla.
打开插件Scylla

使用快捷键Ctrl + I直接打开用于转储的插件.
使用Scylla

请注意,转储时需要填写正确的原始OEP地址,然后单击“转储”按钮以保存文件.

保存后,最后一步是修复文件.
修复文件实际上是在修复IAT,因此我仍然使用插件Scylla首先扫描当前程序的IAT. 如果可以找到它,则可以使用该工具修复它;如果找不到,则需要手动修复.
为了更好地访问IAT,我们需要设置插件Scylla.
最后,我们可以运行已解压并修复的程序,首先使用PEID检查该部分,然后运行.

拆包技术在任何平台上都是一项困难的技术. 要实践该技术,除了非常熟悉汇编语言外,您还需要熟悉可执行文件的格式upx壳分析,并且对可执行文件的加载过程仍有一定的了解. 例如,在本节中,我们讨论了一个术语,即修复IAT. 只有了解了可执行文件的加载过程,您才真正了解修复IAT的过程. 总而言之,拆包技术的实践是一项全面的实践. 让我们从Upx开始,逐步分析当前的主流病毒混淆外壳!我希望每个人都可以跟随我并尝试练习^ _ ^.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-285532-1.html
啊啊啊啊啊啊啊啊啊啊啊啊