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

反调试与反反调试

一丶反调试的几种方法

1.DebugPort端口清零

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

若是作反调试.开启一个线程.不断的对这个DebugPort进行清零.
进而进行反调试.
思路:
1.找到当前进程的EPROCESS结构
2.经过硬编码找到这个位置.(硬编码)
若是是硬编码.就须要本身根据系统去判断.编码

2.KdDisableDebugger

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

3.ring3下的 isDebuggerpresent和CheckRemoteDebuggerPresent

应用层能够调用这两个函数判断debug

4.使用Hook手段.

如在内核中进行HOOK调试

下面列出函数名code

函数名字 做用 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

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

相关文章
相关标签/搜索