原文作者: Jonathan Salwan
文章译者: 残风
翻译日期: 2013-03-04
译文来源: http://www.cfeng.org
英文原文: http://blog.shell-storm.org/files/blog-34.php
最近,我需要去检测系统调用的Hook,我选择去开发一个Linux模块,在系统调用表中,如果一个指针被Hook,它将警告我。这种类型的模块是已经存在的,但是当系统调用被成功Hook时,我需要执行一个Python脚本。
这里有几种Hook的方法。在Michael Coppola最近的文章中,谈论了《Inline Kernel Function Hooking》。对于我来说,这篇文章是很经典的Hook系统调用。下图是一个很典型的Hook系统调用。
如果系统调用被Hook这个模块会通知我们,备份系统调用,保存原来所有的调用指针。第一步之后,该模块使用内核计时器,每X秒检查当前系统调用与备份的系统调用之间的差异。如果找到差异,创建一个工作队列去执行Python脚本,并且恢复成未被Hook的系统调用。执行该Python脚本,使用根证书和被Hook的系统调用编号,它是通过第一个参数传递给脚本的(sys.argv[1])。
这个模块包含了3个头定义, PATH_BIN,PATH_SCRIPT 和 TIME_SLEEP。如果想执行PHP或者Perl脚本,只要改变PATH_BIN为PHP或者Perl的路径。TIME_SLEEP是设置持续多少毫秒之后去检查。
#define PATH_BIN "/usr/bin/python2.7" /* python path */ #define PATH_SCRIPT "/opt/scripts/hook_detected.py" /* Your python script */ #define TIME_SLEEP 30000 /* In msec */
系统调用被Hook,是通过第一参数传递给脚本的。一个Python脚本的例子:当系统调用被Hook之后,发送警告邮件。
#!/usr/bin/env python2.7 import smtplib import sys RCPT_TO = 'mail_rcpt@gmail.com' GUSER = 'your_mail@gmail.com' GPWD = 'you_passwd' SMTP = 'smtp.gmail.com' if __name__ == "__main__": smtpserver = smtplib.SMTP(SMTP, 587) smtpserver.ehlo() smtpserver.starttls() smtpserver.ehlo smtpserver.login(GUSER, GPWD) msg = 'To: ' + RCPT_TO + '\n' msg += 'From: ' + GUSER + '\n' msg += 'Subject:Hook analyzer - Hook detected !\n\n' msg += 'Hook analyzer has detected a hook in syscall table ' msg += '(syscall %s).\n' %(sys.argv[1]) msg += 'The syscall was restored.\n\n' smtpserver.sendmail(GUSER, RCPT_TO, msg) smtpserver.close() sys.exit(0)
这个模块需要在rootkit之前执行,否则系统调用表是损坏之后的。该模块在3.2.0内核(ubuntu)上测试通过,查看源码点击这里。
