欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]我也分享下过掉某P的双机调试

[原创]我也分享下过掉某P的双机调试

某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里面打开驱动文件,我们可以看到这么一句


mov     ecx, dword_1040508

test    ecx, ecx

jz      short locret_10093F3


ecx为KiDebugRoutine的地址
我利用的就是这一句 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

  } 

}

我自己用的还好,就是不能在windbg上下断点。
解决方法就是自己再写一个驱动,在里面写一句int 3就行了。想断的时候加载这个驱动。。。
下面请教各位大神关于某P的DebugPort清零。
我找到了两处清零的地方,但是似乎都有检测,并且还不只检测一次。
我不知道该怎么处理了。
另外关于某P禁止OD等所有调试器调试的问题。
我知道它这个是由于Object Hook
修改了DbgkDebugObjectType 里_OBJECT_TYPE_INITIALIZER这个结构体的ValidAccessMask为0
导致所有的调试器都无法调试
但是我不知道该怎么应对这个Hook
求指点。
语文吃紧,各位请不要嘲笑、、、

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功