• 逆向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动态链空文件。

    调试环境设置

  • 相关阅读:
    SDUT 2143 图结构练习——最短路径 SPFA模板,方便以后用。。 Anti
    SDUT ACM 1002 Biorhythms 中国剩余定理 Anti
    nyist OJ 119 士兵杀敌(三) RMQ问题 Anti
    SDUT ACM 2157 Greatest Number Anti
    SDUT ACM 2622 最短路径 二维SPFA启蒙题。。 Anti
    二叉索引树 区间信息的维护与查询 Anti
    SDUT ACM 2600 子节点计数 Anti
    UVA 1428 Ping pong 二叉索引树标准用法 Anti
    2010圣诞Google首页效果
    Object
  • 原文地址:https://www.cnblogs.com/ltyandy/p/11166222.html
Copyright © 2020-2023  润新知