2024年6月14日发(作者:)
基于APIHOOK 技术的代码行为诊断系统的设计和开发
摘要:因为恶意代码在植入时的行为与正常代码有很大的不同,
而这些行为就表现在所调用的相关api函数上,鉴于此,该文采用
apihook技术,设计了代码行为诊断系统,该系统根据代码在植入
时调用的api函数来判断代码的“善恶”,并给出了详细的代码行
为,从而为进一步判断代码是否是恶意的提供了依据。
关键词: 恶意代码;合法代码;api hook
中图分类号: tp309.5 文献标识码:a 文章编号:1009-3044
(2013)02-0272-03
目前,由于未知恶意代码具有不可判定性[1-2],所以对恶意代
码的识别仍然是一个难题。例如:一般查毒软件如果遇到运行的代
码如果有诸如dll注入的行为,就认为是恶意代码给予拦截,如图
1所示。而事实上,单纯从dll注入这一单一行为还不能肯定就是
恶意代码。通过观察我们发现大多恶意代码在开始植入内存并初始
化的时候,通常会执行一些诸如扫描系统目录,自拷贝,自删除等
一系列有别于正常代码的行为。而这些行为就是通过调用api函数
实现的,所以通过监控代码在植入阶段调用了哪些api函数,通过
分析这些api函数的特点,就可以大致判断该代码是否是恶意的。
鉴于此,该文设计并实现了基于apihook技术的代码行为诊断系统,
根据代码在植入时调用的api函数的特点来对代码“善恶”行为的
程度(健康情况)进行打分,如果分数低那么是恶意代码的可能性
就大,从而为病毒专家的进一步分析提供了依据。
图1 360拦截代码注入行为界面
1 apihook技术的原理
api hook技术是一种用于改变api执行结果的技术,每一个hook
都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。
这个列表的指针指向指定的,应用程序定义的,被hook子程调用
的回调函数,也就是该钩子的各个处理子程。当与指定的hook类
型关联的消息发生时,系统就把这个消息传递到hook子程序,原
理如图2所示。一些hook子程可以只监视消息,或者修改消息,
或者停止消息的前进,避免这些消息传递到下一个hook子程或者
目的窗口。最近安装的钩子放在链的开始,而最早安装的钩子放在
最后,也就是后加入的先获得控制权。windows 并不要求钩子子程
的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载,
windows 便释放其占用的内存,并更新整个hook链表。如果程序
安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动
为它做卸载钩子的操作[3]。
图2 apihook原理示意图
2 实现的关键技术
在动态链接库中实现对相关api函数的钩挂,然后设置一个全局
钩子,这样当所有进程运行时都会自动调用该动态链接库,从而实
现了对api函数的钩挂。当进程调用系统的api函数时就跳到用户
的函数,在用户的函数中记录一下api函数的名字,然后执行原api
函数。这样就得到了进程调用的所有api的相关信息,系统的流程
图如图3所示。
图3 系统功能流程图
2.1 动态链接库的设计
dllmain函数是当进程装入动态链接库中时自动执行的函数,当
dwreason参数的值取dll_process_attach时表示进程装入动态链
接库时要执行的代码,即执行api函数的钩挂拦截。当dwreason
参数的值取dll_process_detach时表示当进程结束时将要执行的
程序,即执行解开钩挂的代码。相关关键代码如下:
该函数的功能是卸载的钩子的句柄,并进行卸载钩子。
2.2 主程序对动态链接库中函数的调用
首先获得动态链接库的句柄,然后调用该动态链接库里面的安装
全局钩子的函数installhook,进行相关api 函数的钩挂代码如下。
m_hmodule = loadlibrary( “” );
fun fi = (fun)getprocaddress( m_hmodule,
“installhook” );
getprocaddress函数的功能是检索指定的动态链接库(dll)中
的输出库函数地址。
当处理完以后,通过调用动态链接库里面的uninstallhook函数
解开钩子。代码如下。
3 程序运行结果
运行的时候首先按“清屏”,完成初始化工作。然后按“选择代
码”,选择要运行的软件。在待运行的软件启动并植入内存后,再
按“诊断”,对运行的程序调用的所有api函数,根据相应的算法
[4]得出每个api函数的善恶指数,按照该函数“善恶”指数的高
低,进行排序并显示出来(每个api函数的),并给出所调用api
函数存在风险的大小情况,再根据程序调用的所有api函数的“善
恶”指数之和,对这个程序的健康情况进行打分。供用户参考。如
图4所示。分数越高安全性越高,反之越低。
4 结束语
该文通过apihook技术开发了一款“代码行为诊断专家”软件,
根据代码在植入阶段调用的api函数。通过相关算法来判断该代码
的“善恶”程度,并把它详细的行为显示出来。实践证明该软件可
以清楚的描述软件的行为和善恶程度,而为进一步判断代码是否是
恶意的提供了依据。
参考文献:
[1] fred er viruses:theory and experiments[j].
computers&security, 1987,6(1):22-35.
[2] diomidis le identification of
bounded-lengh,viruses is np-complete[j].ieee transactions
on information theory, 2003,49(1):280-284.
[3] http:///?sp=l29260782.
[4] lijun zhu. an identification method on unknown
malicious code based on the good or evil index of api[c]. ieee
the 2nd international conference on multimedia technology,
2011,6(7):4829-4832.


发布评论