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.