穷理者,因其所已知而及其所未知,因其所已达而及其所未达。人之良知,本所固有。然不能穷理者,只是足于已知已达,而不能穷其未知未达,故见得一截,又不曾见得一截,此其所以于理未精也。然仍须功夫日日增加。今日既格得一物,明日又格得一物,工夫更不住地做。如左脚进得一步,右脚又进一步;右脚进得一步,左脚又进,接续不已,自然贯通。

借钟馗与GDK7之合力捉”鬼“,保佑代码平安顺利、风调雨顺,再无”鬼怪出现“。

Nano Code与WinDBG

最近在使用GDK7+Nano Code进行调试,感受到了GDK7及Nano Code的强大功能(张银奎老师的NB),同时Nano Code还兼容WinDBG;尽管如此现有的命令仍然不大够使用,因此需要一些额外的扩展命令,因为Nano Code兼容WinDBG,因此就以WinDBG扩展编写为例,来写Nano Code的插件。

WinDBG扩展类型的简单介绍

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完成加载以后,就可以使用扩展命令来

WinDBG扩展-Hello World的编写

打开Visual Studio创建一个动态链接库的新项目;如下图所示。

删除头文件及源文件中自带的文件。

复制inc文件夹下的dbgeng.h到项目文件夹下,在头文件内打开dbgeng.h(右键=>添加=>现有项=>dbgeng.h);如下图所示。

  • Inc文件夹为WinDBG自带的文件夹;路径特征为Windows Kits\10\Debuggers\inc。

创建新的头文件(右键头文件=>添加=>新建项=>头文件);在头文件中编写下方代码。

  • 这一种方法适用于编写WDBGExts类型的扩展;如果想要编写DNGEng类型的扩展,则还需要再#include <dbgeng.h>下面添加#pragma comment (lib ,"dbgeng.lib")。
#pragma once#include <dbgeng.h>

创建源代码文件(右键源文件=>添加=>新建项=>C++文件);如下图所示。

在C++文件中编写下方代码。

  • DebugExtensionInitialize是我们需要导出的函数且此函数必须被导出,此函数含有2个参数,分别是Version(版本)及Flags(暂时不用)。
  • 我们利用DEBUG_EXTENSION_VERSION设置高版本及低版本。
  • Test函数用于实现扩展命令(这个扩展命令就是输出一段文字,如同Hello World一样,非常简单);Release()用于释放API接口。
#include "Test.h"HRESULT CALLBACKDebugExtensionInitialize(PULONG Version, PULONG Flags){*Version = DEBUG_EXTENSION_VERSION(1, 0);*Flags = 0;  // 暂时不用return S_OK;}HRESULT CALLBACK Test(PDEBUG_CLIENT pDebugClient, PCSTR args){UNREFERENCED_PARAMETER(args);IDebugControl* pDebugControl;if (SUCCEEDED(pDebugClient->QueryInterface(__uuidof(IDebugControl4), (void **)&pDebugControl))){pDebugControl->Output(DEBUG_OUTPUT_NORMAL, "Hello Nano Code,Here is GDK7!!!");pDebugControl->Release();}return S_OK;}

创建def文件(右键源文件=>添加=>新建项=>代码=>模块定义文件);如下图所示。

  • 用于指定所需导出的函数;在文章1中我们知道DLL通过导出函数供调试器加载扩展。
  • 文章1链接:https://blog.csdn.net/birdring_0xx0/article/details/119424688

在模块定义文件中编写下方代码。

  • 显然导出的函数为Test及DebugExtensionInitialize。
LIBRARY "Test"EXPORTSTestDebugExtensionInitialize

