AntiDebug三篇已完结,以下是链接
窗口相关AntiDebug及Od反AntiDebug:
http://bbs.pediy.com/showthread.php?t=206168
NTQ相关AntiDebug及Od反AntiDebug:
http://bbs.pediy.com/showthread.php?t=206118
PEB相关AntiDebug及Od反AntiDebug:
http://bbs.pediy.com/showthread.php?t=206117
记得前面好像有篇关于1.x的教程,而OllyDbg
2.x插件编写教程整个网络几乎没有(PS:可能我搜索方式不对
),所以,我来试试看
- VS建立一个DLL工程
- 取得OllyDbg指定版本的SDK
- 在C/C++编译选项-命令行添加“/J” 说明工程中的char均为 UNSIGNED类型
- 定义如下全局变量与宏定义
#define PLUGINNAME L"Tennn"
#define MY_PLUGIN L"1.0"
t_table g_Tennn={0};
●
插件信息查询函数
此函数是必须存在的函数 也是OllyDbg第一个调用的函数 此函数负责检查当前
的OllyDbg是否可运行此插件。
extc INT __cdecl ODBG2_Pluginquery(int ollydbgversion,ulong *features,
wchar_t pluginname[SHORTNAME],
wchar_t pluginversion[SHORTNAME])
{
//检查Olldbg版本
if (ollydbgversion<201)
{
return 0;
}
//设置Olldbg插件名称与版本
StringCchCopy(pluginname,SHORTNAME,PLUGINNAME);//设置插件名称
StringCchCopy(pluginversion,SHORTNAME,MY_PLUGIN);//设置插件版本
//返回需要的API版本
return PLUGIN_VERSION;
}
●
插件初始化函数
此函数是可选函数 也是OllyDbg第二个调用的函数 负责初始化插件的资源
extc int __cdecl ODBG2_Plugininit(void)
{
MessageBox(0,L"Hello Pediy",0,0);
HWND hParent=GetActiveWindow();
LPCWSTR lpDlgID=MAKEINTRESOURCE(IDD_DIALOG1);
g_hwnd=CreateDialog(g_hModule,lpDlgID,hParent,(DLGPROC)RightClickMenu1);
return 0;
}
●
插件重置函数
此函数是可选函数 当OllyDbg重新加载程序或打开新的程序时被调用
extc void __cdecl ODBG2_Pluginreset(void)
{
Deletesorteddatarange(&(g_Tennn.sorted),0,0xFFFFFFFF);
}
●
插件关闭函数
此函数是可选函数 当用户关闭OllyDbg时被调用
extc int __cdecl ODBG2_Pluginclose(void)
{
Writetoini(NULL,PLUGINNAME,L"Restore",L"%i",g_Tennn.hw!=NULL);
return 0;
}
●
插件销毁函数
此函数是可选函数 当用户关闭OllyDbg时被调用,此时由插件创建的所有MDI窗口都已经被销毁
extc void __cdecl ODBG2_Plugindestroy(void)
{
Destroysorteddata(&(g_Tennn.sorted));
}
●
填充菜单结构体数组
主菜单
static t_menu g_stcMainMenu[]={
{
L"主菜单1",
L"主菜单11111111111111111",
K_NONE,MenuFun1,NULL,0
},
{
L"主菜单2",
L"主菜单22222222222222222",
K_NONE,MenuFun2,NULL,1
},
{
NULL,NULL,K_NONE,NULL,NULL,0
}
}
右键菜单
static t_menu g_stcRightClickMenu[]={
{
L"右键菜单1111",
L"右键11111111111111111",
KK_DIRECT | KK_CTRL | 'A',RightClickMenu1,NULL,0},
{
L"右键菜单2222",
L"右键222222222222222222",
KK_DIRECT | KK_CTRL | 'C',RightClickMenu2,NULL,1},
{
NULL,NULL,K_NONE,NULL,NULL,0
}
};
●
菜单回调函数
主菜单
static int MenuFun1(t_table *pt,wchar_t *name,ulong index,int mode)
{
if (mode==MENU_VERIFY)
{
// MessageBox(0,L"MENU_NORMAL11111",0,0);
return MENU_NORMAL;
}
if (mode==MENU_EXECUTE)
{
MessageBox(0,L"MENU_NOREDRAW11111",0,0);
return MENU_NOREDRAW;
}
return MENU_ABSENT;
}
右键菜单
static int RightClickMenu1(t_table *pt,wchar_t *name,ulong index,int mode)
{
//第一次调用 执行初始化操作
if (mode==MENU_VERIFY)
{
// MessageBox(0,L"MENU_NORMAL11111",0,0);
return MENU_NORMAL;
}
//第二次调用 执行菜单逻辑操作
if (mode==MENU_EXECUTE)
{
MessageBox(0,L"MENU_NOREDRAW11111",0,0);
ShowWindow(g_hwnd,SW_SHOW);
return MENU_NOREDRAW;
}
return MENU_ABSENT;
}
●
对话框
响应右键菜单
RightClickMenu1
INT_PTR CALLBACK RightClickMenu1(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
{
//点击按钮
case IDC_BUTTON1:
MessageBox(0,0,0,0);
EndDialog(hDlg, LOWORD(wParam));
}
break;
}
return (INT_PTR)FALSE;
}
●
效果图
第一次初始化(打开OD):
主菜单:
右键菜单:
●
我想做一个成熟插件出来,如何调试?
很简单 右键项目属性-配置属性-调试-命令-添加OD目录
完。
------------------------
源码:
Odb2插件.rar
[课程]Android-CTF解题方法汇总!