OllyDbg插件编写

来源:互联网 发布:河北省广电网络 编辑:程序博客网 时间:2024/06/05 12:00

首先要去下载ollydbg.lib和plugin.h这两个文件,放到程序文件夹里面


#define  _CHAR_UNSIGNED

#include <windows.h>
#include "plugin.h"
#include <winuser.h>
#include "resource.h"
#pragma comment(lib,"ollydbg.lib")


t_table   g_stcHelloWorld = {0};
int  g_Id = 0;


/**********************************************************/
/* 函数名:插件信息查询函数【回调函数】
/* 说  明:    此函数是必须存在的函数,也是OllyDBG第1个调用的函数。此函数负
/*         责检查当前的OllyDBG版本是否可以运行此插件,如果不能运行则需要返
/*         回0 。
/* 参  数:
/*   int           ollydbgversion                       : [ IN] OllyDBG的版本
/*   ulong      *features                                : [ IN] 包含一些额外的版本相关信息
/*   wchar_t  pluginname[SHORTNAME]    : [OUT] 插件名称
/*   wchar_t  pluginversion[SHORTNAME] : [OUT] 插件版本
/* 返回值:
/*   int : 返回所需要的API版本,如不匹配则返回0
/**********************************************************/




extern "C" _declspec(dllexport)
//插件信息查询函数
int __cdecl ODBG2_Pluginquery
(
int ollydbgversion,
ULONG *features,
wchar_t pluginname[SHORTNAME],
wchar_t pluginversion[SHORTNAME]
)


{
//告知插件名称
memcpy(pluginname,L"Jacob",sizeof(WCHAR)*wcslen(L"Jacob"));
//告知插件版本
memcpy(pluginversion,L"1.2",sizeof(WCHAR)*wcslen(L"1.2"));
MessageBox(0,0,0,0);
return PLUGIN_VERSION;




}






// 函数名:插件初始化函数【回调函数】
// 说   明:此函数是可选函数,也是OllyDBG第2个调用的函数。负责初始化插件的初始资源。
// 返回值:
//   int : 成功返回0,失败返回-1


INT_PTR CALLBACK hehe(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{


switch(message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;


case WM_COMMAND:
if(LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg,LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
};


extc int __cdecl ODBG2_Plugininit(void)
{


// 创建窗口
HWND    hParent = GetActiveWindow( );
LPCTSTR lpDlgID = MAKEINTRESOURCE(IDD_DIALOG1);
HINSTANCE g_hModule = GetModuleHandle(L"ConsoleApplication1");
HWND hWnd = CreateDialog(g_hModule,lpDlgID,hParent,hehe);
ShowWindow(hWnd,SW_SHOW);
return 0;


};




//函数说明:插件重置函数(回调函数)
//说明:此函数是可选函数,当0重新加载程序或者打开新的程序时,这个函数将会被调用
extc void __cdecl ODBG2_Pluginreset(void)
{
Deletesorteddatarange(&(g_stcHelloWorld.sorted),0,0xFFFFFFFF);


};






//函数名:插件关闭函数(回调函数)
//说明:此函数是可选函数,当用户关闭Ollydbg会调用这个函数。
extc int __cdecl ODBG2_Pluginclose(void)
{
Writetoini(NULL,L"Jacob",L"Restore",L"%i",g_stcHelloWorld.hw != NULL);
return 0;
}




//函数名:插件销毁函数(回调函数)
//说明:此函数是可选函数,当用户关闭OllyDBG时,OllyDBG会在退出前调用此函数
// 一次,此时由插件创建的所有MDI窗口都已经销毁(并获得WM_DESTROY消息)。
extc void __cdecl ODBG2_Plugindestroy(void)
{
Destroysorteddata(&(g_stcHelloWorld.sorted));
}


extc void ODBG2_Pluginnotify(int code,void* data,ulong parml,ulong parm2)
{
if(code == 1)
{
g_Id = parml;
}
}




//菜单的响应函数,写在菜单数组中,和菜单项绑定到一起
//主菜单
static int MenuFun1(t_table *pt,wchar_t *name,ulong index,int mode)
{
if(mode == MENU_VERIFY)    // 第一次调用(一般执行初始化操作)
return MENU_NORMAL;


if(mode == MENU_EXECUTE) // 第二次调用(一般执行菜单逻辑操作)
{
char buf[10] = {0};
MessageBoxA(NULL,"我要开始反调试了","",0);
//
// DWORD dwSize = 0;
// HANDLE hProcess =
// OpenProcess(PROCESS_ALL_ACCESS,false,g_Id);
// ReadProcessMemory(hProcess,(LPVOID)(0x7EFDE000 + 2),buf,1,&dwSize);
// if(buf[0] == 1)
// {
// buf[0] = 0;
// bool bSuccess = WriteProcessMemory(hProcess,(LPVOID)(LPVOID)(0x7EFDE000 + 2),buf,1,&dwSize);
// if(bSuccess == false)
// {
// MessageBoxA(0,"反调试失败",0,0);
// }
// }
return MENU_NOREDRAW;
}
return MENU_ABSENT;
};
static int MenuFun2(t_table *pt,wchar_t *name,ulong index,int mode)
{
if(mode == MENU_VERIFY)    // 第一次调用(一般执行初始化操作)
{


return MENU_NORMAL;
}
if(mode == MENU_EXECUTE) // 第二次调用(一般执行菜单逻辑操作)
{

MessageBoxA(NULL,"我要开始打开文件了","",0);


}
return MENU_NOREDRAW;


return MENU_ABSENT;
};
static int MenuFun3(t_table *pt,wchar_t *name,ulong index,int mode)
{
if(mode == MENU_VERIFY)    // 第一次调用(一般执行初始化操作)
return MENU_NORMAL;


if(mode == MENU_EXECUTE) // 第二次调用(一般执行菜单逻辑操作)
MessageBoxA(NULL,"我要开始关闭文件了","",0);
return MENU_NOREDRAW;


return MENU_ABSENT;
};
//主菜单
t_menu g_Menu1[] = {
{L"主菜单",L"15PB",K_NONE,MenuFun1,NULL,0},
{0,0,0,0,0,0}
};
//分菜单
t_menu g_Menu2[] = {
{L"清理UDD插件",L"15PB",K_NONE,MenuFun2,NULL,0},
{L"分菜单2",L"PB",K_NONE,MenuFun3,NULL,0},
{0,0,0,0,0,0}
};
t_menu g_Menu3[] = {
{0,0,0,0,0,0}
};
//显示区域
extc t_menu* __cdecl ODBG2_Pluginmenu(wchar_t *type)
{
//判断是否为主菜单请求
if(wcscmp(type,PWM_MAIN)/* == 0*/)
{
return g_Menu1;
}


//判断是否为CPU窗口右键菜单请求
if(wcscmp(type,PWM_DISASM))
{
return g_Menu2;
}
return g_Menu3;
}
0 0
原创粉丝点击