OllyDbg Plugin SDK( 修改版 ):

sdkupdat.zip


設置步驟


添加資源

  • 將上方SDK中的plugin.hollydbgvc7.lib拉到當前項目中
  • 標頭檔右鍵加入現有項目→選擇plugin.h
  • ollydbgvc7.lib從VS2019中直接拖入,目錄大概長這樣: Untitled

VS2019設置

  • 先創建一個Dll項目,然後把dllmain刪去
  • 屬性進階字元集多位元組
  • 屬性C/C++所有選項其他選項:/J ( 意思就是默認所有char都是unsigned char )
  • 屬性C/C++先行編譯的標頭檔未使用

調試相關

為了方便調試,可將OD拖入當前項目中

  • 設置Dll生成路徑:屬性連結器一般輸出檔案[OD插件目錄的路徑\]+dllName.dll ( 例如:C:\Users\MSI-PC\Desktop\A\逆向\MyFirstOdPluginSolution\MyFirstOdPlugin\Ollydbg\plugin\MyFirstDll.dll )
  • 設置Dll調試:屬性偵錯命令:C:\Users\MSI-PC\Desktop\A\逆向\MyFirstOdPluginSolution\MyFirstOdPlugin\Ollydbg\吾爱破解[LCG].exe

必要&重要的函數

隨便新建一個.cpp,即可按如下模板開始編寫腳本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include <Windows.h>
#include "plugin.h"
#include <iostream>

////////////////////////////////////////////////
//plugin.h中有如下定義:////
//////////////////////////////////////////////
/*
#ifdef __cplusplus
#define extc extern "C" // Assure that names are not mangled
#else
#define extc extern
#endif

#define _export __declspec(dllexport)
*/

/************************************************************************
函數名稱:_ODBG_Plugindata
函數功能:設置插件的名字
參 數:shortname 插件名字
返 回 值:ollydbg版本號
備 注:必須存在的函數之一
************************************************************************/
extc int _export cdecl ODBG_Plugindata(char* shortname) {
const char* pluginName = "我的插件例子";
strcpy_s(shortname, strlen(pluginName) + 1, pluginName);
return PLUGIN_VERSION;
}
/************************************************************************
函數名稱:_ODBG_Plugininit
函數功能:初始化插件
參 數 1:ollydbgversion 當前OD的版本
參 數 2:hw ollydbg主窗口的句柄
參 數 3:features 拓展,暫時無用
返 回 值:正常返回null,異常返回-1
備 注:必須存在的函數之一
************************************************************************/
extc int _export cdecl _ODBG_Plugininit(int ollydbgversion, HWND hw, ulong* features){

//檢查插件版本與調試器版本是否兼容
if (ollydbgversion < PLUGIN_VERSION)
{
return -1;
}
return 0;
}

/************************************************************************
函數名稱:_ODBG_Pluginmenu
函數功能:添加菜單
參 數 1:origin 用戶點擊的菜單下標
參 數 2:data 子菜單名稱緩衝區
參 數 3:item 根據origin的不同,item會傳入不同的結構體
返 回 值:正常返回TRUE,異常返回FALSE
備 注:每個菜單項之間用'|'or','字符隔開
************************************************************************/
extc int _export cdecl _ODBG_Pluginmenu(int origin, char data[4096], void* item){
//PM_MAIN代表在OD的主菜單中點擊
if (origin == PM_MAIN)
{
strcpy_s(data, 4096, "0&頂部子菜單一,1&頂部子菜單二"); //固定寫法,數字是每個item的編號( 只要不一樣就可以,不一定要按順序,但數值不能太大 )
}

//PM_DISASM代表在OD的反匯編窗口中點擊
if (origin == PM_DISASM) {
strcpy_s(data, 4096, "反匯編窗口的右鍵菜單{11&右鍵子菜單一,22&右鍵子菜單二}"); //子菜單寫法,數字是每個item的編號( 只要不一樣就可以,不一定要按順序,但數值不能太大 )
}
return TRUE;
}

/************************************************************************
函數名稱:_ODBG_Pluginaction
函數功能:響應菜單事件
參 數 1:origin 用戶點擊的菜單下標
參 數 2:action 點擊的子菜單ID(在_ODBG_Pluginmenu函數中設置)
參 數 3:item 根據origin的不同,item會傳入不同的結構體
返 回 值:無
************************************************************************/
extc void _export cdecl _ODBG_Pluginaction(int origin, int action, void* item)
{
//如果是在主菜單中點擊
if (origin == PM_MAIN) {
switch (action)
{
case 0:
MessageBox(0, "頂部子菜單一", "標題", MB_OK);
break;
case 1:
MessageBox(0, "頂部子菜單二", "標題", MB_OK);
break;
default:
break;
}
}

//如果是在反匯編窗口中點擊
if (origin == PM_DISASM) {
switch (action)
{
case 11:
MessageBox(0, "右鍵子菜單一", "標題", MB_OK);
break;
case 22:
MessageBox(0, "右鍵子菜單二", "標題", MB_OK);
break;
default:
break;
}
}

}

資訊來源