Quantcast
Channel: 看雪安全论坛
Viewing all articles
Browse latest Browse all 9556

调试逆向 【原创】我也分享下过掉某P的双机调试

$
0
0
某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
求指点。
语文吃紧,各位请不要嘲笑、、、:o:

Viewing all articles
Browse latest Browse all 9556

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>