-
-
[原创]WinDBG插件编写介绍及在Nano Code中加载扩展
-
发表于: 2021-8-9 18:26 5931
-
穷理者,因其所已知而及其所未知,因其所已达而及其所未达。人之良知,本所固有。然不能穷理者,只是足于已知已达,而不能穷其未知未达,故见得一截,又不曾见得一截,此其所以于理未精也。然仍须功夫日日增加。今日既格得一物,明日又格得一物,工夫更不住地做。如左脚进得一步,右脚又进一步;右脚进得一步,左脚又进,接续不已,自然贯通。
借钟馗与GDK7之合力捉”鬼“,保佑代码平安顺利、风调雨顺,再无”鬼怪出现“。
扩展也可以被称为是插件,通过DLL以导出函数的形式供调试器加载扩展;扩展用于实现用户自定义的功能,便于用户基于自己的调试需求去扩展调试功能。
无论是Nano Code还是WinDBG都拥有着丰富的扩展命令;但即使是这样,也难免也会有一些不足之处,让用户在调试过程中觉得现有的命令并不大够用,扩展也因此而出现。
Nano Code是一款功能强大的调试器,它兼容WinDBG;因此在WinDBG上可以使用的扩展在Nano Code上也可以照常使用。
在调试器中以!开头的命令就是扩展命令。
通过Dependence Walker来查看DLL的导出函数(以adp_ext.dll为例);如下图所示。
最近在使用GDK7+Nano Code进行调试,感受到了GDK7及Nano Code的强大功能(张银奎老师的NB),同时Nano Code还兼容WinDBG;尽管如此现有的命令仍然不大够使用,因此需要一些额外的扩展命令,因为Nano Code兼容WinDBG,因此就以WinDBG扩展编写为例,来写Nano Code的插件。
WinDBG主要支持2种类型的扩展,分别是DBGEng类型的扩展及WDBGExts类型的扩展;当然也可以说是WinDBG提供了DBGEng的API接口及WDBGExts的API接口两种API接口类型供我们来调用,从而写出WinDBG扩展。
WDBGExts类型的扩展:调用在wdbgexts.h 中定义的 WinDBG 。
DBGEng类型的扩展:调用在dbgeng.h 中定义的Debugger Engine API 。
WinDBG任何1种类型的扩展编写都可以分成2个步骤,这2个步骤分别是生成动态链接库模块(DLL)及利用DLL的导出函数供WinDBG加载;在WinDBG完成加载以后,就可以使用扩展命令来
打开Visual Studio创建一个动态链接库的新项目;如下图所示。
删除头文件及源文件中自带的文件。
复制inc文件夹下的dbgeng.h到项目文件夹下,在头文件内打开dbgeng.h(右键=>添加=>现有项=>dbgeng.h);如下图所示。
创建新的头文件(右键头文件=>添加=>新建项=>头文件);在头文件中编写下方代码。
这一种方法适用于编写WDBGExts类型的扩展;如果想要编写DNGEng类型的扩展,则还需要再#include <dbgeng.h>下面添加#pragma comment (lib ,"dbgeng.lib")。
创建源代码文件(右键源文件=>添加=>新建项=>C++文件);如下图所示。
在C++文件中编写下方代码。
Test函数用于实现扩展命令(这个扩展命令就是输出一段文字,如同Hello World一样,非常简单);Release()用于释放API接口。
创建def文件(右键源文件=>添加=>新建项=>代码=>模块定义文件);如下图所示。
文章1链接:https://blog.csdn.net/birdring_0xx0/article/details/119424688
在模块定义文件中编写下方代码。
显然导出的函数为Test及DebugExtensionInitialize。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)