前几天和一位前辈聊天,觉得不应该在调试器的实现上过多模仿OD的设计。 但是,在看过OD实现消息断点的方式后,觉得确实有借鉴之处,所以,暂时用了OD设置消息断点的过程,但是,我并不打算在我的调试器可以成型后继续用这个方法作为消息断点。 OD的消息断点,实际上就是一个自动产生的条件断点。借用它的帮助文档里面的话:利用GetWindowLong获取所有窗口过程的地址。然后在对应地址生成这样[ESP+4]==00001234 && [ESP+8] IN (0F0..0F7,135)之类的条件,并且下一个int3断点,断下对应消息。 由于我是模仿OD的实现,所以,就不多做介绍了,OD的帮助文档里面有。 就只是对我模仿时候的一些改动和问题告诉大家,希望对同是设计调试器的朋友有一些帮助。 GetWindowLong获取对应窗口过程的地址,以及ID等等信息,肯定要在被调试程序的进程空间进行。所以,需要注入到被调试空间。在OD 实现的时候,由于作者觉得注入代码不是很安全,所以,只有在被调试程序挂起时候才进行注入。而需要得到信息的窗体我就不太清楚OD是怎么搞出来的。我用的是EnumChildWindows这个函数,得到被调试程序的窗体句柄。在注入的时候,我开始也用的直接writeprocessmemory然后创建远程线程完成。但是,问题很多,后来就改用了CreateRemoteThread和Loadlibrary的方式了,而且在我测试的时候,即使不挂起程序,也可以完成注入(仅仅是我测试的那几个程序可以,其他的我无法保证)。获取窗体的信息。设计过程中,遇到的问题不是很多(都是windows编程的问题,网上优秀的文章很多,我就不多说了) 1,注意注入时候权限的设置。 2,调试器和被调试器进程间的数据传递是个需要小心考虑的问题了。(我用的DLL共享传递的) 浪费我时间最多的问题…… 得感谢figo和慵懒的午后。具体是什么,就不好意思提了(个人的大意),相信不会有人也这么倒霉,遇到这样的问题。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)