某P更新了。对双机调试进行了校验。
一刀砍倒像我一样的小菜鸟。
迷迷糊糊的弄了几天。
特意在google上下载了一份NT 和2000的内核部分源代码
感谢yishenbiao和小烦的帖子给了我思路:
http://bbs.pediy.com/showthread.php?t=176159
http://bbs.pediy.com/showthread.php?t=176132
下面开始主题
yishenbiao在他的帖子里说了一句话
“我们没法改变某P的代码他现在是有效验。但是我们可以改变某P的数据或者寄存器的数。”
对,我们可以修改其的数据和寄存器的值。
某P调用KdDisableDebugger的代码我没有上了。
说下他会循环调用第二次调用KdDisableDebugger的函数。第一处是不会循环调用的,仅仅加载驱动时调用一次。
第一处判断是否调用KdDisableDebugger成功是KdDebuggerEnabled是否为0
第二处判断是KiDebugRoutine是否为KdpStub。
在IDA里面打开驱动文件,我们可以看到这么一句
ecx为KiDebugRoutine的地址
我利用的就是这一句 test ecx, ecx
很明显 要是ecx是0的话
它就会跳走了、、
所以我们就要让ecx为0
下面看全部代码
我自己用的还好,就是不能在windbg上下断点。
解决方法就是自己再写一个驱动,在里面写一句int 3就行了。想断的时候加载这个驱动。。。
下面请教各位大神关于某P的DebugPort清零。
我找到了两处清零的地方,但是似乎都有检测,并且还不只检测一次。
我不知道该怎么处理了。
另外关于某P禁止OD等所有调试器调试的问题。
我知道它这个是由于Object Hook
修改了DbgkDebugObjectType 里_OBJECT_TYPE_INITIALIZER这个结构体的ValidAccessMask为0
导致所有的调试器都无法调试
但是我不知道该怎么应对这个Hook
求指点。
语文吃紧,各位请不要嘲笑、、、:o:
一刀砍倒像我一样的小菜鸟。
迷迷糊糊的弄了几天。
特意在google上下载了一份NT 和2000的内核部分源代码
感谢yishenbiao和小烦的帖子给了我思路:
http://bbs.pediy.com/showthread.php?t=176159
http://bbs.pediy.com/showthread.php?t=176132
下面开始主题
yishenbiao在他的帖子里说了一句话
“我们没法改变某P的代码他现在是有效验。但是我们可以改变某P的数据或者寄存器的数。”
对,我们可以修改其的数据和寄存器的值。
某P调用KdDisableDebugger的代码我没有上了。
说下他会循环调用第二次调用KdDisableDebugger的函数。第一处是不会循环调用的,仅仅加载驱动时调用一次。
第一处判断是否调用KdDisableDebugger成功是KdDebuggerEnabled是否为0
第二处判断是KiDebugRoutine是否为KdpStub。
在IDA里面打开驱动文件,我们可以看到这么一句
代码:
mov ecx, dword_1040508
test ecx, ecx
jz short locret_10093F3
我利用的就是这一句 test ecx, ecx
很明显 要是ecx是0的话
它就会跳走了、、
所以我们就要让ecx为0
下面看全部代码
代码:
#include "DebugFun.h"
ULONG uAddr;
ULONG uImageBase;
UCHAR BackupAddr[5];
__declspec(naked) VOID HookKdDisableDebugger()
{
__asm
{
// int 3
cmp edi,uAddr
je _lable1
push eax
mov eax,uImageBase
test eax,eax
jz _lable2
add eax,40508h
mov DWORD ptr[eax],0
_lable2:
pop eax
jmp _lable3
_lable1:
add esi,4
_lable3:
retn
}
}
VOID LoadImageRoutine( IN PUNICODE_STRING FullImageName,
IN HANDLE ProcessId, // where image is mapped
IN PIMAGE_INFO ImageInfo)
{
if (wcsstr(FullImageName->Buffer,L"TesSafe.sys") != 0)
{
KdPrint(("Tessafe.sys = %X\n",ImageInfo->ImageBase));
uImageBase = (ULONG)ImageInfo->ImageBase;
}
}
VOID SetTryDebug()
{
uAddr = (ULONG)KdDisableDebugger;
KdPrint(("uAddr = %X\n",uAddr));
RtlCopyMemory(BackupAddr,(PVOID)uAddr,5);
DisableWP();
UCHAR TmpCode[5];
TmpCode[0]=0xe9;
*(PULONG)(TmpCode + 1)=(ULONG)HookKdDisableDebugger-(ULONG)KdDisableDebugger- 1 - 4;
RtlCopyMemory((PVOID)KdDisableDebugger,TmpCode,5);
EnableWP();
PsSetLoadImageNotifyRoutine(LoadImageRoutine);
KdPrint(("Leave SetTryDebug\n"));
}
VOID RemoveTryDebug()
{
PsRemoveLoadImageNotifyRoutine(LoadImageRoutine);
DisableWP();
RtlCopyMemory((PVOID)uAddr,BackupAddr,5);
EnableWP();
}
//去除写保护
VOID DisableWP()
{
__asm {
cli
mov eax,cr0
and eax,not 10000h
mov cr0,eax
}
}
//恢复写保护
VOID EnableWP()
{
__asm {
mov eax,cr0
or eax,10000h
mov cr0,eax
sti
}
}
解决方法就是自己再写一个驱动,在里面写一句int 3就行了。想断的时候加载这个驱动。。。
下面请教各位大神关于某P的DebugPort清零。
我找到了两处清零的地方,但是似乎都有检测,并且还不只检测一次。
我不知道该怎么处理了。
另外关于某P禁止OD等所有调试器调试的问题。
我知道它这个是由于Object Hook
修改了DbgkDebugObjectType 里_OBJECT_TYPE_INITIALIZER这个结构体的ValidAccessMask为0
导致所有的调试器都无法调试
但是我不知道该怎么应对这个Hook
求指点。
语文吃紧,各位请不要嘲笑、、、:o: