self-debugging反调试——安卓逆向

self-debugging反调试的原理

当前的进程就是父进程,也就是即将被调试的进程
我们来看下图.
self-debugging反调试——安卓逆向

然后通过父进程来fork一个子进程
self-debugging反调试——安卓逆向
这个子进程实现了调试器的功能
self-debugging反调试——安卓逆向
作为调试器的子进程附加父进程
self-debugging反调试——安卓逆向
通过子进程调试父进程,进而阻止其他调试器来调试父进程
self-debugging反调试——安卓逆向
self-debugging反调试——安卓逆向
两个关键点:创建子进程的fork函数,子进程通过附加调试父进程;
一般的调试器,先要附加要调试程序的进程,获取相关进程的信息,才能进行相应的动态调试;
如果由子进程来附加调试父进程,那么其他调试器就不能附加该进程,因为同一时刻,一个进程只能被一个进程附加;

演示self-debugger调试器的反调试流程

先把这两个文件push到手机目录:data/local/tmp
self-debugging反调试——安卓逆向
分别给最高权限
self-debugging反调试——安卓逆向
指令命令:ps | grep com,过滤一下手机中以com开头的进程,选这这个phone结尾的
self-debugging反调试——安卓逆向
运行debugger,调试这个进程
self-debugging反调试——安卓逆向
根据上节课知识,如果进程被调试,他的进程pid值会发生变化,
执行命令: cat /proc/10529/status
self-debugging反调试——安卓逆向
这个tracepid的值是22229,这个是什么呢?
我们继续执行命令:ps | grep debugger,看一下debugger的进程信息
self-debugging反调试——安卓逆向
发现有两个,第一个进程22229就是刚才被调试程序的tracepid的值,第二个是系统的,可以不用管;
此时就说明debugger调试器附加成功了,既然附加成功,说明这个调试器的实现是没有问题的;
我们运行self debugger来测试一下
self-debugging反调试——安卓逆向
这里有主进程pid和子进程pid:
self-debugging反调试——安卓逆向
我们尝试用debugger附加他的主进程:发现失败
self-debugging反调试——安卓逆向
这是为什么?因为他的主进程在被子进程调试,此时debuger再去附加,就会报错;前面我们讲过,一个进程只能被一个进程附加
self-debugging反调试——安卓逆向

过掉self-debugger反调试

我们可以附加它的子进程
self-debugging反调试——安卓逆向

补充:如果有的apk直接用IDA附加调试是附加不上的,如果存在这种情况,有可能会有IDA反调试;
解决办法:双开IDA,找到创建进程的位置,直接在Fork函数下断。

不对的地方请大佬们多多指教指教!