如何实现自己的ollydbg调试器 (1) 界面的实现
在逆向时候我们需要一些工具,但是很多工具毕竟是别人写的,我们无法改变,一套好的工具就会事半功倍,如果我们自己实现一套自己的工具的话,那就更加完美了,读者如果有兴趣可以自己去实现一套全新的调试器。
Windows程序的调试器有很多,比如windbg、ollydbg 等等,但是大多数搞逆向的人都喜欢使用ollydbg来动态调试程序,因为它的快捷键丰富,众多的插件,以及稳定的调试功能,但是还有一个最为重要的原因就是它的界面非常友好,不同的指令显示不同的颜色,能一眼很容易区分出来,不伤眼,所以打造自己的调试器界面也是最重要的一部分,下面我们就来讲解ollydbg 的界面如何实现。
首选我们要了解ollydbg的界面有哪些有点,如下图所示:


使用ollydbg的人都知道它的界面的一些特性:
1. 数据显示区域的任何窗体都是自绘的。
2. 移动窗体时界面不会闪动。
3. 显示汇编的时候颜色是不同的。
4. CPU数据窗体分割可使用鼠标左键互相连接移动。
接下来我们就具体分析它是如何实现的,用IDA打开Ollydbg,首选找到 RegisterClass函数来定位CPU窗体的类所对应的窗体函数WndProc的位置:

Ollydbg的CPU汇编显示的类叫ICPUASM, 它对应的窗口回调例程函数就是如图的AsmListView(我标注的函数名字),下面我们就进入这个函数去找一些关键的信息

函数内处理了一些消息,开始的一些消息并没有什么特殊性,继续往下找

看到了WM_PAINT消息的处理,这里我应该能猜测出来这里就是开始自绘客户Client区域了,继续进入Painttable函数看看是否是我们需要的,当我们一进入这个函数就发现了它的一些重要的与界面自绘相关的信息



它使用了CreateCompatibleDc、CreateCompatibleBitmap、 Bitblt双缓冲技术来实现绘图防止界面闪动。
第一步是打印Column的头header,首选在头的大小区域的底部大一条黑色的线

接着就是根据column的数量循环画每个column, 规定最大column数量为17个,先画每个 column的边线,然后在填充背景色,最后在打印column的字体


Listview头自绘完毕后就是开始画界面体了,下面这一大块划线打点的代码区域就是实现Hex 数据栏不同的跳转线的实现


接下来就是根据不同的结构数据的设置打印不同的区域内不同颜色的字体

如果这个区域内没有数据结构就直接填充默认背景颜色

关于它的界面的实现的一些原理其他细节我们只介绍到这里其他的细节读者自行去发现,下面最重要的工作就是自己去写代码实现,在实现过程中有几个关键的技术。
1. 防止界面闪动使用双缓冲绘图
在WM_PAINT里使用几个兼容位图的的函数实现双缓冲
hCompatibleDC = CreateCompatibleDC(hDC);
if (hCompatibleDC)
{
hCompatibleBitMap = CreateCompatibleBitmap( //创建兼容位图
hDC,prcDirty->right,prcDirty->bottom);
}
else
{
hCompatibleDC = hDC;
}
if (hCompatibleBitMap)
{
hOldBitmap = (HBITMAP)SelectObject(hCompatibleDC,hCompatibleBitMap);
}
。。。。。。。。。。。。。
if (hCompatibleBitMap)
{
BitBlt( hDC,
rcDirtyBody.left,
rcDirtyBody.top,
rcDirtyBody.right - rcDirtyBody.left,
rcDirtyBody.bottom - rcDirtyBody.top,
hCompatibleDC,
HEADER_CX,
nHeaderHeight,
SRCCOPY);
}
}
if (hCompatibleBitMap)
{
SelectObject(hCompatibleDC,hOldBitmap);
DeleteObject(hCompatibleBitMap);
DeleteDC(hCompatibleDC);
}
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