开始编译,等待编译成功;如下图所示。

  • 如果编译时报错[在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加”#include “xxxx.h””],则应不使用预编译头(右键项目=>属性=>配置属性=>C/C++=>预编译头=>不使用预编译头)。
  • 如果缺少头文件及静态链接库文件,则添加它们的路径到项目中(去WinDBG文件夹里面找,都是自带的文件)。

在Nano Code中载入Test.dll

进入Nano Code,启动内核调试,断下GDK7。

在命令行内输入.load Test.dll;如下图所示。

执行!Test;会输出如下内容。

[ndb]!Test
!Test
Hello Nano Code,Here is GDK7!!!

GDK7的介绍

GDK7通过专用调试电缆与调试目标进行连接,二者通过DCI协议进行通信,也不需要专用的ITP硬件就可以实现JTAG调试和系统追踪。

GDK7提供了一个完整的被调试目标系统,大大减少准备调试环境所需的时间,省去各种因为软件和硬件不兼容所带来的烦恼。

与传统的ITP/XDP硬件调试器相比,GDK7的传输速度高达5Gbps,比XDP和ITP提高了10倍还多;可以把GDK7中的数据实时传输到调试主机内,让全量分析多线程软件的执行轨迹成为可能,当然GDK7的强大功能不局限于此。

其他说明

若您有问题咨询及出现链接失效等其他情况请联系邮箱:birdring_NULL@outlook.com。

WinDBG插件编写介绍及在Nano Code中加载扩展相关推荐

  1. 如何解除Chrome无法安装第三方插件的限制(无法从该网站加载扩展程序和用户脚本)

    2018年6月谷歌宣布将废除 Chrome 扩展的内联安装方式(inline installation).所以说,自Chrome 67版本开始,谷歌调整Chrome的插件安装策略,只允许用户在应用商店 ...

  2. 从零开始实现ASP.NET Core MVC的插件式开发(一) - 使用Application Part动态加载控制器和视图...

    如果你使用过一些开源CMS的话,肯定会用过其中的的插件化功能,用户可以通过启用或者上传插件包的方式动态添加一些功能,那么在ASP.NET Core MVC中如何实现插件化开发呢,下面我们来探究一下. ...

  3. 【Android 插件化】Hook 插件化框架 ( 从源码角度分析加载资源流程 | Hook 点选择 | 资源冲突解决方案 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  4. endnote一打开就自动关闭_word mac版如何彻底删除endnote插件?mac版word移除endnote加载项的方法...

    有些朋友在使用word mac版会安装endnote插件,但是用户体验不好就想要卸载,但是很多朋友在卸载endnote插件时都遇到一些小bug,也不知道怎么解决,所以小编为大家带来一个可以彻底删除En ...

  5. PS安装插件提示无法加载扩展未正确签署解决方式(适用于mac/win)

    使用PS插件可以方便我们的工作,但是有的小伙伴发现安装插件之后会提示无法加载扩展未正确签署解决方式,下面macw教给大家处理方法.win或mac都可以使用这个方法哦. 小编这里用的是ps 2020 M ...

  6. ArcGIS中加载无偏移谷歌卫星影像!奥维官方插件与ArcGIS协同互动

    前段时间奥维地图推出了一款与ArcGIS协同插件OmapArcMap 对于经常使用奥维的小伙伴来说无疑是一种福利 这个插件会让你大大提高工作效率 这个插件主要有两个功能 可以在ArcGIS中在线加载谷 ...

  7. ps html插件初始化失败,PS插件提示 “无法加载扩展,因为它未正确签署” 解决方法...

    Adobe 更新到了 CC 2019版本以后,各种好用的插件.滤镜.扩展功能也陆续开始了更新,问题来了,也许适配新版出现了兼容问题,加载插件提示无法加载扩展,因为它未正确签署,具体什么原因,咱也不知道 ...

  8. 插件化知识梳理(7) 类的动态加载入门

    一.前言 在 插件化知识梳理(6) - Small 源码分析之 Hook 原理 这一章的学习完成之后,下一步我们将进入插件化加载的精髓,动态加载类的学习,在此之前,我们需要先准备一些关于类加载的知识. ...

  9. phpcms选择文件无法加载插件怎么办_win7系统下浏览器显示无法加载插件如何解决...

    最近有win7旗舰版32位系统用户反映说碰到这样一个现象,就是在使用浏览器观看视频的时候,却显示无法加载插件,该怎么办呢,本教程就给大家带来win7系统下浏览器显示无法加载插件的具体解决步骤. 1.当 ...

最新文章

  1. keta-custom DWZ validationEng IE 下表单重复提交BUG原因及修复方法
  2. Stanford UFLDL教程 可视化自编码器训练结果
  3. Google colab基本页面layout和需要注意的地方!
  4. 安装 SAP Spartacus 3.0 并使用B2B功能
  5. 荐书 | 10本书给你计算机大师思维
  6. 关于树和二叉树的一些基本概念,基本名词解释。
  7. 汇编题目:编写包含多个功能子程序的中断例程
  8. android单元测试android环境,基于Robolectric的Android单元测试 —环境搭建与部署运行...
  9. android 权限问题吗,Android 6.0前后权限问题
  10. php data取年月,PHP-date函数 年、月、日参数详解
  11. VS2015 自动代码补全
  12. 论文篇-----基于拉依达准则的交通数据粗大误差处理优化方法
  13. mysql航空公司订票系统_航空订票系统(JAVA+SSH+MYSQL)
  14. 艾萨克·阿西莫夫《日暮》
  15. 单元测试中的 AAA 规则
  16. netty 引用计数对象(reference counted objects)
  17. 再谈10000小时,三板斧破四困境
  18. 微软e5服务器,微软E5 自动订阅程序
  19. 2020美赛C题解题思路(A Wealth of Data)
  20. 【智能优化算法】基于粒子群结合NSGA2算法求解多目标优化问题附Matlab代码

热门文章

  1. 优秀的职业经理人具备的素养
  2. 告警与恢复告警原理及实现
  3. SSH-keygen的用法学习
  4. 东南大学微电子预推免面试
  5. GeoGebra 與數學探索 1 GeoGebra 入門到進階之整體介紹
  6. [论文笔记]如何通过加package cap有效减少GPU的droop noise
  7. 解决计算机的一些小问题,电脑故障怎么办?排除法解决电脑的一些小问题
  8. 京东运营活动可视化搭建系统之架构流程设计
  9. 【FeathersJS 入门】安装 Feathers
  10. CodeForces 148C-Terse princess