搜档网
当前位置:搜档网 › Windows进程信息注入与API挂钩技术研究

Windows进程信息注入与API挂钩技术研究

信息安全与通信保密 · 2010.10

61

徐思明,薛 质

(上海交通大学信息安全工程学院,上海 200240)

[摘 要] 主要研究了恶意代码入侵与防御两项基本技术。对于恶意代码的入侵方面,分别研究了动态链接库(DLL)注入技术以及应用程序编程接口(API)挂钩技术,然后在每项技术中分析了它们的几种常用实现方法;而在恶意代码的防御方面,分别指出了基于编译器、虚拟机和操作系统的相应的安全检测方法,并分别分析了它们的特性,包括其优点和缺点等。对于信息安全研究领域中的恶意代码攻防相关技术可提供有益的帮助。[关键词] 恶意代码;动态链接库;导入地址表;挂钩技术

[中图分类号] TP309.5 [文献标识码] A [文章编号] 1009-8054(2010) 10-0061-03

Study on Windows Legal Process Information Injection and API Hook Techniques

XU Si-ming,XUE Zhi

(School of Information Security Engineering,Shanghai Jiaotong University,Shanghai 200025,China)[Abstract] This paper mainly explores two basic techniques in the field of malicious-code attack and defense. For the malicious-code attack,it discusses respectively DLL injection technique and API hook technique,then analyzes the realization method in each technique,while for the malicious-code defense,the corresponding security detection methods based individually on compiler,virtual machine,and operating system are pointed out. In addition,their characteristics are analyzed,including their advantages and disadvantages. So this paper may offer certain beneficial helps to the relevant technologies of malicious-code attack and defense in the infosec research field.[Keywords] malicious code;dynamic link library;import address table;hook technique

Windows 进程信息注入与API 挂钩技术研究

收稿日期:2010-05-26

作者简介:徐思明,1985年生,硕士生,研究方向:网络攻防;薛质,1971年生,教授,研究方向:网络与信息安全。

0 引言

通过互联网络传播的带有恶意破坏性质的代码是常见的信息安全威胁,因此研究各种恶意代码的检测与防御技术具有重要意义。所谓恶意代码,是指不提供正常应用功能却会带来系统安全危险的代码。恶意代码常见的形式包括间谍软件、远程控制、击键记录和逻辑炸弹等,通常具备诸如获取口令、侦察网络通信、记录私人通信、隐蔽接收和传递远程主机的非授权命令等功能。恶意代码在互联网上的传播呈现增长的趋势,对它的防御不是一个简单的任务

[1]

。这里并不分析具体恶意代码

的源代码,而是研究恶意代码的攻击机理和普遍利用的核心技术,并提出相应的检测和防御方法。

1 DLL 注入

在Windows 系统的用户模式下,每一个进程都有自己的地址

空间,一个进程中的线程函数原则上是不允许访问另一个进程地址空间中的函数与变量的,系统这样的设置使得进程之间互相独立,从而提高了进程的安全性。不过尽管存在这样的限制,仍然有方法在一个合法的进程中注入信息。通过将写好的程序预编译到一个动态链接库中,然后使用如下的几种DLL 注入技术,即可将自己想运行的代码注入到一个已经存在的合法进程中去。许多恶意代码正是使用了这些方法将自己的程序写入合法进程的地址空间去,从而躲避了病毒查杀和防火墙之类安全软件的检测。

(1) 使用注册表来注入DLL

首先编写一个动态链接库,并使用注册表键值HKEY_LOCAL_MACHINE\ Software\Microsoft\Windows NT\CurrentVersion\Windows\Appinit_Dlls 来加入该DLL 的键值。为了能够让系统使用这个注册表项,还必须创建一个名为LoadAppInit_Dlls,类型为DWORD 的注册表项,并将它的值设为1。然后,当user32.dll 被映射到一个新的进程时,它会在DllMain 入口函数中接收到一个DLL_PROCESS_ATTACH 声明。

处理这个声明的过程中,user32.dll 将会检查和加载APPINIT_DLLS 注册表键中的每个DLL。

这看起来是一个注入代码的最简单方式,然而这种方式存

学术研究

A cademic R esearch

在以下一些不足:

① 这种技术只被Windows NT/2000/XP支持,而Windows 9x不处理这个注册表键值;

② 这种技术只能注入DLL到链接user32.dll的进程中,因此不能注入DLL到控制台(Console)或命令行(Command-line)进程中,因为这些进程通常不从user32.dll导入函数;

③ 添加在注册表键值APPINIT_DLL中的DLL将被注入到所有图形用户接口(GUI)进程中,而不管其是否需要注入。这样将会增加系统的负荷和被注入进程崩溃的概率;

④ 在完成添加注册表键值后,必须重启系统激活设置[2]。

