天天看點

x64dbg 配置插件SDK開發環境

x64dbg 是一款開源的應用層反彙編調試器,旨在對沒有源代碼的可執行檔案進行惡意軟體分析和逆向工程,同時 x64dbg 還允許使用者開發插件來擴充功能,插件開發環境的配置非常簡單,如下将簡單介紹x64dbg是如何配置開發環境以及如何開發插件的。

x64dbg 是一款開源的應用層反彙編調試器,旨在對沒有源代碼的可執行檔案進行惡意軟體分析和逆向工程,同時 x64dbg 還允許使用者開發插件來擴充功能,插件開發環境的配置非常簡單,如下将簡單介紹x64dbg是如何配置開發環境以及如何開發插件的。

預設情況下當你下載下傳好​

​x64dbg​

​​時,在​

​pluginsdk​

​​目錄下都會包含​

​lib​

​庫,這個庫可以直接引用到項目内的。

x64dbg 配置插件SDK開發環境

插件庫的引入也很簡單,在vs中隻需要配置​

​include​

​​引用,以及​

​lib​

​​庫位置即可,​

​x64dbglib​

​庫的配置異常簡單。

x64dbg 配置插件SDK開發環境

引入後,我們去官方下載下傳好插件模闆檔案:​​https://github.com/x64dbg/PluginTemplate​​

此處為了開發友善,我做了精簡化,你可以直接使用我的方法來建立檔案,建出來的檔案隻有兩個非常簡潔。

首先在頭檔案部分建立一個​

​pluginmain.h​

​​ 并增加​

​PLUGIN_NAME​

​替換成自己項目的名字。

#pragma once

// Plugin information
#define PLUGIN_NAME "LySharkBlog"
#define PLUGIN_VERSION 1

#include "pluginsdk/bridgemain.h"
#include "pluginsdk/_plugins.h"

#include "pluginsdk/_scriptapi_argument.h"
#include "pluginsdk/_scriptapi_assembler.h"
#include "pluginsdk/_scriptapi_bookmark.h"
#include "pluginsdk/_scriptapi_comment.h"
#include "pluginsdk/_scriptapi_debug.h"
#include "pluginsdk/_scriptapi_flag.h"
#include "pluginsdk/_scriptapi_function.h"
#include "pluginsdk/_scriptapi_gui.h"
#include "pluginsdk/_scriptapi_label.h"
#include "pluginsdk/_scriptapi_memory.h"
#include "pluginsdk/_scriptapi_misc.h"
#include "pluginsdk/_scriptapi_module.h"
#include "pluginsdk/_scriptapi_pattern.h"
#include "pluginsdk/_scriptapi_register.h"
#include "pluginsdk/_scriptapi_stack.h"
#include "pluginsdk/_scriptapi_symbol.h"

#include "pluginsdk/DeviceNameResolver/DeviceNameResolver.h"
#include "pluginsdk/jansson/jansson.h"
#include "pluginsdk/lz4/lz4file.h"
#include "pluginsdk/TitanEngine/TitanEngine.h"
#include "pluginsdk/XEDParse/XEDParse.h"

#ifdef _WIN64
#pragma comment(lib, "pluginsdk/x64dbg.lib")
#pragma comment(lib, "pluginsdk/x64bridge.lib")
#pragma comment(lib, "pluginsdk/DeviceNameResolver/DeviceNameResolver_x64.lib")
#pragma comment(lib, "pluginsdk/jansson/jansson_x64.lib")
#pragma comment(lib, "pluginsdk/lz4/lz4_x64.lib")
#pragma comment(lib, "pluginsdk/TitanEngine/TitanEngine_x64.lib")
#pragma comment(lib, "pluginsdk/XEDParse/XEDParse_x64.lib")
#else
#pragma comment(lib, "pluginsdk/x32dbg.lib")
#pragma comment(lib, "pluginsdk/x32bridge.lib")
#pragma comment(lib, "pluginsdk/DeviceNameResolver/DeviceNameResolver_x86.lib")
#pragma comment(lib, "pluginsdk/jansson/jansson_x86.lib")
#pragma comment(lib, "pluginsdk/lz4/lz4_x86.lib")
#pragma comment(lib, "pluginsdk/TitanEngine/TitanEngine_x86.lib")
#pragma comment(lib, "pluginsdk/XEDParse/XEDParse_x86.lib")
#endif //_WIN64

