OllyDBG是目前最伟大的三环软件调试器,而Immunity Debugger则是一款与OllyDBG有极大关系的软件调试器。
2007年8月9日,Immunity公司的Nico在Immunity官方主页和
论坛以及其他逆向论坛发布了Immunity Debugger V1.0,正式宣告OllyDBG兄弟调试器的诞生。根据Nico等人言论猜测,Immunity Debugger是Immunity公司购买了OllyDBG
源码再次开发的商业软件。Immunity Debugger相比于OllyDBG V1.10,最大的亮点是ImmDBG集成了
Python作为其内置脚本插件;另外Immunity Debugger也修正了OllyDBG V1.10的一些bug,如Armadillo V4.X使用Armadillo导致OllyDBG崩溃、Themida V1.8.X利用浮点指令导致OllyDBG崩溃等。
OllyDBG的强大也体现在其众多插件的功能扩展支持上,但Immunity Debugger刚发布没多久,很多OllyDBG的经典插件还不支持Immunity Debugger。由于Immunity Debugger其实是OllyDBG的复制后升级版,因此OllyDBG V1.10的很多插件只要简单修改即可直接提供给Immunity Debugger V1.30使用。当然,随着Immunity Debugger的不断升级,不排除以后插件不再兼容的情况。
根据插件有无源码的情况,我们可以将其分为:有源码的OllyDBG插件可以重新编译成为ImmDBG插件;无源码的OllyDBG插件可以手动修改成为ImmDBG插件。
本文就将简单介绍一下如何手动修改OllyDBG插件使其支持Immunity Debugger。虽然CleanupEx插件有源码,不过为了演示另类DLL避开重定位表修改处理方法,还是以它作为演示目标了。
目标文件:CleanupEx.V1.12.108.by.Gigapede
插件用途:CleanupEx插件用于清理OllyDBG调试时产生的UDD文件,不需要进入UDD目录手动删除。
寻找修改点
1)用LordPE打开OllyDBG.exe,点击“Directories”,查看其输出表,如图1所示。
图1
2)用LordPE打开ImmunityDebugger.exe,点击“Directories”,查看其输出表,如图2所示。
图2
大家可以看到,OllyDBG和ImmDBG主程序的输出表基本就只是NameString不同,函数名都一样。当然,这是目前的情况,随着OllyDBG和ImmDBG的各自升级发展,它们有可能会越来越有变化,从而分道扬镳。
3)用LordPE打开OllyDBG插件CleanupEx.dll,查看其输入表,如图3所示。
图3
4)用LordPE打开OllyDBG插件CleanupEx.dll,查看其输出表,如图4所示。
图4
5)用LordPE打开ImmDBG自带插件Cmdline.dll,查看其输出表,如图5所示。
图5
6)用LordPE打开ImmDBG自带插件Cmdline.dll,查看其输入表,如图6所示。
图6
7)确定修改点。此处要注意,大家仔细观察OllyDBG插件CleanupEx.dll与ImmDBG自带插件Cmdline.dll的输出表和输入表信息,可以看到其实函数名基本相同,就是某些关键字有异,把OllyDBG插件的输出表和输入表的某些关键字修改即可。具体修改如下:
一是修改插件的输出表函数关键字“_ODBG_”为“_IMMDBG_”,如将_ODBG_Plugindata修改为_IMMDBG_Plugindata,全部输出表函数都要修改;二是修改插件的输入表DllName关键字,将OLLYDBG.EXE修改为IMMUNITYDEBUGGER.EXE。
开始修改
1) 修改OllyDBG插件输入表的关键字
用CFF Explorer打开OllyDBG插件CleanupEx.dll,点击“Import Directory”,可以看到DllName的OLLYDBG.EXE的RVA=000102E0,如图7所示。点击“Address Converter”,填入RVA=000102E0,显示File Offset=0000CEE0,如图8所示。很显然,要把0X0000CEE0处的OLLYDBG.EXE修改为IMMUNITYDEBUGGER.EXE的话,空间是不够的,不能占用后面其他DllName的空间,那么我们就另找空白地方吧。
图7
图8
向下拉动滚动条,输入表下面0X0000D460处是空白空间,可以使用。我们写入“IMMUNITYDEBUGGER.EXE”字符再计算一下File Offset=0X0000D460的RVA是多少,如图9所示。可知File Offset=0X0000D460的RVA=00010860。
图9
点击“Import Directory”,修改DllName之OLLYDBG.EXE的RVA=00010860,如图10所示。至此,输入表关键字修改就完成了,将其另存为CleanupEx1.dll。
图10
2)修改OllyDBG插件输出表的关键字
输出表中的_ODBG_Plugindata等字符中关键字_ODBG_需要修改为_IMMDBG_,___CPPdebugHook不需要修改。由于_IMMDBG_比_ODBG_长2个字节,原来的空间不够,我们就使用其下空白处放替换关键字后的新输出表吧,如图11所示。此处要注意,记得修改新输出表的各Name RVA,使其指向新的Name。修改后另存为CleanupEx.V1.12.108.for.ImmDBG.dll文件。
图11
之后再用CFF Explorer查看CleanupEx.V1.12.108.for.ImmDBG.dll修改后的输出表,看看是否修改成功,如图12所示。这样一来,插件的输出表和输入表就都修改好了。
图12
一般的OllyDBG插件这样修改后就能成为ImmDBG的插件了,如Asm2Clipboard插件、OdbgScript插件、IsDebug插件、OllyDump插件和ustrref插件等。但是我们把刚才修改后的CleanupEx.V1.12.108.for.ImmDBG.dll放入ImmDBG插件目录,运行ImmunityDebugger.exe,插件可以成功加载,但是使用删除UDD文件的功能却失效了。奇怪,为何此插件如此修改后还不行呢?
另类DLL避开重定位表修改处理
原来是CleanupEx插件需要在OllyDBG.ini配置文件中读取Plugin和UDD路径信息,而CleanupEx插件在代码中写定了“OllyDBG.ini”,所以还需要把这个修改为ImmDBG的配置文件名,也就是说把CleanupEx插件代码中写定的“OllyDBG.ini”修改为“ImmunityDebugger.ini”即可。
1)调试OllyDBG插件CleanupEx.dll
使用OnlyDBG.Modfy.By.fly[CUG].exe载入带有CleanupEx插件的原版OllyDBG.exe,下面我们开始调试吧。输入“BP GetPrivateProfileStringA”设置断点,中断后的代码如下。
0311131C E8 03240000 call 03113724
03111321 83C4 08 add esp,8
03111324 8D4B 38 lea ecx,dword ptr ds:[ebx+38]
//[ebx+38]=0311B1BC, (ASCII "%sollydbg.ini")
//[ebx+38]这里就是CleanupEx插件代码中写定的“OllyDBG.ini”
//在这里修改跳转到空白处,准备修改“OllyDBG.ini” ★
03111327 C640 01 00 mov byte ptr ds:[eax+1],0
0311132B 68 D8DA1103 push 311DAD8
03111330 51 push ecx
03111331 68 DCDB1103 push 311DBDC
03111336 E8 79370000 call 03114AB4
0311133B 83C4 0C add esp,0C
0311133E 8D43 4E lea eax,dword ptr ds:[ebx+4E]
03111341 8D53 46 lea edx,dword ptr ds:[ebx+46]
03111344 68 DCDB1103 push 311DBDC
03111349 68 04010000 push 104
0311134E 68 E0DC1103 push 311DCE
03111321 83C4 08 add esp,8
03111324 8D4B 38 lea ecx,dword ptr ds:[ebx+38]
//[ebx+38]=0311B1BC, (ASCII "%sollydbg.ini")
//[ebx+38]这里就是CleanupEx插件代码中写定的“OllyDBG.ini”
//在这里修改跳转到空白处,准备修改“OllyDBG.ini” ★
03111327 C640 01 00 mov byte ptr ds:[eax+1],0
0311132B 68 D8DA1103 push 311DAD8
03111330 51 push ecx
03111331 68 DCDB1103 push 311DBDC
03111336 E8 79370000 call 03114AB4
0311133B 83C4 0C add esp,0C
0311133E 8D43 4E lea eax,dword ptr ds:[ebx+4E]
03111341 8D53 46 lea edx,dword ptr ds:[ebx+46]
03111344 68 DCDB1103 push 311DBDC
03111349 68 04010000 push 104
0311134E 68 E0DC1103 push 311DCE