过TP保护的DebugPort清零,科普一下

本文介绍如何通过设置钩子(SSDTHOOK)并利用内核调试工具(syser)来定位并修改DNF.exe的DebugPort地址,以绕过其反调试检测机制。
我们知道,DebugPort位于EPROCESS这个结构体中  
不知道啊?去幼儿园向小朋友问  
我这里的偏移是0x0bc,系统不一样,这个偏移值也不一样  
可以用WinDbg查看,开启本地内核调试,输入命令:dt _EPROCESS  
这个不多介绍,详情去网上搜  
另外,DNF.exe会调用NtOpenProcess进行反调试检测  
那么我们不浪费,就地取材,从这里开始入手  
在NtOpenProcess处设置一个钩子,SSDT HOOK相信大多数同学都会  
这里不需要做任何特殊过滤,只打印一些DNF的相关信息  
我给出思路和关键代码:  
ANSI_STRING str1,str2;  
PEPROCESS processEPROCESS;  
 
//将DNF.exe进程名放入str1中  
RtlInitAnsiString(&str1,"DNF.exe");  
 
//获取调用者的EPROCESS  
processEPROCESS = IoGetCurrentProcess();  
 
//将调用者的进程名保存到str2中,我这里进程名偏移是0x174  
RtlInitAnsiString(&str2,(PCSZ)((ULONG)processEPROCESS+0x174));  
 
//根据进程名来判断  
if (RtlCompareString(&str1,&str2,TRUE) == 0)  
 
  //说明是DNF.exe调用了这里,打印进程信息  
  KdPrint(("DNF.exe的EPROCESS地址为 %x",(ULONG)processEPROCESS));  
  KdPrint(("DNF.exe的DebugPort地址为 %x",(ULONG)processEPROCESS+0x0bc));  
 
 
//跳转到NtOpenProcess,这里的代码大家自己编写  
 
好了,DNF.exe的DebugPort地址获取到了,那么我们打开内核查看工具  
输入那个地址,看见没有?里面的数值为0,那怎么办呢?  
该我们的内核侦探神器,syser出场了  
热烈欢迎......  
按Ctrl+F12,激活内核调试,这时候速度尽量快点  
比如0xXXXXXXXX是我们DNF.exe的DebugPort地址  
那么我们在那里下内存写入断点  
输入bpm 0xXXXXXXXX w,回车,再按F5,让系统运行起来  
一眨眼的时间,syser断下来了,看到断下来的地址了吗?  
还等什么,赶快把那个清零的地址记下来,然后删除断点,F5继续运行  
接着打开内核工具,反汇编,顺着清零的地址往上找  
看到int 3和mov edi,edi指令了吗?这就是清零的函数头部  
居然还用东西盖住,伪装起来,可恶  
拿刀来,砍掉,咔嚓...  
把mov edi,edi改成nop和retn,0x90C3,  
继续在DebugPort那里下内存写入断点,重复上面的步骤  
再继续在那里下内存写入断点,看到了吗?  
半天都没有断下来,说明已经没有任何代码在那里清0了,OK!  
DebugPort清零一共是2处,就这么简单地过了  
还有一处监视的线程,方法雷同,我就不多贴了  
驱动我上传一下,只过DebugPort清0和监视,就可以恢复几处HOOK了  
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值