Ollydbg和x96dbg开发插件及VS调试踩的坑

插件编写实战

我们要做一个类似于SharpOD的插件,来帮我们能够调试异常处理函数

也就是我们要写一个Dll进行API Hook

把之前说的跳转改掉

OD的SDK帮我们写好了修改被调试进程的内存修改函数,也就是这里:

Writememory

那时候调用这个函数呢? 以下是插件的回调函数:

利用这个帮助文档,代码示例如下:

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include "Plugin.h"
#pragma comment(lib,"OLLYDBG.LIB")


extc int _export cdecl ODBG_Plugindata(char* shortname)
{
    strcpy_s(shortname, 31, "my_od_plugin");
    return PLUGIN_VERSION;
}


extc int _export cdecl ODBG_Plugininit(
    int ollydbgversion,
    HWND hw,
    unsigned long* features) 
{
    return 0;
}

extc int ODBG_Paused cdecl(int reason, t_reg* reg)
{
    //拿一下函数在内存的句柄
    HMODULE hKernel = GetModuleHandle("Kernelbase.dll");
    BYTE* Addr = (BYTE*)GetProcAddress(hKernel, "UnhandledExceptionFilter");
    
    //定位偏移
    Addr += 0xA9;


    char m_byte = 0x84;
    Writememory((void*)&m_byte, (ulong)Addr, 1, MM_SILENT);
    return 0;
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

同理,我们开发下X96dbg的:

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include "plugin.h"



#include <Windows.h>
#include <process.h>

int pluginHandle;
HWND hwndDlg;
int hMenu;
int hMenuDisasm;
int hMenuDump;
int hMenuStack;

// 导出函数
extern "C" __declspec(dllexport) void CBMENUENTRY(CBTYPE cbType, PLUG_CB_MENUENTRY * info);
extern "C" __declspec(dllexport) void plugsetup(PLUG_SETUPSTRUCT * setupStruct);
extern "C" __declspec(dllexport) bool pluginit(PLUG_INITSTRUCT * initStruct);
extern  "C"  __declspec (dllexport)  void  CBINITDEBUG(CBTYPE  cbType, PLUG_CB_INITDEBUG * info);
extern  "C"  __declspec (dllexport)  void  CBSTOPDEBUG(CBTYPE  cbType, PLUG_CB_STOPDEBUG * info);
extern  "C"  __declspec (dllexport)  void  CBEXCEPTION(CBTYPE  cbType, PLUG_CB_EXCEPTION * info);
extern  "C"  __declspec (dllexport)  void  CBDEBUGEVENT(CBTYPE  cbType, PLUG_CB_DEBUGEVENT * info);



// 在这里初始化插件数据。
bool pluginInit(PLUG_INITSTRUCT* initStruct)
{
    // 返回false以取消加载插件。
    return true;
}

// 在此处取消初始化插件数据。
void pluginStop()
{
}

// 在这里做GUI/菜单相关的事情。
void pluginSetup()
{
}

// 菜单被点击回调
void CBMENUENTRY(CBTYPE cbType, PLUG_CB_MENUENTRY* info)
{
    // 此菜单用于实现功能,并测试
    MessageBox(0, "hello lyshark", 0, 0);
}

PLUG_EXPORT bool pluginit(PLUG_INITSTRUCT* initStruct)
{


    // 插件初始化
    initStruct->sdkVersion = PLUG_SDKVERSION;
    initStruct->pluginVersion = 1;
    const char* name = "CheckME -->";
    memset(initStruct->pluginName, 0, 128);
    memcpy(initStruct->pluginName, name, strlen(name));

    return pluginInit(initStruct);
}

PLUG_EXPORT bool plugstop()
{
    pluginStop();
    return true;
}



PLUG_EXPORT void  CBDEBUGEVENT(CBTYPE  cbType, PLUG_CB_DEBUGEVENT* info)
{
    //拿一下函数在内存的句柄
    HMODULE hKernel = GetModuleHandle("Kernelbase.dll");
    BYTE* Addr = (BYTE*)GetProcAddress(hKernel, "UnhandledExceptionFilter");

    //定位偏移
    Addr += 0xA9;


    char m_byte = 0x84;
    DbgMemWrite((duint)Addr, &m_byte, 1);

    return;
}





PLUG_EXPORT void plugsetup(PLUG_SETUPSTRUCT* setupStruct)
{
    hwndDlg = setupStruct->hwndDlg;
    hMenu = setupStruct->hMenu;
    hMenuDisasm = setupStruct->hMenuDisasm;
    hMenuDump = setupStruct->hMenuDump; 
    hMenuStack = setupStruct->hMenuStack;

    // 增加二级菜单
    char sub_menu[] = { "PowerBy LyShark" };
    _plugin_menuaddentry(setupStruct->hMenu, 2, sub_menu);

    pluginSetup();
}







BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

值得注意的是,x96dbg开发插件如果要调试的话,稍微有点麻烦

首先是输出要改一下后缀,后缀不能是dll,而是要写.dp32

而且输出目录也要改成x96dbg的插件目录

然后把调试的参数改为x96dbg的exe所在路径

这样之后,按下F5才可以断下来

还有值得一提的是x96dbg的回调导出函数,我这该死的中文文档并未提及,我找了半天

extern  "C"  __declspec ( dllexport )  void  CBINITDEBUG ( CBTYPE  cbType ,  PLUG_CB_INITDEBUG *  info ); 
extern  "C"  __declspec ( dllexport )  void  CBSTOPDEBUG ( CBTYPE  cbType ,  PLUG_CB_STOPDEBUG *  info ); 
extern  "C"  __declspec ( dllexport )  void  CBEXCEPTION ( CBTYPE  cbType ,  PLUG_CB_EXCEPTION *  info); 
extern  "C"  __declspec ( dllexport )  void  CBDEBUGEVENT ( CBTYPE  cbType ,  PLUG_CB_DEBUGEVENT *  info ); 
extern  "C"  __declspec ( dllexport )  void  CBMENUENTRY ( CBTYPE  cbType ,  PLUG_CB_MENUENTRY *  info );

这些回调函数是针对调试器插件开发的,在 x96dbg 中用于处理不同类型的调试事件。以下是每个回调函数的作用:

  1. CBINITDEBUG: 当调试器初始化时调用此回调函数。这个回调函数允许插件在调试器启动时执行一些初始化操作,比如注册一些特定的事件处理器或者设置一些调试环境。

  2. CBSTOPDEBUG: 当调试器停止时调用此回调函数。这个回调函数允许插件在调试器停止时执行一些清理工作,比如释放资源或者关闭一些已经打开的文件。

  3. CBEXCEPTION: 当调试器捕获到异常时调用此回调函数。这个回调函数允许插件处理程序中的异常情况,比如访问违规或者除零等。

  4. CBDEBUGEVENT: 当调试器捕获到调试事件时调用此回调函数。这个回调函数允许插件处理各种调试事件,比如断点命中、单步执行、内存访问等。

  5. CBMENUENTRY: 当用户在调试器菜单中选择了插件提供的菜单项时调用此回调函数。这个回调函数允许插件执行与菜单项相关的操作,比如执行特定的分析、跳转到特定的地址等。

他喵的终于断下来了

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ollydbg 插件开发文档是一个详细的指南,旨在帮助开发者了解和使用ollydbg软件的插件开发功能。该文档提供了对插件开发的基本概念和原理的解释,并介绍了如何编写、调试和测试ollydbg插件的步骤和技巧。 首先,文档介绍了ollydbg插件框架的基本结构和组成部分。它讲解了插件的主要组成部分,如菜单、工具栏、命令和事件处理函数,并解释了它们之间的关系和相互作用方式。同时,文档还提供了一些常用的API函数的说明,以供插件开发者调用和使用。 接下来,文档详细介绍了ollydbg插件开发所需的工具和环境配置。它提供了编译和链接插件的方法和要求,并展示了如何在ollydbg中加载和运行插件。此外,文档还介绍了ollydbg插件调试技巧,包括如何使用ollydbg调试器和断点功能来调试插件本身。 在插件开发过程中,文档还提供了一些示例代码和案例研究,以帮助开发者更好地理解和应用ollydbg插件开发功能。开发者可以参考这些示例代码,并根据自己的需求进行修改和扩展。 最后,在文档的结尾部分,还提供了一些常见问题和解决方案,以供开发者参考。这些问题涵盖了插件开发过程中可能遇到的各种情况和困难,并给出了相应的解决方案和建议。 总之,ollydbg插件开发文档是一个全面而深入的指南,旨在帮助开发者充分了解和开发ollydbg插件。通过阅读和使用该文档,开发者可以更加高效地开发功能强大的ollydbg插件,并为软件逆向工程调试提供更好的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值