首页
社区
课程
招聘
[原创]Windows7下的OllyDBG的异常断点补丁(含原理、源码及插件)
发表于: 2015-7-25 19:50 19240

[原创]Windows7下的OllyDBG的异常断点补丁(含原理、源码及插件)

2015-7-25 19:50
19240
收藏
免费 3
支持
分享
最新回复 (35)
雪    币: 8891
活跃值: (3123)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
期待更多好文章
2015-7-30 08:50
0
雪    币: 110
活跃值: (527)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
27
这广告打得相当华丽
2015-7-30 21:48
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
28
你写得太好了,学习了
2015-7-31 19:44
0
雪    币: 35
活跃值: (627)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
有问题吧 运行 在暂停 程序  在运行再暂停  就崩溃了。
而且没看懂。是想进入异常回调函数里边调试吗

LONG __stdcall MyException(_EXCEPTION_POINTERS *ExceptionInfo )
{
    int n = *(int*)((int)&ExceptionInfo - 4);

    printf("0x%p \r\n", n);
    return EXCEPTION_EXECUTE_HANDLER;
}
2015-7-31 23:35
0
雪    币: 9
活跃值: (107)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
30
make
2015-8-23 22:40
0
雪    币: 57
活跃值: (351)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
31
占个楼,看看
2015-8-26 03:02
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
32
学习一下。。
2015-8-30 06:58
0
雪    币: 41
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
33
我来补充下~~ZwQueryInformationProcess 查询出来的是DebugPort字段,然后下面判断该字段后 决定是调试器来处理 还是程序自己来处理
2015-9-8 11:26
0
雪    币: 41
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
感觉内核整个调试流程都要HOOK一下,不然一个DebugPort就可以整死
2015-9-8 11:28
0
雪    币: 273
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
35
mark
2016-7-20 05:53
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
36
最近刚研究完异常处理,说几点:
1.这个不是OD的Bug,你用Windbg结果也一样,这是系统在UnhandledExceptionFilter函数中的特殊处理,发现有调试器就会跳过后面的终结处理过程。
2.33楼说到一些重点,系统判断调试器是否存在的方法就是调用ntdll!NtQueryInformationProcess查询DebugPort,你可以Hook kernel32.dll的IAT,钩住这个函数,判断查询的是ProcessDebugPort,直接返回失败或者修改返回的DebugPort值为0使系统认为调试器不存在,就会进入到你自己设置的Filter函数了。你源码中硬编码的方法及特征码搜索的方法反而落了下乘,通用性比较差,而Hook方法从Win2000兼容到Win10都没问题

#define ProcessDebugPort  7
BOOL BasepIsDebugPortPresent()
{
    HANDLE DebugPort = NULL;
    NTSTATUS status = NtQueryInformationProcess(NtCurrentProcess(), 
      ProcessDebugPort  ,
      &DebugPort, 
      sizeof(HANDLE),
      0) ;
     return  status >= 0 && DebugPort!=NULL;
}


3.除了要调试自定义的UnhandledFilter函数这一种情况,其它时候不需要这么做,否则反而增加麻烦。本来每个异常有两次机会给调试器处理,你这样打完补丁之后就没有第二次机会了。

这些知识在张银奎老师的《软件调试》一书中讲得非常透彻,楼主可以参考一下
2016-7-20 12:59
0
游客
登录 | 注册 方可回帖
返回
//