(2)使用远程线程来注入DLL

与第一种方式不同,这种方法并不是Windows系统提供的缺省方式,然而大部分内部威胁使用的却是这种利用远程线程来注入带有恶意代码的DLL方式。这种技术的主要思想是强迫目标进程加载需要注入的DLL。由于不能改变已加载线程的执行路径,只有创建一个新线程并设置该线程的执行路径来加载该DLL。由Windows中提供的创建远程线程API即CreateRemoteThread来实现DLL的注入。下面是函数原型:HANDLE (

HANDLE hProcess,

LPSECURITY_ATTRIBUTES lpThreadAttributes,

DWORD dwStackSize,

LPTHREAD_START_ROUTINE lpStartAddress,

LPVOID lpParameter,

DWORD dwCreationFlags,

LPDWORD lpThreadId

)

具体采取的步骤如下:

① 用VirtualAllocEx函数在远程进程的地址空间中分配一块内存;

② 用WriteProcessMemory函数把DLL的路径名复制到①分配的内存中;

③ 用GetProcAddress函数来得到LoadLibrary函数的实际地址;

④ 用CreateRemoteThread函数在远程进程中创造一个线程,让新线程调用正确的LoadLibrary函数,并在参数中传入①分配的内存地址;

⑤ 用VirtualFreeEx来释放①分配的内存;

⑥ 用GetProcAddress来得到FreeLibrary函数的实际地址;

⑦ 用CreateRemoteThread函数在远程进程中创建一个线程,让该线程调用FreeLibrary函数并在参数中传入远程DLL的hmodule[3]。

2 API挂钩技术

自1994年以来,挂钩方法被很多开发者使用,它通常作为调试目的来监控可执行程序中的API函数的活动和相互关系,尤其是在操作系统组件和第三方软件等不能获取相关源代码的程序中。它也用来扩展原始功能截获或取代API函数。此外,它还可以用来获取参数信息和基于特殊目的改变程序执行流程。API 挂钩可以与DLL注入一起应用。API钩子最初是为了监测程序中API的行为和相互关系作为调试目的而设计的,尤其是非开源程序。这种技术通过拦截或替换的API来扩展API的功能。

最常见的API挂钩技术是导入地址表(IAT)重定向。首先,找到可执行文件的IAT,能够使用imagehelp.dll中的ImageDirectoryEntryToData API来获取IAT的指针,如果该模块从多个DLL输入函数,IAT的记录会比较多。所以,必须通过其结构成员来检查返回结果。返回结果是一个指向IMAGE_ IMPORT_DESCRIPTOR的指针,该结构中的Name成员记录了导入DLL的名称。这样,就可以比对DLL的名称和Name来查找该DLL的IAT记录。找到目标DLL的IAT记录后,通过检查FirstThunk成员继续查找目标API的IAT记录。FirstThunk 成员是指向IMAGE_THUNK_DATA的指针。IMAGE_THUNK_ DATA中的Function成员保存了API的地址,能够使用GetprocAddress来获取目标API的地址,并用Function进行比对来找出IAT表中的目标API的记录。找到目标API在IAT中的记录后,使用WriteProcessMemory置换Function值为自己的Function值。找到目标API的IAT记录后,使用WriteProcessMemory API把这个Function值替换为挂钩函数的地址。IAT重定向实现流程如图1所示[4]。

3 检测与防御方法

(1) 基于编译器的检测方式

这种方式通过修改编译器中的数据来加入一些无效的数据或直接加密敏感数据,所谓的敏感数据通常指函数指针或函数返回地址,这种检测方式最大的缺点是需要源代码,不太适合普通的用户。典型范例:stuacGuard在靠近返回地址的地方放置叫Canary字的4个字节。在函数被调用时,Canary字被设置为随机值,然后在函数返回前检查Canary字的完整性。如果Canary被修改,就认为发生了攻击,程序被终止运行。

(2) 基于虚拟机的检测方式

基于虚拟机检测方式的优点是被检测程序运行于虚拟机中,其攻击作用对于虚拟机以外的真实系统可以有效地被隔离。

图1 IAT重定向实现流程

学术研究

A cademic R esearch

https://www.sodocs.net/doc/ec15323875.html, 62

信息安全与通信保密 · 2010.10

63

学术研究

A cademic R esearch

而缺点也是由于额外地运行于虚拟机中,使得被检测程序的性能严重下降。典型范例:Jiang 等人推出了一种叫“guest view casting”的技术,该技术从虚拟机外系统地重建内部语义图(如文件、进程和内核模型)。其采用的原理也是基于攻击者不能影响VM 外的程序的原理来检测恶意行为,通过分析VM 的数据结构得到有用的信息来检测VM 中的变化。在他们的设计中,还采取了其他的保护机制,这些机制通过分析从VM 中获取的信息来检测攻击,并计算了分析虚拟机原始内存需要的时间,这个时间与VM 的内存成线性关系(大约12.8 MB/s)。

