首页
论坛
课程
招聘
[翻译]IDA + Bochs 调试器插件进行PE+ 格式DLL脱壳
2011-7-18 09:42 12996

[翻译]IDA + Bochs 调试器插件进行PE+ 格式DLL脱壳

obaby 活跃值
20
2011-7-18 09:42
12996
IDA + Bochs 调试器插件进行PE+ 格式DLL脱壳

By :obaby

在IDA Pro6.1中我们扩展了Bochs调试器插件,现在已经可以进行64位代码段的调试。在IDA Pro 6.2版本中将有可能实现PE+ 可执行程序的动态调试。由于程序将会在Bochs系统中执行,因而在调试的过程中我们并不需要实际的64位操作系统,因而在实际的调试过程中可以从任何的32位或者64位的Linux,Mac OS 或者Windows操作系统中使用IDA Pro进行64位可执行文件的调试。
为了确认这一项新的功能,我们将进行PE+格式的一个木马程序进行脱壳并且进行一个大体的分析,这个文件是由MATCODE Software公司的mpress进行压缩的。我们将会对讲解DLL文件脱壳,修复输入表并且最终修复数据库来进行分析。

Unpacking the DLL
我们的目标文件是一个木马的DLL文件,该文件被杀软识别为“Win32/Giku”。我们从使用idaq64载入DLL文件开始进行分析,载入之后按Ctrl+S键打开区段窗口:

打开区段窗口之后注意观察区段的名称和mpress压缩壳设置的区段的属性。
为了进行DLL文件调试需要确保在启动之前已经设置调试器的选项设置(“Bochs debugger plugin”)为PE 和64bit emulation 模式。

在启动调试器之后,注意观察下面的代码段,在这段代码中调用了unpack()函数:

如果我们继续单步执行到更远的地方我们将会到达修复输入表的代码处,为了实现输入表的修复程序将会循环调用LoadLibrary()/GetModuleHandle()函数并且在这个循环中会包含另外的一个子循环调用GetProcAddress()。Mpress外壳通过这两层循环来实现IAT修复:

在stosq执行之后我们将可以从rdi寄存器中得到IAT结构的起始地址,同样在两层循环全部结束之后我们可以从rdi寄存器中得到IAT结构的结束地址。
在IAT修复之后不远的地方我们可以找到一个跳转到原始入口点的jmp代码:

程序的入口点代码如下所示:

这里就是脱壳之后的程序的真实的DllEntryPoint()函数了。现在有了程序的OEP和IAT结构的起始/结束地址,我们就可以清空数据库并且重现脱壳之后的程序了。
Reconstructing and cleaning the database
到这里有许多的办法在程序脱壳之后进行清理数据库清理.通常会包含如下几步:
1.        定位IAT并且创建一个额外的区段来重现程序的输入表;
2.        删除外壳代码的入口点,并且添加脱壳之后程序的原始入口点OEP;
3.        重新分析代码;
4.        重新加载FLIRT特征库
5.        删除无用的外壳区段(可选)
其中第一步到第三步可以通过IDA的uunp插件来自动完成,执行菜单中的“Edit/Plugins/Universal unpacker manual reconstruct”即运行该插件:

在插件中填入通过上面的操作得到的数据即可:

点击确定之后一个新的区段将会被创建,并且代码段将会被重新分析,在分析完成之后脱壳之后的程序的一个内存快照将会被呈现出来。
现在我们就可以重新引用FLIRT特征库了:

在选择“vc64rtf”签名(shift +F5)之后我们可以看到IDA已经成功的识别出了库函数并且对这些库函数使用浅蓝色进行了标记,这样可以使得后续的分析工作变得更加简单。
Analyzing the unpacked code
在代码解压之后我们可以通过String Window窗口进行一个快速分析,String Window窗口呈现了一些加密的字符串:

通过交叉引用,我们可以定位到解密函数。在给函数适当的参数之后我们可以直接通过Appcall来解密这些字符串:

我们得到了一个指向加密的文本文件的URL。在深入挖掘之后我们定位到了解密文件的函数:

下面是Appcall版本的decrypt_file()函数:

我们使用这个函数就可以解密spm.txt文件了,解密之后的内容如下所示:

X32.jpg是一个upx压缩的DLL文件,x64.jpg是一个mpress压缩的PE+格式的Dll文件。

好了文章到此结束,欢迎评论!
PDF下载:
实战IDA PE+ DLL脱壳.pdf

[注意] 招人!base上海,课程运营、市场多个坑位等你投递!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (13)
雪    币: 199
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
游戏蛀虫 活跃值 2011-7-18 10:24
2
0
还有沙发啊  顶一个
雪    币: 199
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
游戏蛀虫 活跃值 2011-7-18 10:28
3
0
不过我在想 要是 加了反调试 加了 stroing code  等等手段
不过可能还OD脱壳一样的吧  有木有优势
雪    币: 1834
活跃值: 活跃值 (15)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
yingyue 活跃值 2011-7-18 12:27
4
0
翻译辛苦了,收下
雪    币: 14254
活跃值: 活跃值 (1917)
能力值: ( LV15,RANK:880 )
在线值:
发帖
回帖
粉丝
obaby 活跃值 20 2011-7-18 12:55
5
0
目前还没有64位的od,另外,使用上面的调试方法避免了系统被病毒损害的风险。
雪    币: 199
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
游戏蛀虫 活跃值 2011-7-18 13:05
6
0
  点评不错  顶
雪    币: 5769
活跃值: 活跃值 (416)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
b23526 活跃值 2011-7-18 14:35
7
0
好啊,顶楼主了
雪    币: 49
活跃值: 活跃值 (16)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
邓韬 活跃值 9 2011-7-23 22:01
8
0
文章的顺序写的不错,非常适合我等练手!
雪    币: 20
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
流逝在夏 活跃值 2011-7-24 09:39
9
0
纯支持下
雪    币: 107
活跃值: 活跃值 (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yangya 活跃值 2011-7-24 11:32
10
0
这个比较强大啊~~
雪    币: 3454
活跃值: 活跃值 (929)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
sunsjw 活跃值 1 2011-7-24 12:16
11
0
Bochs debugger plugin 楼主给一个这个插件。
雪    币: 147
活跃值: 活跃值 (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xingjunjie 活跃值 2011-7-24 20:12
12
0
学习一下
雪    币: 14254
活跃值: 活跃值 (1917)
能力值: ( LV15,RANK:880 )
在线值:
发帖
回帖
粉丝
obaby 活跃值 20 2011-7-25 09:10
13
0
直接从bochs官方网站下载安装就可以了。http://bochs.sourceforge.net/getcurrent.html
雪    币: 30
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
NISL 活跃值 2012-7-16 15:44
14
0
必须是IDA Pro 6.2才能进行DLL调试吗?IDA 6.1可以不?bochs该怎么配置呢?我正急着用IDA动态调试DLL呢?楼主能告诉我吗?要是有IDA Pro 6.2的话能发给我吗?邮箱176216364@qq.com  非常感谢!
游客
登录 | 注册 方可回帖
返回