采用双进程的方式,对父进程进行保护,基于信号的发送和接收,实现相互的保护防止被动态攻击。
双进程进程保护主要功能:
1、保护父进程,ptrace所有线程,防止被附加、调试、暂停;
2、保护子进程,防止被暂停、异常退出;
对应说明图:
不足之处与修补思考:
子进程未被ptrace,可以通过向子进程注入并ptrace PTRACE_DETACH实现解除反附加
改进:
减少对主进程其中一个线程的附加,使子进程能被该线程附加,减去子进程的弱点,但同时却给主进程留下一个坑点。
对应说明图:
针对实现过程的一些说明:
1、为什么子进程可以监听父进程信号?
使用ptrace后,父进程的parent会相应转变为ptrace进程,此时parent不一定等于real_parent。
2、主进程能被ptrace的条件?
主进程需使用prctl函数,设置PR_SET_DUMPABLE为1,prctl(PR_SET_DUMPABLE, 1, 0, 0, 0)
3、隐藏子进程一个小技巧
如果子进程是通过执行可执行文件进行创建的,可以通过直接对参数argv地址内容进行修改,保证子进程的文件名及参数隐藏,有利于干扰动态分析,或者使用 prctl(PR_SET_NAME, new_name);进行修改
4、如何监听不断创建的新线程
ptrace提供了一个PTRACE_SETOPTIONS选项,可以设置监听线程调用一些函数的操作,这些函数包括PTRACE_O_TRACEEXEC | PTRACE_O_TRACECLONE | PTRACE_O_TRACEVFORK | PTRACE_O_TRACEFORK,可以保证当子线程创建时仍然被监听。
5、监听信号
子进程
WIFSIGNALED:监听线程退出
WIFSTOPPED :监听线程暂停及恢复
WIFSTOPPED(status) && WSTOPSIG(status) == SIGSTOP : 新线程被创建完成后,收到的信号,或者遇到断点时
WIFSTOPPED(status) && WSTOPSIG(status) == SIGTRAP : 当一个线程创建另一个线程返回时,收到的信号,此处需注意,此时创建的子线程被暂停,ptrace(PTRACE_GETEVENTMSG, pid, 0, &new_pid)获取新线程ID,并恢复运行
主进程
WIFSIGNALED:监听线程退出
WIFSTOPPED :监听线程暂停及恢复
参考:
http://blog.csdn.net/earbao/article/details/51543816
《深入理解LINUX内核》