(3) 修改操作系统的检测方式

这种检测方法的优点是并不需要程序的源代码,方便普通用户使用,通过API 挂钩或系统调用来修改一些动态链接库或加密指令。典型范例:在Windows 系统中,Nguyen 等提出了一个使用操作系统中本地API 来阻止代码注入的框架,框架的主要思想是校验Windows 系统,框架分为两层,第一层分配本地API 的ID 号。如果攻击者不知道这种置换,就不能成功调用本地API;第二层校验调用者的返回地址是否位于合法的进程空间内来进行保护。如果攻击者破解了第一层的置换,而第二层不能很好地防御精心构造的攻击代码,一个明显的例子就是伪造返回地址技术,该技术可以轻易依靠合法进程的返回地址。

DOME 是一个通过监控API 来检测恶意代码的系统,其主要思想与这里的系统很相似。但是,解决了其不能处理的问题。该系统在预处理阶段使用IDA pro 来反汇编返回地址。运行后,当API 调用发生后就校验其返回地址。但是IDA pro 没有处理DLL 和加密的可执行文件。同时,校验所有API 的返回地址效

率低而且花费大。另一个问题是DOME 的包封装模块能够被绕过,即恶意调用没有进入API 封装模块进行API 的调用。

4 结语

这里研究了Windows 系统中恶意代码入侵的工作机理,分析了DLL 注入和API 挂钩的实现方法,它们是恶意代码攻击的核心技术,同时针对性地提出了相应的恶意代码检测和防御方法。DLL 注入技术可将自己想运行的代码注入到一个已经存在的合法进程中去。许多恶意代码正是使用了此方法将自己的程序写入合法进程的地址空间去,从而躲避了病毒查杀和防火墙之类安全软件的检测。API 钩子最初是为了监测程序中API 的行为和相互关系而设计的,尤其是非开源程序。这种技术通过拦截或替换的API 来扩展API 的功能。上述研究对于信息安全研究领域中的恶意代码攻防相关技术提供了有益的参考。

参考文献

[1] SKOUDIS E,ZELTSER Lenny. 决战恶意代码[M]. 北京:电子工业出版社,2005.

[2] 杨兴春,李明东,尹德春,等. Win32系统的API挂钩技术[J]. 甘肃科技,2005(05):60-62.

[3] 陈志云,薛质. 基于Win32 API 调用监控的恶意代码检测技术研究[J]. 信息安全与通信保密,2009(07):79-81.[4] RICHTER Jeffrey,NASARRE Christophe. Windows核心编程[M].第

5版. 葛子昂,周靖,廖敏,译. 北京:清华大学出版社,2009.

《信息安全与通信保密》杂志启用科技期刊学术不端文献检测系统

为了提高来稿质量,杜绝学术造假,促进《信息安全与通信保密》的健康发展,从2010年1月起,本刊编辑将正式启用科技期刊学术不端文献检测系统,对所有来稿进行检查。对于检测出有不端行为的稿件,编辑部将直接退稿。在此,希望广大作者在撰写论文时,一定要本着实事求是的科学精神,引用他人的研究成果时务必在参考文献中列出,并在正文中相应位置进行标注。大家共同努力,维护学术研究的诚信,杜绝学术不端行为,促进《信息安全与通信保密》的可持续发展,为广大作者搭建一个更好、更高、更权威的学术争鸣和技术交流的平台。

《信息安全与通信保密》杂志社

2010年1月1日

Springer-Verlag,2006:01-08.

[8] ZHANG R. End-to-end Rate Distortion Analysis and Optimization for Robust Video Transmission over Lossy Networks[D]. California:University of California,2001.

[9] ZHANG R,REGUNATHAN S L,ROSE K. Video Coding with Optimal Inter/intra-mode Switching for Packet Loss Resilience[J]. IEEE Journal on Selected Areas in Communications,2000,18(06):966-976.

[10] SABIR M F,SHEIKH H R,HEATH R W,et al. A Joint

S o u r c e -C h a n n e l D i s t o r t i o n M o d e l f o r J P E G C o m p r e s s e d I m a g e [J ]. I E E E Transactions on Image Processing,2006,15(06):1349-1364.[11] SABIR M F,HEATH R W,BOVIK A C. Joint Source-Channel

Distortion Modeling for MPEG-4 Video Transmission[C]//IEEE. ICASSP 2006. New Orleans :IEEE Publications,2006:201-204.[12] SHEN Y S,COSMAN P C,MILSTEIN L B. Video Coding With

Fixed-Length Packet for a Tandem Channel[J]. IEEE Transactions on Image Process,2006,15(02):273-288.

(上接第58页)

相关主题