文章目录

  • 1.概述
  • 2.为什么要写插件?
  • 3.了解 x64dbg 插件架构
  • 4.插件加载顺序
  • 5.主目录

1.概述

  x64dbg 插件软件开发工具包 (SDK) 用于为 x64dbg 调试器创建插件。这篇文章旨在做一些事情:突出显示 x64dbg 插件 SDK 的存在。突出显示用于汇编程序的 x64dbg 插件 SDK 的存在。插件加载顺序的技术概述。涵盖 x64dbg 插件 SDK 的架构和内部工作原理。提供一些插件 SDK 函数的示例代码和结构定义,用于使用 C++ 或汇编程序为 x64dbg 创建插件。

2.为什么要写插件?

  添加最初未提供的其他新功能。增强或补充现有特性或功能:方便、易用、消除重复性任务。替换旧的特性或不起作用或无法按预期运行的功能:错误修复、过时的特性、未维护等。更好地了解软件的特性、功能和/或 API。为了好玩,因为你可以。

3.了解 x64dbg 插件架构

  x64dbg 的插件文件是以.dp32或.dp64扩展名结尾的文件。这些对应于 x64dbg 的每个版本中使用的处理器架构 - 32 位和 64 位。实际上,这些插件文件(.dp32用于 32 位 x32dbg 和.dp64用于 64 位 x64dbg)只是简单的动态链接库(.dll文件)。每个插件文件都必须导出许多功能才能将其识别为有效且可用的插件。这些是:
  DllMain - 动态链接库的入口点。
  pluginit - 使用 x64dbg 启动初始插件接口。

可选:
  plugsetup - 为插件提供菜单句柄。
  plugstop - 当我们退出插件时(当 x64dbg 关闭时)
  CB* - 可选的许多回调函数,在插件 SDK 中定义并由 x64dbg 导出以与插件一起使用 - 我们将在下面进一步解释。
  仅从技术上讲DllMain并且pluginit至少是必需的,但被认为是一种很好的做法,包括plugstop允许清理您的插件代码(如果需要)以及plugsetup在您的插件将创建自己的菜单项时获取菜单句柄。

4.插件加载顺序

  这些是 x64dbg 调试器加载插件时发生的步骤。提到的功能和结构在下面的其他部分有更详细的介绍。在plugins文件夹中搜索所有以.dp32(for 32bit x32dbg.exe) 或.dp64(for 64bit x64dbg.exe)结尾的文件,在所有匹配文件的循环中,会发生以下情况:
  4.1.一个PLUG_INITSTRUCT结构 ( initStruct)在pluginit调用时已经传递过来,可用于存储pluginHandle。LoadLibrary被称为插件文件名。如果它不是有效的动态链接库,则忽略并跳过此文件,在日志窗口中创建一条消息,指示加载此“插件”文件失败,并改为处理下一个匹配的插件文件(如果有任何留待处理)。如果成功加载,唯一标识符将存储在结构 ( )的pluginHandle字段中。
  4.2.调用GetProcAddress来查找pluginit函数,如果动态链接库有函数,则将这个函数的地址注册到x64dbg。否则插件将无法加载。
  4.3.调用GetProcAddress以查找一个plugstop和一个plugsetup函数。如果它们存在,则这些函数的地址将注册到 x64dbg。多次使用GetProcAddress来查找各种回调导出函数(在下面的回调函数部分有更详细的解释),如果这些函数存在,那么这些函数的地址也会注册到 x64dbg。
  4.4.该pluginit函数使用一个参数调用:(initStruct指向 a 的指针PLUG_INITSTRUCT structure),返回时检查结构的sdkVersion字段PLUG_INITSTRUCT以验证它是否与所需的插件 sdk 版本号匹配。如果没有,则插件无法加载,处理将继续处理下一个文件。如果它有效,则会在日志窗口中创建一条消息,指示插件已加载。
  为插件使用创建并保留了许多系统菜单条目句柄:在插件菜单中,cpu 视图、转储和堆栈的右键单击上下文菜单。没有显示菜单,这些只是插件何时或是否在任何这些系统菜单下创建自己的菜单项的占位符。
  4.5.如果plugsetup先前发现了一个导出函数,则准备一个PLUG_SETUPSTRUCT结构 ( setupStruct) 并plugsetup使用一个参数调用该函数:(setupStruct指向PLUG_SETUPSTRUCT结构的指针),该函数保存先前注册的占位符菜单句柄,以便插件在添加自己的时可能使用菜单和菜单项。
  4.6.处理下一个插件文件,如果还有剩余的话。
  了解插件加载顺序有望帮助您了解将您的插件代码放在何处最好,以及在初始化和设置函数中使用 CPU 密集型代码的明显影响。其他插件将延迟加载,x64dbg 调试器本身将等待您的代码完成,然后才能继续执行其主要的调试工作。

