• x64dbg 配置插件SDK开发环境


    x64dbg 是一款开源的应用层反汇编调试器,旨在对没有源代码的可执行文件进行恶意软件分析和逆向工程,同时 x64dbg 还允许用户开发插件来扩展功能,插件开发环境的配置非常简单,如下将简单介绍x64dbg是如何配置开发环境以及如何开发插件的。

    默认情况下当你下载好x64dbg时,在pluginsdk目录下都会包含lib库,这个库可以直接引用到项目内的。

    插件库的引入也很简单,在vs中只需要配置include引用,以及lib库位置即可,x64dbglib库的配置异常简单。

    引入后,我们去官方下载好插件模板文件https://github.com/x64dbg/PluginTemplateicon-default.png?t=N7T8https://github.com/x64dbg/PluginTemplate

    此处为了开发方便,我做了精简化,你可以直接使用我的方法来新建文件,建出来的文件只有两个非常简洁。

    首先在头文件部分新建一个pluginmain.h 并增加PLUGIN_NAME替换成自己项目的名字。

    1. #pragma once
    2. // Plugin information
    3. #define PLUGIN_NAME "LySharkBlog"
    4. #define PLUGIN_VERSION 1
    5. #include "pluginsdk/bridgemain.h"
    6. #include "pluginsdk/_plugins.h"
    7. #include "pluginsdk/_scriptapi_argument.h"
    8. #include "pluginsdk/_scriptapi_assembler.h"
    9. #include "pluginsdk/_scriptapi_bookmark.h"
    10. #include "pluginsdk/_scriptapi_comment.h"
    11. #include "pluginsdk/_scriptapi_debug.h"
    12. #include "pluginsdk/_scriptapi_flag.h"
    13. #include "pluginsdk/_scriptapi_function.h"
    14. #include "pluginsdk/_scriptapi_gui.h"
    15. #include "pluginsdk/_scriptapi_label.h"
    16. #include "pluginsdk/_scriptapi_memory.h"
    17. #include "pluginsdk/_scriptapi_misc.h"
    18. #include "pluginsdk/_scriptapi_module.h"
    19. #include "pluginsdk/_scriptapi_pattern.h"
    20. #include "pluginsdk/_scriptapi_register.h"
    21. #include "pluginsdk/_scriptapi_stack.h"
    22. #include "pluginsdk/_scriptapi_symbol.h"
    23. #include "pluginsdk/DeviceNameResolver/DeviceNameResolver.h"
    24. #include "pluginsdk/jansson/jansson.h"
    25. #include "pluginsdk/lz4/lz4file.h"
    26. #include "pluginsdk/TitanEngine/TitanEngine.h"
    27. #include "pluginsdk/XEDParse/XEDParse.h"
    28. #ifdef _WIN64
    29. #pragma comment(lib, "pluginsdk/x64dbg.lib")
    30. #pragma comment(lib, "pluginsdk/x64bridge.lib")
    31. #pragma comment(lib, "pluginsdk/DeviceNameResolver/DeviceNameResolver_x64.lib")
    32. #pragma comment(lib, "pluginsdk/jansson/jansson_x64.lib")
    33. #pragma comment(lib, "pluginsdk/lz4/lz4_x64.lib")
    34. #pragma comment(lib, "pluginsdk/TitanEngine/TitanEngine_x64.lib")
    35. #pragma comment(lib, "pluginsdk/XEDParse/XEDParse_x64.lib")
    36. #else
    37. #pragma comment(lib, "pluginsdk/x32dbg.lib")
    38. #pragma comment(lib, "pluginsdk/x32bridge.lib")
    39. #pragma comment(lib, "pluginsdk/DeviceNameResolver/DeviceNameResolver_x86.lib")
    40. #pragma comment(lib, "pluginsdk/jansson/jansson_x86.lib")
    41. #pragma comment(lib, "pluginsdk/lz4/lz4_x86.lib")
    42. #pragma comment(lib, "pluginsdk/TitanEngine/TitanEngine_x86.lib")
    43. #pragma comment(lib, "pluginsdk/XEDParse/XEDParse_x86.lib")
    44. #endif //_WIN64
    45. #define Cmd(x) DbgCmdExecDirect(x)
    46. #define Eval(x) DbgValFromString(x)
    47. #define dprintf(x, ...) _plugin_logprintf("[" PLUGIN_NAME "] " x, __VA_ARGS__)
    48. #define dputs(x) _plugin_logprintf("[" PLUGIN_NAME "] %s\n", x)
    49. #define PLUG_EXPORT extern "C" __declspec(dllexport)
    50. //superglobal variables
    51. extern int pluginHandle;
    52. extern HWND hwndDlg;
    53. extern int hMenu;
    54. extern int hMenuDisasm;
    55. extern int hMenuDump;
    56. extern int hMenuStack;
    57. //functions
    58. bool pluginInit(PLUG_INITSTRUCT* initStruct);
    59. void pluginStop();
    60. void pluginSetup();

    其次新建一个实现文件pluginmain.cpp并写入以下代码,多数情况下我为了方便调试会使用这段代码,当我们点击菜单时会触发菜单功能,以此可以快速测试特定函数是否正常。

    1. #include "pluginmain.h"
    2. #include
    3. #include
    4. int pluginHandle;
    5. HWND hwndDlg;
    6. int hMenu;
    7. int hMenuDisasm;
    8. int hMenuDump;
    9. int hMenuStack;
    10. // 导出函数
    11. extern "C" __declspec(dllexport) void CBMENUENTRY(CBTYPE cbType, PLUG_CB_MENUENTRY* info);
    12. extern "C" __declspec(dllexport) void plugsetup(PLUG_SETUPSTRUCT* setupStruct);
    13. extern "C" __declspec(dllexport) bool pluginit(PLUG_INITSTRUCT* initStruct);
    14. // 在这里初始化插件数据。
    15. bool pluginInit(PLUG_INITSTRUCT* initStruct)
    16. {
    17. // 返回false以取消加载插件。
    18. return true;
    19. }
    20. // 在此处取消初始化插件数据。
    21. void pluginStop()
    22. {
    23. }
    24. // 在这里做GUI/菜单相关的事情。
    25. void pluginSetup()
    26. {
    27. }
    28. // 菜单被点击回调
    29. void CBMENUENTRY(CBTYPE cbType, PLUG_CB_MENUENTRY* info)
    30. {
    31. // 此菜单用于实现功能,并测试
    32. for (int x = 0; x < 100; x++)
    33. {
    34. _plugin_logprint("hello lyshark");
    35. }
    36. }
    37. PLUG_EXPORT bool pluginit(PLUG_INITSTRUCT* initStruct)
    38. {
    39. initStruct->pluginVersion = PLUGIN_VERSION;
    40. initStruct->sdkVersion = PLUG_SDKVERSION;
    41. strncpy_s(initStruct->pluginName, PLUGIN_NAME, _TRUNCATE);
    42. pluginHandle = initStruct->pluginHandle;
    43. // 插件初始化
    44. initStruct->sdkVersion = PLUG_SDKVERSION;
    45. initStruct->pluginVersion = 1;
    46. const char *name = "CheckME -->";
    47. memset(initStruct->pluginName, 0, 128);
    48. memcpy(initStruct->pluginName, name, strlen(name));
    49. return pluginInit(initStruct);
    50. }
    51. PLUG_EXPORT bool plugstop()
    52. {
    53. pluginStop();
    54. return true;
    55. }
    56. PLUG_EXPORT void plugsetup(PLUG_SETUPSTRUCT* setupStruct)
    57. {
    58. hwndDlg = setupStruct->hwndDlg;
    59. hMenu = setupStruct->hMenu;
    60. hMenuDisasm = setupStruct->hMenuDisasm;
    61. hMenuDump = setupStruct->hMenuDump;
    62. hMenuStack = setupStruct->hMenuStack;
    63. // 增加二级菜单
    64. char sub_menu[] = { "PowerBy LyShark" };
    65. _plugin_menuaddentry(setupStruct->hMenu, 2, sub_menu);
    66. pluginSetup();
    67. }

    编译这段代码,然后我们将其放入到x64dbg目录下的plugins目录,然后运行程序,点击checkme即可测试我们的功能了。

  • 相关阅读:
    CSS calc() 使用指南
    WSDM‘22推荐系统论文梳理
    计算机网络二:应用层
    Linux常用初级指令介绍和使用
    操作系统专项练习
    PhotoShop批量压缩图片
    图论相关内容
    ASP.NET第四章 Response、Request和Server对象
    ***杨辉三角_yyds_LeetCode_python***
    rhcsa学习3 文件
  • 原文地址:https://blog.csdn.net/lyshark_csdn/article/details/126670381