欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]科普文之如何编写ollydbg插件

[原创]科普文之如何编写ollydbg插件

一、概述
1.插件目录
    Ollydbg的插件目录根据每个用户设置的不同而各不相同,本文中Ollydbg的插件目录为根目录下的plugin文件夹。可以通过菜单Options的Appearance中Directories设置。
   
2.插件通信方式
    Ollydbg与插件之间的通信使用回调函数的方式。Ollydbg的plugin SDK中提供了170多个函数可供开发者使用。
3.插件加载方式
    Ollydbg启动时会遍历该目录下所有可用的DLL文件使用LoadLibrary加载,加载后使用GetProcAddress获取导出函数_ODBG_Plugindata和_ODBG_Plugininit,如果存在并且插件版本兼容,Ollydbg会在插件子菜单增加插件选项。
二、编写一个简易插件
    新建一个win32的dll项目,将拷贝到工程目录中。接下来需要修改项目属性,在C/C++中为命令行添加 /J ,意思就是默认所有char都是unsigned char
   

#include <windows.h>
#include "Plugin.h"
/************************************************************************
函数名称:_ODBG_Plugindata
函数功能:设置插件的名字
参    数:shortname  插件名字
返 回 值:ollydbg版本号
备    注:必须存在的函数之一
************************************************************************/
extc int  _export cdecl _ODBG_Plugindata(char shortname[32])
{
    strcpy_s(shortname, 32, "掮客酒馆插件");
    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   菜单数量
返 回 值:正常返回TRUE,异常返回FALSE
备    注:每个菜单项之间用'|'字符隔开
************************************************************************/
extc int  _export cdecl _ODBG_Pluginmenu(int origin, char data[4096], void *item)
{
    //检查是否点击子菜单
    if (origin == PM_MAIN)
    {
        strcpy_s(data, 4096, "0 &Msg |1 &www.jmpoep.com |2 &About");
    }
    return TRUE;
}
/************************************************************************
函数名称:_ODBG_Pluginaction
函数功能:响应菜单事件
参  数 1:origin 用户点击的菜单下标
参  数 2:action 点击的子菜单下标
参  数 2:item 菜单数量
返 回 值:无
************************************************************************/
extc void _export cdecl _ODBG_Pluginaction(int origin, int action, void *item)
{
    //检查是否点击子菜单
    if (origin != PM_MAIN)
    {
        return;
    }
    switch (action)
    {
    case 0:
        MessageBox(NULL, TEXT("掮客酒馆"), TEXT("提示"), MB_OK);
        break;
    case 1:
        ShellExecute(NULL, TEXT("open"), TEXT("http://www.jmpoep.com"), NULL, NULL, SW_SHOW);
        break;
    case 2:
        MessageBox(NULL, TEXT("Code By B1nGzL"), TEXT("提示"), MB_OK);
        break;
    default:
        break;
    }
}
BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
{
    return TRUE;
}

    一个简易插件就开发完成了
   

上传的附件 1.jpg
2.jpg
3.jpg

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功