本文主要是介绍使用x64dbg手动脱UPX壳(UPX4.1.0),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
UPX4.1.0
本文选用的壳是4.1.0的UPX壳
脱壳
样例文件
将加壳的exe文件拖入x64dbg
打开符号,进入第一个sample.exe
进入后在第一个位置下断点,按下F9运行
继续按下F9
单步运行到此处,发现只有RSP变红,根据ESP定律,进行下面的操作
所谓定律就像墨菲定律,想表达事物规律往往是这样的
ESP定律就是当只有ESP(RSP)变红,变红就是值发生了改变,这时候找到ESP所指向的内存位置,打一个硬件断点,按下F9运行到停下的位置,这个位置后面一般有一处跳转,完成跳转之后的地方就是OEP(程序真正的入口点)
我们按照这个定律操作一下
打断点cc
打好断点后运行,停在了此处
我们在紧跟的跳转处设断,运行
F7单步运行进行跳转
这个位置就是OEP
在此处用插件进行dump就可以了,就是点击转储
dump文件是什么意思?
就是将加载到内存的模块的完整数据保存到文件中。相当于模块内存的一个拷贝
因为在加了壳的程序中,原代码和数据是以加密或压缩的形式存放在文件中,执行到OEP的时候,跑完了壳这个解密或解压缩的程序,内存中的代码已经还原,此时dump内存中的数据就可以得到完整的源代码和数据。
如果你是要用IDA反编译exe,此时点击转储就可以实现了,指令已经恢复了
但是程序还不能正常运行,需要修复IAT
修复IAT
IAT(Import Address Table)和 API(Application Programming Interface)是在程序开发和执行过程中密切相关的概念。
IAT 是一种数据结构,常见于可执行文件或动态链接库(DLL)中,用于记录程序运行时所需的外部函数或符号的地址。当程序运行时,它需要调用其他模块中的函数或符号来执行特定的操作,例如文件读写、网络通信或图形绘制等。而这些外部函数或符号的地址可以在编译时无法确定,因为它们位于其他模块中,可能在程序运行时才被加载到内存中。
这篇关于使用x64dbg手动脱UPX壳(UPX4.1.0)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!