首页
社区
课程
招聘
[原创]对安卓反调试和校验检测的一些实践与结论
发表于: 2021-6-20 20:44 25577

[原创]对安卓反调试和校验检测的一些实践与结论

2021-6-20 20:44
25577

反调试来源参考: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被重打包之后签名就会出现改变,可以检测签名防止重打包


实现代码



[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2021-6-23 18:03 被Dyingchen编辑 ,原因:
收藏
免费 12
支持
分享
最新回复 (13)
雪    币: 4794
活跃值: (4494)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
听说 模拟器都是修改了Android内核源码 始终返回正常的值 来 过一些签名检测  和 反调试
2021-6-21 10:24
0
雪    币: 3194
活跃值: (5181)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
3
木志本柯 听说 模拟器都是修改了Android内核源码 始终返回正常的值 来 过一些签名检测 和 反调试
是吗,这个不太清楚,不过由于有些在源码层面上面对ptrace等检测进行了始终返回0的情况,那么自己主动多次调用ptrace都会返回0,从这一点上进行检测是否可行
2021-6-21 10:33
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
木志本柯 听说 模拟器都是修改了Android内核源码 始终返回正常的值 来 过一些签名检测 和 反调试
已经检测出模拟器了,就不用管是不是调试了
2021-6-21 11:05
0
雪    币: 463
活跃值: (2756)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
5
"结论:基本来说直接读取/proc实现的反调试已经无法使用了,有没有其他的办法访问暂且不知道,有了解的师傅可以说一下"
这个失效了,是什么原因?
2021-6-23 10:23
0
雪    币: 3194
活跃值: (5181)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
6
pareto "结论:基本来说直接读取/proc实现的反调试已经无法使用了,有没有其他的办法访问暂且不知道,有了解的师傅可以说一下" 这个失效了,是什么原因?
可以去搜索一下,安卓版本更新之后在app层就没法访问/proc里面的内容了,其实我本身代码写了很多关于这个的反调试,但在真机上面发现无效之后就都没有放出来了
2021-6-23 12:25
0
雪    币: 463
活跃值: (2756)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
7
Dyingchen 可以去搜索一下,安卓版本更新之后在app层就没法访问/proc里面的内容了,其实我本身代码写了很多关于这个的反调试,但在真机上面发现无效之后就都没有放出来了
/proc/下进程私有的,还是可以访问的吧,还是这里你读取的是其他进程的文件。
2021-6-23 14:46
0
雪    币: 3194
活跃值: (5181)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
8
pareto /proc/下进程私有的,还是可以访问的吧,还是这里你读取的是其他进程的文件。
感谢指正,不过虽然可以访问自身进程的文件,由于没法访问其他进程的cmdline和status 得到的信息还是少了很多,我着手准备修改一下文章
2021-6-23 17:34
0
雪    币: 5330
活跃值: (5489)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
9
mark
2021-6-23 20:15
0
雪    币: 539
活跃值: (6102)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
10
isDebuggerConnected()在android6.0之上已经不能通过手动绕过了,并且在java层hook时ida会卡死。尚不清楚在native的hook能不能绕过。
2021-6-24 14:12
0
雪    币: 173
活跃值: (3836)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
应该是/proc/pid/net/tcp,app可以访问自己的pid的这个目录,还有一些防注入的手段也可以在/proc/pid/中其他文件进行实现
2021-6-25 15:34
0
雪    币: 5
活跃值: (39)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
mark
2021-6-26 16:04
0
雪    币: 2089
活跃值: (3933)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
吃鸡、王者荣耀外挂里面使用了一堆ptrace反检测技术,可以参考一下里面对应的检测、反调试内容,比较有趣。
2021-6-26 16:11
0
雪    币: 576
活跃值: (2035)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
mark
2021-6-28 18:39
0
游客
登录 | 注册 方可回帖
返回
//