IDA + Debug 插件 实现64Bit Exe脱壳
By :obaby
对于64位的可执行程序已经搞了好长一段时间了,但是却一直没有写点什么东西。前面的两篇文章仅仅是单纯的翻译,个人认为不管是32位还是64位的程序脱壳只要能到达程序的OEP就可以了。现在支持64位加壳的程序貌似也不多,这里以mpress压缩的64位系统下的64位notepad为例进行简单的演示。在《IDA + Bochs 调试器插件进行PE+ 格式DLL脱壳 》一问中提到了可以使用bochs调试器进行DLL文件脱壳。但是却没有办法进行64位EXE文件调试,启动调试之后由于代码完全识别错误,因为会出现异常导致无法调试。要想调试64位可执行程序目前只有通过远程调试的方式,使用Windbg插件同样是无法进行调试的。但是用windbg调试时将会提示如图1所示的信息:
图1
而直接运行dbgsrv启动的其实是和ida内置的远程调试插件差不多的一个服务。命令行参数如图02所示。
图2
因而在实际的调试过程中还是一个远程调试模式。至于具体的用法感兴趣的可以看下windbg的帮助文件,里面有详细的介绍。
这里就直接以IDA的远程调试程序进行吧,由于是本机调试,并且本地系统是64bit win7所示直接运行win64_remotex64.exe启动调试器即可,启动之后界面如图3所示。
图3
在IDA中将调试器设置为Remote Win32 Debugger,入股4所示。
图4
此时就可以F9运行程序了,由于这里没有配置调试器选项因而在启动的时候会出现一些提示信息,全部点掉之后将会打开如图5所示的进程调试设置窗口,在Hostname中输入本机IP地址,端口中输入服务器监听的调试端口。如果服务器不再本地则直接输入服务器的IP,通过这种方式可以在32位系统上进行64位程序的调试,这不是本文的重点就不再介绍了。
图5
在启动之前最好在程序的入口点设置一个断点,否则程序就会直接启动了。启动之后将会停留在如下的代码处(已经设置断点)
图6
F8单步执行到如下代码处之后一切就比较明朗了。
图7
往下看可以看到一个跳转到不知道什么地方的jmp跳转,对于压缩壳比较熟悉的应该知道这个就是跳转到入口点的Jmp了。
图8
其实使用ida进行调试的最大的好处就是看到的代码会比较直观,程序的流程一目了然。而这些代码如果在od中查看的话可能直接单步调试的话会更好一些。
直接在0000000100035E66 jmp near ptr unk_10000B770,一行设置断点然后F9运行即可。其实通过后面的地址也可以知道跳转到的地址IDA分析失败了,因而会显示unk前缀,如果跳转到这个地址看到的应该是一片乱码,如图9所示。
图9
这是因为程序自身的代码还没有解压,所以看到的是一片空白的区域。直接F9执行到0000000100035E66 jmp near ptr unk_10000B770一行之后再进行F8单步一次就到达了程序的原始OEP了,如图10
图10
到这里就可以进行脱壳了,需要注意的是这里原来已经熟悉的32位的脱壳工具都不再适用了,需要使用64位的工具。运行CHimpREC 64,程序界面如图11所示。
图11
在附加进程中选择Notepad.exe,选择之后首先要执行dump进行转存,这个比较简单一些。将内存镜像保存为exe即可。最后就是IAT的修复了,这里与32位系统的操作基本一致。
可以先点击IAT auto search,如果查找成功将会出现如图12所示的提示信息。
图12
然后点击Get Imports获取输入表。
图13
点击show invalid去掉或者修复无效的函数,最后fix dump即可。脱壳之后的程序比原始程序稍微大了一点。
图14
但是程序正常运行还是没有问题的的。呵呵。说实话本文没什么技术含量,让大家见笑了。