- 1.pluginit 导出函数
- 2.作者答疑
pluginit是 x64dbg 在加载动态链接库(.dp32或.dp64)后调用的第一个导出函数,如果pluginit不存在,则此时插件加载将失败。pluginit将指向PLUG_INITSTRUCT结构的指针作为函数中的唯一参数传递:initStruct。此结构用于向 x64dbg 注册插件并获取有效的插件句柄,以便在未来的 api 调用中使用。 PLUG_INITSTRUCT结构定义:
typedef struct
{
//provided by the debugger
int pluginHandle;
//provided by the pluginit function
int sdkVersion;
int pluginVersion;
char pluginName[256];
} PLUG_INITSTRUCT;
因此,我们必须将有效信息放回此结构中,以便 x64dbg 验证和识别我们的插件。一些定义的可用于提供通过该结构的字段所需的信息:pluginVersion(PLUGIN_VERSION-由用户定义)和sdkVersion(PLUG_SDKVERSION-在SDK预定义- SDK的版本x64dbg期望)。该pluginName是包含插件的名称的字符串缓冲区。该pluginHandle字段作为句柄提供给我们,我们可以在未来的 api 调用中保存和重用。当然,我们需要声明一些用于通过PLUG_INITSTRUCT结构将这些信息传回的变量和字符串,并存储返回给我们的信息(pluginHandle in pluginit和plugsetup稍后调用中的其他句柄)。以下是定义它们的方法:
// Plugin SDK required variables
#define plugin_name "x64dbg_plugin" // rename to your plugins name
#define plugin_version 1
// GLOBAL Plugin SDK variables
int pluginHandle;
HWND hwndDlg;
int hMenu;
int hMenuDisasm;
int hMenuDump;
int hMenuStack;
现在我们已经设置了我们的变量和字符串,我们已经准备好构建我们的pluginit函数了。下面是pluginitC++(32 位和 64 位)中的几个示例,如下所示:
DLL_EXPORT bool pluginit(PLUG_INITSTRUCT* initStruct)
{
initStruct->pluginVersion = plugin_version;
initStruct->sdkVersion = PLUG_SDKVERSION;
strcpy(initStruct->pluginName, plugin_name);
pluginHandle = initStruct->pluginHandle;
// place any additional initialization code here
return true;
}
在汇编程序(x86 和 x64)中,您还必须将导出的函数添加到 .def 文件中,以便在编译和链接时外部调用者可以看到它们:
LIBRARY MyPlugin
EXPORTS pluginit
plugstop
plugsetup
2.作者答疑
如有疑问,敬请留言。