linux反调试笔记

查漏补缺

SIGTRAP SIGSTOP

传统调试的原理就是在cpu运行到断点所在的指令时触发SIGTRAP,然后由调试器接管进程,可以利用signal.h中的signal函数自己注册对SIGTRAP的回调,不过现在的调试器都能自己选择是否接管信号了
对于SIGSTOP同理,刚附加上去时可能会SIGSTOP

ppid

可以利用getppid函数获取父进程的pid,通常父进程一定是sh或者init之类的,再读取proc/pid/cmdline下的启动参数,匹配进程名

sid

sid和gid

gid是进程组组长的pid,也就是执行一组相关进程(比如管道调用)时第一个命令的进程pid
sid是当前session的第一个进程的pid,多数情况下就是bashshellpid

正常情况下程序的父进程当然是shell (安卓是zygote),也就是说getsid(getpid())不等于getppid时可以认为程序被调试了

getenv

bash中有一个环境变量_($_),保存的是上一个命令的最后一条参数
通过getenv获取到上一个命令不是程序自己的最后一个参数,那可能说明有调试器

ptrace

ptracePTRACE_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

Author

SGSG

Posted on

2025-12-14

Updated on

2025-12-14

Licensed under