使用snoopy进行execve/execv、connect、init_module hook
一、简述
Snoopy旨在通过提供已执行命令的日志来帮助系统管理员,它对用户和应用程序是完全透明,通过将它链接到程序中,以提供对execve()
调用的封装,记录信息通过syslog
完成。
Snoopy development has been migrated to github. Please follow the link “Snoopy Logger Web Site” below.
Snoopy is designed to aid a sysadmin by providing a log of commands executed. Snoopy is completely transparent to the user and applications. It is linked into programs to provide a wrapper around calls to execve(). Logging is done via syslog.
二、注意事项
- Hook函数的覆盖完备性,对于Linux下的指令执行来说,有7个glibc的api都可实现指令执行功能,对这些API对要进行hook:
// 执行参数filename字符串所代表的文件路径,第二个参数是利用数组指针来传递给执行文件,并且需要以空指针(NULL)结束,最后一个参数则为传递给执行文件的新环境变量数组,该函数属于内核级系统调用; |
- 系统中是否存在hook函数的重名覆盖问题,通常在以下场景下:
/etc/ld.so.preload
中填写了多条.so加载条目;- 其他程序通过
export LD_PRELOAD=..
临时指定了待加载so的路径,在很多情况下,出于系统管理或者集群系统日志收集的目的,运维人员会向系统中注入.so文件,对特定function函数进行hook,这个时候,当我们注入的.so文件中的hook函数和原有的hook函数存在同名的情况,Linux会自动忽略之后载入了hook函数,这种情况我们称之为”共享对象全局符号介入”;
- 注入
.so
对特定函数进行hook要保持原始业务的兼容性,即处理完之后仍然需要执行原函数的调用,为了实现透明hook(完成业务逻辑的同时不影响正常的系统行为)、维持调用链,那么需要使用RTLD_NEXT; - 尽量减小hook函数对原有调用逻辑的延时,hook操作本身也会产生一定的延时,我们需要尽量减少从函数入口到调用原函数这块的代码逻辑,尽量减少多余的执行时间;
三、代码实践
- hook.c
|
- 编译运行:
# 编译 |
- 运行结果:
socket connect hooked!! |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 咕咕!
评论