#define Cmd(x) DbgCmdExecDirect(x)
#define Eval(x) DbgValFromString(x)
#define dprintf(x, ...) _plugin_logprintf("[" PLUGIN_NAME "] " x, __VA_ARGS__)
#define dputs(x) _plugin_logprintf("[" PLUGIN_NAME "] %s\n", x)
#define PLUG_EXPORT extern "C" __declspec(dllexport)

//superglobal variables
extern int pluginHandle;
extern HWND hwndDlg;
extern int hMenu;
extern int hMenuDisasm;
extern int hMenuDump;
extern int hMenuStack;

//functions
bool pluginInit(PLUG_INITSTRUCT* initStruct);
void pluginStop();
void pluginSetup();      

其次建立一個實作檔案​

​pluginmain.cpp​

​并寫入以下代碼,多數情況下我為了友善調試會使用這段代碼,當我們點選菜單時會觸發菜單功能,以此可以快速測試特定函數是否正常。

#include "pluginmain.h"
#include <Windows.h>
#include <process.h>

int pluginHandle;
HWND hwndDlg;
int hMenu;
int hMenuDisasm;
int hMenuDump;
int hMenuStack;

// 導出函數
extern "C" __declspec(dllexport) void CBMENUENTRY(CBTYPE cbType, PLUG_CB_MENUENTRY* info);
extern "C" __declspec(dllexport) void plugsetup(PLUG_SETUPSTRUCT* setupStruct);
extern "C" __declspec(dllexport) bool pluginit(PLUG_INITSTRUCT* initStruct);

// 在這裡初始化插件資料。
bool pluginInit(PLUG_INITSTRUCT* initStruct)
{
  // 傳回false以取消加載插件。
  return true;
}

// 在此處取消初始化插件資料。
void pluginStop()
{
}

// 在這裡做GUI/菜單相關的事情。
void pluginSetup()
{
}

// 菜單被點選回調
void CBMENUENTRY(CBTYPE cbType, PLUG_CB_MENUENTRY* info)
{
  // 此菜單用于實作功能,并測試

  for (int x = 0; x < 100; x++)
  {
    _plugin_logprint("hello lyshark");
  }
}

PLUG_EXPORT bool pluginit(PLUG_INITSTRUCT* initStruct)
{
  initStruct->pluginVersion = PLUGIN_VERSION;
  initStruct->sdkVersion = PLUG_SDKVERSION;
  strncpy_s(initStruct->pluginName, PLUGIN_NAME, _TRUNCATE);
  pluginHandle = initStruct->pluginHandle;

  // 插件初始化
  initStruct->sdkVersion = PLUG_SDKVERSION;
  initStruct->pluginVersion = 1;
  const char *name = "CheckME -->";
  memset(initStruct->pluginName, 0, 128);
  memcpy(initStruct->pluginName, name, strlen(name));

  return pluginInit(initStruct);
}

PLUG_EXPORT bool plugstop()
{
  pluginStop();
  return true;
}

PLUG_EXPORT void plugsetup(PLUG_SETUPSTRUCT* setupStruct)
{
  hwndDlg = setupStruct->hwndDlg;
  hMenu = setupStruct->hMenu;
  hMenuDisasm = setupStruct->hMenuDisasm;
  hMenuDump = setupStruct->hMenuDump;
  hMenuStack = setupStruct->hMenuStack;

  // 增加二級菜單
  char sub_menu[] = { "PowerBy LyShark" };
  _plugin_menuaddentry(setupStruct->hMenu, 2, sub_menu);

  pluginSetup();
}      

編譯這段代碼,然後我們将其放入到​

​x64dbg​

​​目錄下的​

​plugins​

​​目錄,然後運作程式,點選​

​checkme​

​即可測試我們的功能了。

x64dbg 配置插件SDK開發環境