64位内核开发第五讲,调试与反调试

反调试与反反调试

一丶反调试的几种方法

1.DebugPort端口清零

debugport是在EPROCESS结构中的.调试时间会通过DebugPort端口将调试事件发送给ring3进行调试的.如果设置为0.则ring3就无法进行调试了
也就是说你不能单步了.等相关调试操作了.

如果做反调试.开启一个线程.不断的对这个DebugPort进行清零.
进而进行反调试.
思路:
1.找到当前进程的EPROCESS结构
2.通过硬编码找到这个位置.(硬编码)
如果是硬编码.就需要自己根据系统去判断.

2.KdDisableDebugger

在内核中调用这个函数后,它会检测是否检测是否挂载了windbg.
也是开启线程.不断调用.

3.ring3下的 isDebuggerpresent和CheckRemoteDebuggerPresent

应用层可以调用这两个函数判断

4.使用Hook手段.

如在内核中进行HOOK

下面列出函数名

函数名字 作用 HOOK后
NtOpenThread 创建内核线程 防止调试器在内部创建线程
NtOpenProcess 打开进程 防止OD等调试工具在调试列表中看到
kiAttachProcess 附加调试进程 防止被附加
NtReadVirtualMemory 读取虚拟内存 防止自己进程被读内存(ReadProcessMemory)
NtWriteVirtualMemory 写内存 防止内存被写
KdReceivePacket KDCOM.dll中Com串口接收数据的函数 你自己做过滤
KdSendPacket KDCOM.dll中的Com串口发送数据函数 HOOK上面跟这个函数.可以防止双机调试

二丶反反调试

上面说的是防,那么我们可以进行攻击

1.针对DebugPort

1.可以对DebugPort下内存断点.一旦有程序进行修改.就会被断下.
从而找到对应的反调试代码.对这个代码进行patch.

2.可以自建调试体系.不走它的.进而绕过这个保护.

2.针对 KdDisableDebugger

这个函数会检测调试器.从而禁止被调试.

可以在对应的这些函数地址下段点.然后对相关代码进行patch.比如进行返回.

3.针对HOOK
如果是HOOK.我们可以借助一些工具进行恢复.当然如果可以你自己也可以写恢复代码.这看你当时的需求了.
常见的就比如: pchunter PowerTools anti(安天)

3.花指令

进行反调试可以进行加花.故意进行干烧.

如:

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

不管是否正确.都会进行强制跳转.进而进行干扰.

原文地址:https://www.cnblogs.com/iBinary/p/10990674.html