x64dbg 配置插件SDK开发环境

打印 上一主题 下一主题

主题 672|帖子 672|积分 2016

x64dbg 是一款开源的应用层反汇编调试器,旨在对没有源代码的可执行文件进行恶意软件分析和逆向工程,同时 x64dbg 还允许用户开发插件来扩展功能,插件开发环境的配置非常简单,如下将简单介绍x64dbg是如何配置开发环境以及如何开发插件的。
默认情况下当你下载好x64dbg时,在pluginsdk目录下都会包含lib库,这个库可以直接引用到项目内的。

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

引入后,我们去官方下载好插件模板文件:https://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 <Windows.h>
  3. #include <process.h>
  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即可测试我们的功能了。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

欢乐狗

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表