1.通过观察下图所示。可知,当前的进程就是父进程,也就是即将被调试的进程。
2.然后通过父进程来fork一个子进程,如下图所示。
3.子进程实现了调试器的功能,如下图所示。
4.作为调试器的子进程附加父进程,如下图所示。
5.通过子进程调试父进程,进而阻止其他调试器来调试父进程,如下图所示。
一般的调试器,先附加待调试程序的进程,获取相关进程的信息,才能进行相应的动态调试,如果由子进程来附加调试父进程,那么其他调试器就不能附加该进程,因为同一时刻,一个进程只能被一个进程附加。
1.先将这两个文件push到手机目录:data/local/tmp,如下图所示。
2.分别给最高权限chmod 777,如下图所示。
3.执行命令:ps | grep com,过滤手机中以com开头的进程,选中这个以phone结尾的进程,如下图所示。
4.运行debugger,调试此进程,如下图所示。
5.如果进程被调试,执行命令cat /proc /10529/status,它的进程pid值会发生变化,如下图所示。
6.继续执行命令:ps | grep debugger,查看debugger的进程信息,发现存在两个进程信息,第一个进程22229就是刚才被调试程序的tracepid的值,第二个是系统的,可以直接忽略它,如下图所示。
此时就说明debugger调试器附加成功了,既然附加成功,说明调试器的实现是没有问题的。
7.接着运行self debugger进行测试,如下图所示。
8.显示有主进程pid和子进程pid,如下图所示。
9.使用debugger附加它的主进程,显示失败,如下图所示。
10.原因是它的主进程正在被子进程调试,此时debuger再去附加,就会报错,如下图所示。
11.如果过掉self-debugger反调试,则可以附加它的子进程,如下图所示。
分析了self-debugger原理,还演示self-debugger调试器的反调试流程,这个过程中需要关注其中的执行命令,最后还学了如何过掉self-debugger,附加子进程。
原文:https://blog.51cto.com/15002917/2558537