反调试来源参考:https://bbs.pediy.com/thread-223324.htm
原理:读取/proc/net/tcp,查找IDA远程调试所用的23946端口,若发现说明进程正在被IDA调试。
这里需要说明的是由于安卓安全性更新,/proc等目录在app里面已经没法直接访问了,导致通过查找/proc/net/tcp这个方法直接宣告无效,但是通过别的办法查找端口还是可行的
这里需要注意的是对网络相关使用不能放在主线程里面否则会报错,建议配合线程使用
相关文章:https://bbs.pediy.com/thread-268080.htm
遍历进程,查找固定的进程名,找到说明调试器在运行。(比如说固定的进程名 android_server gdb_server等等)
实现代码:
有的时候不使用apk附加调试的方法进行逆向,而是写一个.out可执行文件直接加载so进行
调试,这样程序的父进程名和正常启动apk的父进程名是不一样的。
读取/proc/pid/cmdline,查看内容是否为zygote
实现代码:
正常apk进程一般会有十几个线程在运行(比如会有jdwp线程),
自己写可执行文件加载so一般只有一个线程,
可以根据这个差异来进行调试环境检测
实现代码:
分析android自带调试检测函数isDebuggerConnected(),返回是否处于调试
每个进程同时刻只能被1个调试进程ptrace
主动ptrace本进程可以使得其他调试器无法调试
实现代码:
非常简单粗暴,通过占坑的方式使得其他调试器无法调试,应该是用得最多的反调试之一了
然而
返回值为0,正常(一般调试so也不会用模拟器阿)
返回值为-1,为了排除返回值的问题,在此状态下使用IDA进行调试,发现可以调试
关闭seLinux之后
返回值变为0,尝试使用IDA附加
无法附加,效果正常
被成功ptrace的app的/proc/pid/status文件中的Tracerpid会变为ptrace它的父进程(一般来说是zygote),而在正常情况下,这个值为0
实现代码
如果函数被下软件断点,则断点地址会被改写为bkpt指令,
可以在函数体中搜索bkpt指令来检测软件断点
代码实现:
测试效果:通过查找有没有断点指令进行反调试,反调试效果很不错,但是性能上面就有点问题了。其实现就是不断遍历对比,这里出现两个问题
1:会花费大量资源进行这个查找的行为
2:什么时候进行查找?--如果只在相对较早的时机进行一次,那么后面的时机下了断点则没有效果,这意味着需要进行循环查找--性能花销太大
顾名思义,app被重打包之后签名就会出现改变,可以检测签名防止重打包
实现代码
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2021-6-23 18:03
被Dyingchen编辑
,原因: