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

X64Dbg 专栏收录该内容
4 篇文章 0 订阅

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*需要回调函数来导出。
  本文翻译于官方文档,如果错误,欢迎指正。

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


  欢迎光临知了软件开发网络平台,本公司定制开发各类软件,主要方向为桌面专业软件开发和插件定制开发,桌面软件主要包括文字图形识别类软件,信息管理类软件,3D打印类软件,视频类软件以及其它涉及专业的各类图形图像处理软件。插件包含AE插件,AI插件,PS插件,PDF插件,3DMAX插件以及Word,Excel等Office插件开发。详情请咨询,微信QQ:312117271,手机:18928899728,邮箱: anjingzhi_sea@163.com.
公司网址:http://www.zhiliaos.com

  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值