能力值:
( LV2,RANK:10 )
|
-
-
26 楼
期待更多好文章
|
能力值:
( LV4,RANK:40 )
|
-
-
27 楼
这广告打得相当华丽
|
能力值:
( LV2,RANK:10 )
|
-
-
28 楼
你写得太好了,学习了
|
能力值:
( 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;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
30 楼
make
|
能力值:
( LV7,RANK:100 )
|
-
-
31 楼
占个楼,看看
|
能力值:
( LV2,RANK:10 )
|
-
-
32 楼
学习一下。。
|
能力值:
( LV2,RANK:10 )
|
-
-
33 楼
我来补充下~~ZwQueryInformationProcess 查询出来的是DebugPort字段,然后下面判断该字段后 决定是调试器来处理 还是程序自己来处理
|
能力值:
( LV2,RANK:10 )
|
-
-
34 楼
感觉内核整个调试流程都要HOOK一下,不然一个DebugPort就可以整死
|
能力值:
( LV2,RANK:10 )
|
-
-
35 楼
mark
|
能力值:
( 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函数这一种情况,其它时候不需要这么做,否则反而增加麻烦。本来每个异常有两次机会给调试器处理,你这样打完补丁之后就没有第二次机会了。
这些知识在张银奎老师的《软件调试》一书中讲得非常透彻,楼主可以参考一下
|
|
|