欢迎来到 嗅灵易学

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

[原创][开源]OllyDbg 2.x插件编写教程

[原创][开源]OllyDbg 2.x插件编写教程

AntiDebug三篇已完结,以下是链接
窗口相关AntiDebug及Od反AntiDebughttp://bbs.pediy.com/showthread.php?t=206168
NTQ相关AntiDebug及Od反AntiDebughttp://bbs.pediy.com/showthread.php?t=206118
PEB相关AntiDebug及Od反AntiDebug
http://bbs.pediy.com/showthread.php?t=206117
记得前面好像有篇关于1.x的教程,而OllyDbg2.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

    上传的附件 1.png
    2.png
    3.png
    4.png
    5.png
    6.png
    7.png
    Odb2插件.rar

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

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

    0 0 0 举报
    复制成功