内核下的调试与反调试
反调试与反反调试
一丶反调试的几种方法
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
不管是否正确.都会进行强制跳转.进而进行干扰.
坚持两字,简单,轻便,但是真正的执行起来确实需要很长很长时间.当你把坚持两字当做你要走的路,那么你总会成功. 想学习,有问题请加群.群号:725864912(收费)群名称: 逆向学习小分队 群里有大量学习资源. 以及定期直播答疑.有一个良好的学习氛围. 涉及到外挂反外挂病毒 司法取证加解密 驱动过保护 VT 等技术,期待你的进入。
详情请点击链接查看置顶博客 https://www.cnblogs.com/iBinary/p/7572603.html
本文来自博客园,作者:iBinary,未经允许禁止转载 转载前可联系本人.对于爬虫人员来说如果发现保留起诉权力.https://www.cnblogs.com/iBinary/p/10990674.html
欢迎大家关注我的微信公众号.不定期的更新文章.更新技术. 关注公众号后请大家养成 不白嫖的习惯.欢迎大家赞赏. 也希望在看完公众号文章之后 不忘 点击 收藏 转发 以及点击在看功能. QQ群: