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写内存防止内存被写
KdReceivePacketKDCOM.dll中Com串口接收数据的函数你自己做过滤
KdSendPacketKDCOM.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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值