反调试之断点检测

调试与反调试的手段,在大佬的这篇反调试与绕过的奇淫技巧文章中几乎都能找到

这次带来新的检测思路,通过检测断点,来判断是否被调试,以及确定被调试的函数

断点原理

断点原理主要分为软件断点和硬件断点

  • 软件断点原理主要是修改断点位置的指令,当然原始指令会保存。将断点位置指令修改成软中断指令,程序运行到改位置自然会暂停。通过task_for_pid函数得到被调试进程的task端口后,就可通过vm以及task,thread等系列函数跨进程获取到被调试进程的信息了

  • 硬件断点主要依赖于调试寄存器,通过设置调试寄存器为断点位置,即可让cpu在执行到断点的位置停下。但硬件断点有断点数量限制

这里主要讨论软件断点

LLDB软件中断写入

利用

  1. 通过原理,我们就能判断一个函数有没有下断点了,只需要检测函数内指令是否被修改成了软中断指令

  2. 也可以通过可执行内存search,来主动检测被调试的地址了,在通过地址符号解析,来主动检测被调试的函数

其中一个利用Demo

而且该利用也可以不使用API来实现(不暴露特征值),直接读内存就行~

不够好 字数补丁字数补丁字数补丁字数补丁

O(∩_∩)O哈哈~,字数补丁字数补丁字数补丁字数补丁字数补丁字数补丁字数补丁字数补丁

昨天看到大佬在 ISS 的 PR 了
哈哈哈~