linux反调试笔记
查漏补缺
SIGTRAP SIGSTOP
传统调试的原理就是在cpu运行到断点所在的指令时触发SIGTRAP,然后由调试器接管进程,可以利用signal.h中的signal函数自己注册对SIGTRAP的回调,不过现在的调试器都能自己选择是否接管信号了
对于SIGSTOP同理,刚附加上去时可能会SIGSTOP
ppid
可以利用getppid函数获取父进程的pid,通常父进程一定是sh或者init之类的,再读取proc/pid/cmdline下的启动参数,匹配进程名
sid
sid和gid
gid是进程组组长的pid,也就是执行一组相关进程(比如管道调用)时第一个命令的进程pidsid是当前session的第一个进程的pid,多数情况下就是bash或shell的pid
正常情况下程序的父进程当然是shell (安卓是zygote),也就是说getsid(getpid())不等于getppid时可以认为程序被调试了
getenv
bash中有一个环境变量_($_),保存的是上一个命令的最后一条参数
通过getenv获取到上一个命令不是程序自己的最后一个参数,那可能说明有调试器
ptrace
ptrace的PTRACE_TRACEME表示指示本进程正在被调试,如果本程序已经被调试,则会返回错误,如果没被调试,后续调试器想加也加不上去
sysctl
sysctl会返回当前进程的一系列信息,有点类似win中的PEB头,这里面有一个标志位P_TRACED,检查其是否为1判断是否被调试了
proc/self/status
这个文件中记录了当前进程的一些情况,里面一个信息就是TracerPid,可以根据这个进行判断
扫端口
通过扫proc/net/tcp或者netstat -apn,去看一些常见的远程调试端口
/proc/self/stat
被调试时这个文件的内容中会多一个t符号
/proc/self/wchan
被调试时这个文件的内容为ptrace_stop