debugport是在EPROCESS结构中的.调试时间会通过DebugPort端口将调试事件发送给ring3进行调试的.如果设置为0.则ring3就无法进行调试了 也就是说你不能单步了.等相关调试操作了.
如果做反调试.开启一个线程.不断的对这个DebugPort进行清零. 进而进行反调试. 思路: 1.找到当前进程的EPROCESS结构 2.通过硬编码找到这个位置.(硬编码) 如果是硬编码.就需要自己根据系统去判断.
在内核中调用这个函数后,它会检测是否检测是否挂载了windbg. 也是开启线程.不断调用.
应用层可以调用这两个函数判断
如在内核中进行HOOK
下面列出函数名
函数名字 | 作用 | HOOK后 |
---|---|---|
NtOpenThread | 创建内核线程 | 防止调试器在内部创建线程 |
NtOpenProcess | 打开进程 | 防止OD等调试工具在调试列表中看到 |
kiAttachProcess | 附加调试进程 | 防止被附加 |
NtReadVirtualMemory | 读取虚拟内存 | 防止自己进程被读内存(ReadProcessMemory) |
NtWriteVirtualMemory | 写内存 | 防止内存被写 |
KdReceivePacket | KDCOM.dll中Com串口接收数据的函数 | 你自己做过滤 |
KdSendPacket | KDCOM.dll中的Com串口发送数据函数 | HOOK上面跟这个函数.可以防止双机调试 |
上面说的是防,那么我们可以进行攻击
1.可以对DebugPort下内存断点.一旦有程序进行修改.就会被断下. 从而找到对应的反调试代码.对这个代码进行patch.
2.可以自建调试体系.不走它的.进而绕过这个保护.
这个函数会检测调试器.从而禁止被调试.
可以在对应的这些函数地址下段点.然后对相关代码进行patch.比如进行返回.
3.针对HOOK 如果是HOOK.我们可以借助一些工具进行恢复.当然如果可以你自己也可以写恢复代码.这看你当时的需求了. 常见的就比如: pchunter PowerTools anti(安天)
进行反调试可以进行加花.故意进行干烧.
如:
push edx
pop edx
inc ecx
dec ecx
add esp,1
sub esp,1
直接对一个寄存器进行加.然后进行减.操作完根本不会影响寄存器的原值.
jmp LABEL
db opcode
LABEL
还有这种.中间加个db.但是他会影响你.
db Opcode跟后面指令结合就会错乱.但是不会影响程序正常执行.
jz label
jnz label
db opcode
Label
不管是否正确.都会进行强制跳转.进而进行干扰.