大家都知道OD的附加窗口的列表双击不是不是跟其他的列表一样代表确认,而是无动作。。。
不管是各种修改版本OD,还是ImmDbg,都一样,也没有相关插件,想来为这东西写个插件也腻蛋疼了。
相信很多人都手贱双击过那个列表,希望它能附加,结果碰了一脸猪血,现在我们就让这个愿望实现吧!
首先用Spy++看那个列表窗口的相关信息,得知父窗口是附加对话框,类名是APROCESS。
这是一个特殊的类,而看列表的样式跟我们写OD插件的时候的列表很像,猜应该就是同一个处理方式。而这个特殊的类名肯定需要注册,我们可以根据字符串快速定位关键call。
打开OD,载入OD,搜索所有字符串参考,在结果中搜索“APROCESS”,找到2个结果:
双击第一个,来到:
可以看到是调用一个Registerotclass的函数注册类的(PS:第二个是CreateWindowEx),这个函数在OD的PDK中有完整的声明,得知最后一个参数是指向WNDRPOC的,那现在这个APROCESS的WNDPROC过程就是0x477C90,跟入这个call
我们知道OD的PDK中,双击列表框消息的常量是WM_USER_DBLCLK,这个定义为WM_USER+111,也就是0x46F,我们在这个WNDPROC上下条件断点,看看能不能断到这个消息:
下了断点后,在被调试的OD中打开附加窗口,随便双击一个项目,哈哈,看到断下来了!
跟下去,看看OD如何处理这个消息,结果发现OD根本默认就没处理这个消息,连Tablefunction都不call,直接扔给DefWindowProc了。。。
现在办法只有一个,就是我们写入shellcode,自己处理这个消息,思路有2个:
1、处理这个消息,使用开发OD插件的方式,call Getsortedbyselection函数,然后在返回的结构中找到想关信息,调用OD内部的附加call进行附加。
这样有几个问题,Getsortedbyselection需要一个t_sorted的指针,这个问题到是好解决,在WNDPROC的代码中,有一个call Destroysorteddata的,想来上面那个就是OD内部这个t_sorted了。。。
还有就是使用OD的附加call的问题,这个我没详细研究,就不说了。。。
2、处理这个消息,给OD发送模拟附加按钮的点击消息。
大家一看就知道哪个稳定和简单,那我们就开始做把!
写入shellcode我们需要有一片代码空间,把DASM窗口拉下去,可以看到在IAT表底部有一篇全0区域,这是大多数EXE都有的,不过OD这片区域相对来说小了点,不过也完全够用了。
我们把shellcode定位在0x4AF644,我们改下0x477C90的函数头,改成JMP 4AF644,这样我们就破坏了原始函数的3行代码,后面需要恢复的:
PUSH EBP
MOV EBP,ESP
MOV EAX,DWORD[EBP+C]
我们的思路是用模拟按钮点击消息,所以需要知道这个消息是什么,开一个新的OD载入一个新的OD,打开附加窗口,调试者OD打开窗口列表,找到附加对话框,我们下一个消息断点,按钮的消息一般是WM_COMMAND,可我们需要知道wParam,也就是控件ID。(其实可以在别的程序开一个GetDlgItem的for循环...)
下了消息断点,去被调试的OD点击附加按钮,看到断下来了:
跑回程序的WNDPROC领空,看stack:
控件ID是1.........
这样的话,条件都具备了,我们可以写shellcode了!
切换回被改了0x477C90的OD,定位到0x4AF644,写:
由于我们JMP的是APROCESS的WNDRPOC,所以stack的hWnd不是主窗口的,所以需要用GetParent取得APROCESS的父窗口也就是附加对话框。很高兴,OD的导入表中有GetParent和SendMessageA,而且因为是EXE的导入表,RVA的问题基本上不需要考虑,直接就可以调用。
好了,现在在那个被调试的OD中打开附加窗口,双击,哈哈,附加上去了!现在我们直接复制所有修改到新的EXE文件,这个OD就是我们修改后附加窗口列表支持双击的OD了!
文章就到这里了,版主能不能给我一个邀请码呢,上次我已经发过一篇文章求邀请码了(http://bbs.pediy.com/showthread.php?t=158034),结果直接就沉大海了。。。
我随便找了个52的OD修改了下,附件是修改后的EXE。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课