您当前的位置: 首页 > 

插件开发

暂无认证

  • 1浏览

    0关注

    492博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

插件开发 发布时间:2022-05-11 08:42:08 ,浏览量:1

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

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

关注
打赏
1665481431
查看更多评论
立即登录/注册

微信扫码登录

0.0627s