x64dbg 是一款開源的應用層反彙編調試器,旨在對沒有源代碼的可執行檔案進行惡意軟體分析和逆向工程,同時 x64dbg 還允許使用者開發插件來擴充功能,插件開發環境的配置非常簡單,如下将簡單介紹x64dbg是如何配置開發環境以及如何開發插件的。
x64dbg 是一款開源的應用層反彙編調試器,旨在對沒有源代碼的可執行檔案進行惡意軟體分析和逆向工程,同時 x64dbg 還允許使用者開發插件來擴充功能,插件開發環境的配置非常簡單,如下将簡單介紹x64dbg是如何配置開發環境以及如何開發插件的。
預設情況下當你下載下傳好
x64dbg
時,在
pluginsdk
目錄下都會包含
lib
庫,這個庫可以直接引用到項目内的。
插件庫的引入也很簡單,在vs中隻需要配置
include
引用,以及
lib
庫位置即可,
x64dbglib
庫的配置異常簡單。
引入後,我們去官方下載下傳好插件模闆檔案: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
即可測試我們的功能了。