5.主目录

  DllMain是动态链接库的入口点,对于每个 dll 文件都是可选的。作为 dll 文件的插件可以通过存储HINSTANCE hInst值以供以后在其他 api 调用中使用来使用此功能。创建 DllMain 函数所需的代码相对简单。
C++

extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD fdwReason, LPVOID lpvReserved)
{if(fdwReason == DLL_PROCESS_ATTACH){hInstance = hInst; // save instance handle for future use}return TRUE;
}

  除了DllMain所有插件功能(除了您自己的内部功能)之外,还需要导出插件才能工作。导出函数是已声明为可从外部访问以供其他外部调用者使用的函数。DllMain被“看到”并加载动态链接库时由操作系统自动处理,所以我们并不需要明确地导出,但pluginit,plugstop,plugsetup和其他任何CB*需要回调函数来导出。
  本文翻译于官方文档,如果错误,欢迎指正。

  合理的脚本代码可以有效的提高工作效率,减少重复劳动。

X64dbg-插件基本原理-加载顺序-概述-主目录相关推荐

  1. Struts2框架概述、Struts简介、Struts环境搭建、Struts执行流程、Struts文档、Struts配置文件的加载顺序-day01

    目录 第一节 框架概述 1.1 什么是框架 1.2 三大框架 1.3 三层架构 1.4 MVC.Servlet.Filter MVC Servlet Filter 第二节 Struts简介 2.1 S ...

  2. WordPress 插件开发教程:插件加载顺序、创建插件、add_action与do_action

    一.插件加载顺序 1.index.php 2.wp-blog-header.php 3.wp-load.php 4.wp-config.php 5.wp-settings.php 二.创建插件 1.插 ...

  3. web.xml 中的listener、 filter、servlet 加载顺序及其详解(转)

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  4. [转]web.xml 中的listener、 filter、servlet 加载顺序及其详解

    2019独角兽企业重金招聘Python工程师标准>>> 转自:http://zhxing.iteye.com/blog/399668 在项目中总会遇到一些关于加载的优先级问题,近期也 ...

  5. web.xml 中的listener、 filter、servlet 加载顺序及其详解

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  6. web.xml中的所有配置,Listener和Filter的加载顺序

    web.xml 中的listener. filter.servlet 加载顺序及其详解 在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人 ...

  7. Java中Filter、Listener,拦截器的学习,listener、 filter、servlet 加载顺序及其详解

    Filter filter可认为是Servlet的一种"变种",它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链.它与Se ...

  8. (转)web.xml 中的listener、 filter、servlet 加载顺序及其详解

    转: https://www.cnblogs.com/Jeely/p/10762152.html web.xml 中的listener. filter.servlet 加载顺序及其详解 一.概述 1. ...

  9. 多项目加载顺序修改_React推出并发模式:可中断渲染、指定加载顺序、并行处理多状态...

    警告:本文档介绍的实验功能在稳定版本中尚不可用.不要在生产应用程序中依赖 React 的实验性构建.这些功能可能会发生重大更改,而且直到功能成为 React 的一部分之前这类更改都不会发出警告.本文档 ...

最新文章

  1. POJ 1185 解题报告 炮兵阵地
  2. 外部导入方式添加背景图_在PS中如何添加灯光效果
  3. 辅助类——记录错误信息
  4. linux下设置定时任务,linux下定时任务设置
  5. HttpServletRequest 对象
  6. CDH 5.13.0 集成 Phoenix
  7. 构造函数、实例、原型对象、继承
  8. 过滤器 和 拦截器 6个区别,别再傻傻分不清了
  9. 传智教育1月12日在深交所成功挂牌上市,教育行业A股IPO第一股今诞生!
  10. 函数的参数,参数为数组
  11. USACO翻译:USACO 2013 DEC Silver三题
  12. yolov5+Deepsort实现目标跟踪
  13. pada aws configuration
  14. 【机器学习】决策树与随机森林模型
  15. 办公室计算机网络时断时续,网卡运行不正常网络时断时续的解决方法
  16. Intelsat-29e卫星解体全损,威胁地球静止轨道安全
  17. CentOS 8配置静态IP地址
  18. java错误信息表_java报表
  19. AG7110|AG7111|HDMI视频切换器方法全解
  20. 关于计算机的网络作文,关于网络的作文:网络_450字

热门文章

  1. [BZOJ4246]两个人的星座(计算几何)
  2. 分子动力学模拟之周期性边界处理
  3. 第一学期ACM之旅总结篇
  4. STP Security之BPDU Filter、BPDU Guard、Root Guard
  5. 深拷⻉浅拷⻉的区别?如何实现⼀个深拷⻉?
  6. 信驰达微信iBeacon摇一摇周边方案ibeacon蓝牙设备
  7. (中)苹果有开源,但又怎样呢?
  8. iOS汉语转拼音以及按照拼音排序
  9. 转-零死角玩转stm32-高级篇之SDIO(4bit + DMA、支持SDHC、带协议分析)
  10. 学习笔记:std::quoted