zoukankan      html  css  js  c++  java
  • 逆向3.OD插件添加及 ODBG2_Pluginnotify配合PN_NEWPROC反反调试



    OD插件添加及 ODBG2_Pluginnotify配合PN_NEWPROC反反调试 #include
    <string.h> #include <windows.h> ​ #include <winternl.h> #pragma comment(lib,"ntdll.lib")struct MYPROCESS_BASIC_INFORMATION { ULONG ExitStatus; // 进程返回码 DWORD PebBaseAddress; // PEB 地址 ULONG AffinityMask; // CPU 亲和性掩码 LONG BasePriority; // 基本优先级 ULONG UniqueProcessId; // 本进程PID ULONG InheritedFromUniqueProcessId; // 父进程PID }stcProcInfo; ​ // 0. 准备好一个 2.01 版本的OD,并配置插件目录 Options->Directories->第三项 // - 设置当前项目属性中,调试选项的命令行参数为 OD 所在的路径 // - 将输出路径设置为 OD 指定的插件路径 // 1. 包含 OD 提供的编写插件需要用到的头文件和 lib #include "Plugin/od_plugin.h" #pragma comment(lib, "Plugin/ollydbg.lib")// 2. 在项目属性 CC++ 中设置命令行属性 /J,为了将默认的 char 设置为无符号的 // 3. 定义插件的名称和对应的版本信息 #define PLUGINNAME L"DEMO" // 插件名称 #define MY_VERSION L"0.01" // 插件版本 ​ ​ // 4. 导出必须的函数,主要用于提供版本和名称信息,并判断是否匹配 OD 的 版本 extc int __cdecl ODBG2_Pluginquery(int ollydbgversion, ulong* features, wchar_t pluginname[SHORTNAME], wchar_t pluginversion[SHORTNAME]) { // 1. 检查 OllyDBG 的兼容版本 if (ollydbgversion < 201) return 0; ​ // 2. 设置 OllyDBG 插件的名称与版本 wcscpy_s(pluginname, SHORTNAME, PLUGINNAME); // 设置插件名称 wcscpy_s(pluginversion, SHORTNAME, MY_VERSION); // 设置插件版本 // 3. 返回需要的API版本 return PLUGIN_VERSION; }; ​ // 保存的是菜单的信息 static t_menu g_stcMainMenu[2]; static t_menu g_stcDasmMenu[2]; ​ // 对应的菜单回调函数 static int MenuFun(t_table* pt, wchar_t* name, ulong index, int mode) { // mode 表示当前是在什么情况下被调用,MENU_VERIFY 表示是第一次 if (mode == MENU_VERIFY) { // 主菜单 if (index == 1) return MENU_NORMAL | MENU_CHECKED; // 汇编菜单 else return MENU_GRAYED; } ​ // 表示点击按钮的时候会执行的操作 if (mode == MENU_EXECUTE) { // 主菜单 if (index == 1) MessageBox(NULL, L"主菜单响应", L"菜单", MB_OK); // 汇编菜单 else MessageBox(NULL, L"汇编菜单响应", L"菜单", MB_OK); } return MENU_NOREDRAW; ​ return MENU_ABSENT; }; ​ ​ // 在插件被加载的时候会被调用,通常用于执行插件的初始化操作 extc int __cdecl ODBG2_Plugininit(void) { // 设置主菜单的信息,菜单的结束必须是全 0 的结构 g_stcMainMenu[0].name = (LPWSTR)L"主菜单"; g_stcMainMenu[0].help = (LPWSTR)L"主菜单帮助"; g_stcMainMenu[0].menufunc = MenuFun; // index 充当的就是 id 的角色 g_stcMainMenu[0].index = 1; ​ g_stcDasmMenu[0].name = (LPWSTR)L"汇编菜单"; g_stcDasmMenu[0].help = (LPWSTR)L"汇编菜单帮助"; g_stcDasmMenu[0].menufunc = MenuFun; g_stcDasmMenu[0].index = 2; ​ return 0; }; ​ ​ // 在需要显示菜单的时候会被调用 extc t_menu* __cdecl ODBG2_Pluginmenu(wchar_t* type) { // 1. 判断是否为主菜单弹出请求,是则弹出主菜单 if (!wcscmp(type, PWM_MAIN)) return g_stcMainMenu; ​ // 2. 判断是否为CPU窗口右键菜单弹出请求,是则弹出右键菜单 if (!wcscmp(type, PWM_DISASM)) return g_stcDasmMenu; ​ // 3. 返回空 return NULL; }; ​ ​ // 通知函数,调试器产生一些特定的事件就会调用这个函数 pentry(void) ODBG2_Pluginnotify(int code, void* data, ulong parm1, ulong parm2) { // 一个新的进程被调试了 if (code == PN_NEWPROC) { // 实现修改目标进程的 PEB.BeingDebuged 字段为 0 的操作 DWORD Size = 0; ​ // 1. 通过附加参数的 pid 打开进程句柄 HANDLE Handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, parm1); ​ // 2. 查询到目标进程的对应信息,主要是 PEB NtQueryInformationProcess( Handle,// 目标进程的句柄 !!!!!! ProcessBasicInformation, &stcProcInfo, sizeof(stcProcInfo), NULL); ​ // 3. 修改目标 PEB 偏移 2 的位置为0 WriteProcessMemory(Handle, (LPVOID)(stcProcInfo.PebBaseAddress + 2), "", 1, &Size); } }

     

    创建的是dll动态链空文件。

    调试环境设置

  • 相关阅读:
    让你的python程序同时兼容python2和python3
    Python3.x 和Python2.x 区别
    python类型转换、数值操作(收藏)
    Python IDLE快捷键一览
    Python数据类型详解
    sublime text3安装SublimeREPL--解决不能运行input()的问题
    C语言(六)语句
    C语言(五)数学函数
    C语言(四)隐式类型转换规则
    C语言(三)关键字
  • 原文地址:https://www.cnblogs.com/ltyandy/p/11166222.html
Copyright © 2011-2022 走看看