UPX4.1.0 使用x64dbg手动脱UPX壳

UPX4.1.0
本文选用的壳是4.1.0的UPX壳
脱壳
样例文件
将加壳的exe文件拖入
打开符号,进入第一个.exe
进入后在第一个位置下断点,按下F9运行

UPX4.1.0  使用x64dbg手动脱UPX壳

文章插图
继续按下F9
单步运行到此处 , 发现只有RSP变红,根据ESP定律,进行下面的操作
所谓定律就像墨菲定律,想表达事物规律往往是这样的
ESP定律就是当只有ESP(RSP)变红,变红就是值发生了改变,这时候找到ESP所指向的内存位置,打一个硬件断点,按下F9运行到停下的位置 , 这个位置后面一般有一处跳转,完成跳转之后的地方就是OEP(程序真正的入口点)
我们按照这个定律操作一下
打断点cc
打好断点后运行,停在了此处
我们在紧跟的跳转处设断,运行
UPX4.1.0  使用x64dbg手动脱UPX壳

文章插图
F7单步运行进行跳转
这个位置就是OEP
在此处用插件进行dump就可以了,就是点击转储
dump文件是什么意思?
就是将加载到内存的模块的完整数据保存到文件中 。相当于模块内存的一个拷贝
因为在加了壳的程序中,原代码和数据是以加密或压缩的形式存放在文件中,执行到OEP的时候,跑完了壳这个解密或解压缩的程序,内存中的代码已经还原,此时dump内存中的数据就可以得到完整的源代码和数据 。
如果你是要用IDA反编译exe,此时点击转储就可以实现了,指令已经恢复了
但是程序还不能正常运行,需要修复IAT
【UPX4.1.0使用x64dbg手动脱UPX壳】修复IAT
IAT(Table)和 API()是在程序开发和执行过程中密切相关的概念 。
IAT 是一种数据结构 , 常见于可执行文件或动态链接库(DLL)中,用于记录程序运行时所需的外部函数或符号的地址 。当程序运行时 , 它需要调用其他模块中的函数或符号来执行特定的操作,例如文件读写、网络通信或图形绘制等 。而这些外部函数或符号的地址可以在编译时无法确定,因为它们位于其他模块中,可能在程序运行时才被加载到内存中 。