(计算机应用技术专业论文)基于windows20002003内核对象的rootkit检测.pdf_第1页
(计算机应用技术专业论文)基于windows20002003内核对象的rootkit检测.pdf_第2页
(计算机应用技术专业论文)基于windows20002003内核对象的rootkit检测.pdf_第3页
(计算机应用技术专业论文)基于windows20002003内核对象的rootkit检测.pdf_第4页
(计算机应用技术专业论文)基于windows20002003内核对象的rootkit检测.pdf_第5页
已阅读5页,还剩60页未读 继续免费阅读

(计算机应用技术专业论文)基于windows20002003内核对象的rootkit检测.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

iv 基于基于 windows(2000/2003)内核对象的内核对象的 rootkit 检测检测 摘要摘要 随着 rootkit 技术的发展, 病毒程序设计者趋于利用 rootkit 技术来隐藏他们的 非法行为,从而达到自己的目的。虽然目前存在各种各样的检测 windows rootkit 的工具, 但这些工具只能检测某些特定的rootkit, 无法检测到一些新型的windows rootkit 病毒。本文提出了一个新的、基于 windows 内核对象的 rootkit 检测技术 方法,该方法能够检测到目前 windows 环境下的大多数 rootkit 病毒。该方法的 基本原理就是通过扫描、检测 windows 操作系统内核中的关键的内核对象,如: 中断描述符表(idt) 、系统服务描述符表(ssdt) 、重要 pe (portable executive) 文件、有关记录进程信息的数据结构等等,并对这些内核对象进行更深入、更全 面的保护。 基于本文提出的 windows rootkit 检测的研究成果,作者设计了一个新型 windows rootkit 检测工具,该工具是目前最全面的 windows rootkit 检测工具。它 可以检测 idt/sysenter hook、ssdt hook、inline hook、iat/eat hook、驱动 函数 hook,以及检测隐藏端口信息、隐藏文件信息和隐藏进程信息。 论文的主要工作如下: 1、对 windows rootkit 技术的历史背景、定义、分类进行了综述,并详细分 析了 windows rootkit 的各种实现技术,包括:中断描述符表、内核修补 技术、pe 文件分析。 2、研究了现有的各种 windows rootkit 检测方法。利用这些检测方法对几种 著名的 windows rootkit 以及目前的 rootkit 技术进行检测,然后对检测情 况作了简要的评述,指出了现有检测方法的缺陷以及需要改进之处。 3、提出了一种基于 windows 内核对象的 rootkit 检测方案,以全面、有效地 检测各种现有的 windows rootkit。windows 内核对象包括:windows 系统 内核架构对象、windows 系统内核 pe 文件对象、基于 windows 系统内核 功能对象。 a) 基于 windows 系统内核架构对象的 rootkit 检测就是对内核架构各层 的检测使用综合的检测方法。例如不将 inline hook 的检测方法仅仅 局限于 ssdt 表里的函数,而是扩展到凡是有内核函数地址调用的 v 情况,都需要进行 inline hook 检测。 b) 基于 windows 系统内核 pe 文件对象的 rootkit 检测方法是检测 hook 点的内容是否与 pe 文件相应的地址处的内容相匹配。 c) 基于 windows 系统内核功能对象的 rootkit 检测方法就是依靠系统中 大多数相关内核功能对象来检测相关 rootkit。 4、基于本文提出的检测方案,作者实现了一个 windows rootkit 的检测工具 rootkitchecker.exe,该工具可以全面的、准确的检测目前所有流行的 windows rootkit。 本文的研究工作对 windows rootkit 的检测方法提供了比较完整的分析和总 结,所提出的基于内核对象检测方法,弥补了现有检测方法的不足,可以有效的 检测出各种 windows rootkit. 关键字:windows rootkit; 内核对象;系统服务描述符表;进程;端口;文件 vi windows rootkit detection based on windows(2000/2003) kernel objects abstract along with the development of rootkit technique,the program designers of virus tend to use the rootkit technique to hide their behavior so as to obtain their aim. today there are various tools that used to detect rootkit in the window system,but these tools only can detect some special rootkits and exists some flaws,in order not to detect some new windows rootkit virus. in this article a method has been proposed, which can detect a mass of windows rootkits based on windows kernel object.the principle of this new method is implementing in-depth and all-sided protection of windows kernel object by scanning and checking pivotal kernel objects in windows system,such as interrupt descriptor table, system service descriptor table,important pe files,data structure of recording process information and so on. this paper has designed a new detection tool of windows rootkit based on the new detection method proposed in this article.the tool is the most all-sided detection tool of windows rootkit recently and it can detect eight types of hooks include idt/sysenter hook,ssdt hook,inline hook,iat/eat hook,driver function hook, hidden port information, hidden file information and hidden process information. main works of this paper as follows: 1. summarize the background and definition of windows rootkit,and classify them into seven rootkit types.introduce all of windows rootkits important technic,including: interrupt describer table (idt),kernel patch,portable executable (pe) file analyse. 2. study all kinds of rencent check technic of windows rootkit.we have checked these rootkits with these check method.according the check result,we ponit out the deficiency of these check tools and give the advanced idea. 3. in order to check all kinds of windows rootkit efficently and completely,we put forward memory integrality check method.windows kernel include windows kernel architecture,windows pe objects,windows kernel function objects. a) windows rootkit detection method based on windows kernel architecture is to integrate multi-detection methods in order to detect every layer of windows kernel architecture.for example,it dont confine the detection method of inline hook only to detect ssdt hook, but expanding to all the conditions of calling one kernel address. b) windows rootkit detection method based on windows pe objects is detecting the hook point data whether is matching with windows pe objects data or not. vii c) windows rootkit detection method based on windows kernel function objects depend on checking most of windows kernel objects in order to check correlative rootkits. 4. the author have implemented a tool of windows rootkit detection based on the detection strategy proposed in this paper,and this tool can check all kinds of popular windows rootkit efficacious and completely. the research work of this paper provide complete analyse and summing-up for research on windows rootkits check technic. the new detection method based on windows kernel objects make up the deficiency of current detect method,it can find out all currently exist windows rootkit. key words: windows rootkit, kernel object, system service descriptor table, process port, file ii 上海交通大学上海交通大学 学位论文原创性声明学位论文原创性声明 本人郑重声明:所呈交的学位论文,是本人在导师的指导下,独 立进行研究工作所取得的成果。除文中已经注明引用的内容外, 本论文不包含任何其他个人或集体已经发表或撰写过的作品成 果。对本文的研究做出重要贡献的个人和集体,均已在文中以明 确方式标明。本人完全意识到本声明的法律结果由本人承担。 学位论文作者签名:薛英飞 日期:2008 年 1 月 10 日 iii 上海交通大学上海交通大学 学位论文版权使用授权书学位论文版权使用授权书 本学位论文作者完全了解学校有关保留、使用学位论文的规定, 同意学校保留并向国家有关部门或机构送交论文的复印件和电子 版,允许论文被查阅和借阅。本人授权上海交通大学可以将本学 位论文的全部或部分内容编入有关数据库进行检索,可以采用影 印、缩印或扫描等复制手段保存和汇编本学位论文。 保密 保密,在 年解密后适用本授权书。 本学位论文属于 不保密 不保密。 (请在以上方框内打“” ) 学位论文作者签名:薛英飞 指导教师签名:李小勇 日期: 2008 年 1 月 10 日 日期:2008 年 1 月 10 日 1 第一章第一章 绪论绪论 1.1 研究背景 近年来,随着互联网在全球范围内的迅猛发展,世界各国的政治、军事、经 济、文化和人民的生活都越来越依赖于网络。网络改变了现代人的工作、学习、 生活方式, 同时网络推动了人类在各个领域的发展。 但是网络总是有它的脆弱性, 黑客就是利用这些网络的弱点进行攻击,以达到他们的不法利益。黑客的攻击手 段是不断更新的,他们制造了很多病毒,这些病毒总是包含着很多新技术。 目前一项名为 rootkit 的新技术已经开始被病毒利用。rootkit 指的是恶意代 码作者用来隐藏他们的代码不被发现的工具,它通过监听系统的功能,用合法的 数值取代返回的数据。rootkit 类病毒通过隐藏自身进程(有时甚至连添加的注 册表键值也隐藏起来) ,以增加电脑用户的识别难度,并逃避杀毒软件的查杀。 rootkit 类病毒已经成为困绕目前电脑用户的新难题。目前大部分的 bot 类蠕虫 病毒采用了 rootkit 技术。 由于 windows rootkit 是一种新型技术, 而且它的灵活性很强, 行踪非常隐秘, 很难查找。目前的杀毒软件公司仅仅对某些著名的且已存在的 windows rootkit 做了检测工具,没有系统的、全面的 windows rootkit 检测工具。如目前非常流行 的 icesword 软件,它能检测的 windows rootkit 包括:隐藏进程、隐藏端口、隐 藏文件、系统服务描述符表(ssdt) hook,这明显不能检测很多类型的 rootkit, 如 inline 函数 hook。还有趋势科技(trend)的 rootkitbuster,它的检测功能有: 隐藏文件、隐藏进程、注册表的监控,注册表的监控可以归于文件的监控,即与 检测隐藏文件的技术是类似的, 这个工具是不能满足当前的需求的。 还有 mcafee 的 rootkit_detective,它的检测功能包括:隐藏文件、隐藏进程、系统服务描述 符表 hook、输入/输出函数地址表(iat/eat) hook,这同样是不够的。还有赛门 铁克和卡巴斯基两家公司,他们都没有独立的 rootkit 检测工具,像卡巴斯基的 桌面杀毒软件检测著名的隐藏进程 hxdef.exe 时,依靠的是特征码匹配的方法, 即把它当作病毒一样把其特征码放在病毒库中,这种做法明显不能跟得上目前 rootkit 技术的发展趋势。基于 windows rootkit 的飞速发展,检测 windows rootkit 的研究迫在眉睫。 1.2 研究目标 目前在 windows rootkit 检测技术领域,国内外存在各种各样的检测方法与工 具, 这为以后的 windows rootkit 检测技术研究提供了坚实的基础。 但这些工具只 2 能检测某些特定的 rootkit,无法检测到一些新型的 windows rootkit 病毒。基于 windows rootkit 技术的特点, 病毒程序设计者越来越多地利用 rootkit 技术来隐藏 他们的攻击行为,目前的 windows rootkit 检测技术与工具不能满足当前的需求, windows rootkit 检测技术的研究越来越紧迫。 通过对当前的 windows rootkit 重要技术与几个经典的工具进行了分析与研 究,发现目前检测技术的不足,然后提出一个新的、基于 windows 内核对象的 rootkit 检测技术方法, 使该方法能够检测到目前 windows 环境下的大多数 rootkit 病毒。最后基于 windows rootkit 检测的研究成果,设计一个新型 windows rootkit 检测工具,使该工具能够检测 idt/sysenter hook、ssdt hook、inline hook、 iat/eat hook、驱动函数 hook,以及检测隐藏端口信息、隐藏文件信息和隐藏 进程信息等 windows rootkit。 1.3 研究内容及成果 本文阐述了 windows rootkit 的历史背景以及其工作原理,并且对 windows rootkit 的重点技术和检测方法做了详细的分析,介绍了一些经典的 windows rootkit软件, 然后本文提出了基于windows内核对象的windows rootkit检测方法, 与目前的检测技术做了对比,最后基于该方法设计了一个全面的 windows rootkit 检测工具 rootkitchecker,并展示了该方法的优越性和实验结果。 本文研究内容包括以下方面: 1、介绍 windows rootkit 的历史背景及其该技术的工作原理。 2、对 windows rootkit 的重要技术进行了详细的分析,介绍了 pe 文件格式, 对 windows rootkit 的七个挂载点做了详细的分析,并对直接操作内核对 象操作技术进行了阐述。 3、对目前的 windows rootkit 检测技术与方法进行了分析,并提出了我们可 以借鉴的优点以及它们存在的缺点。主要的检测方法有:基于对已知 rootkit 签名的检测、 基于异常行为的 rootkit 检测、 基于交叉试图的 rootkit 检测、基于内存完整性的 rootkit 检测。还预测了 windows rootkit 的发展 趋势以及分析了两个经典 windows rootkit 软件:hacker defender、fu。 4、基于以上的分析,本文提出了基于 windows 内核对象的 windows rootkit 检测方法,并分析了该方法比目前方法的优越性,最后设计了 rootkitchecker 检测工具并展示了实验结果。 3 1.4 论文结构 本文共分六章,内容安排如下: 第一章 绪论,介绍了 windows rootkit 的研究背景,论文研究内容以及本论文的 结构安排。 第二章 windows rootkit 技术,本章阐述了 windows rootkit 的历史背景并对 windows rootkit 技术的工作原理进行了分析。而且对 windows rootkit 的重要技术 进行了分析,这些技术是 windows rootkit 的基础,不管是 rootkit 还是 anti-rootkit 都需要掌握这些技术。 第三章 现有的检测技术分析,本章对目前存在并流行的 windows rootkit 检测方 法进行了分析,分析它们的优缺点,并提出未来 windows rootkit 检测趋向,最后 分析了两个经典的 windows rootkit 工具。 第四章 基于 windows 内核对象的 rootkit 检测系统设计,基于以上的分析,本章 提出了基于 windows 内核对象的 windows rootkit 检测方法,并分析了该方法比 目前方法的优越性,最后提出了设计 rootkitchecker 检测工具的方案。 第五章 系统测试,本章对本文提出的设计工具进行了测试,并展示了实验结果。 第六章 结束语,本章总结了本文的研究成果,并展望后续工作。 4 第二章第二章 windows rootkit 技术技术 2.1 windows rootkit 概述 2.1.1 rootkit 历史背景 rootkit 出现于二十世纪 90 年代初, 在 1994 年 2 月的一篇安全咨询报告中首 先使用了 rootkit 这个名词。 这篇安全咨询就是 cert-cc 的 ca-1994-01, 题目是 ongoing network monitoring attacks。从出现至今,rootkit 的技术发展非常迅速, 应用越来越广泛,检测难度也越来越大。直到 2002 年 1 月,安大略大学的巴朗. 莫坦发现了一个奇怪的现象,一个 ierk8243.sys 的驱动引起了系统崩溃(bsod, blue screen of death) ,最后经过专家们的鉴定,称之为这是一种很罕见的 windows “rootkit”,从此 rootkit 开始在 windows 系统流行 5。greg hoglund,一 位软件安全领域的先驱者, 他创建了第一个基于 windows nt 的 rootkit 并撰写了 文档,同时建立了 www.rootkit.corn 网站。从此 rootkit 技术发展迅速。 2.1.2 rootkit 技术的使用 rootkit 这个术语已经存在 10 多年了。它是由有用的小型程序组成的工具包, 使得攻击者能够保持访问计算机上具有最高权限的用户“root”。 rootkit 只是一种 技术,理解这一点是很重要的。 rootkit 是一种特殊类型的 malware(恶意软件) 。rootkit 之所以特殊是因为 您不知道它们在做什么事情。rootkit 基本上是无法检测到的,而且几乎不可能 删除它们。虽然检测工具在不断增多,但是恶意软件的开发者也在不断寻找新的 途径来掩盖他们的踪迹。 rootkit 的目的在于隐藏自己以及其他软件不被发现。 它可以通过阻止用户识 别和删除攻击者的软件来达到这个目的。rootkit 几乎可以隐藏任何软件,包括 文件服务器、键盘记录器、botnet 和 remailer。许多 rootkit 甚至可以隐藏大 型的文件集合并允许攻击者在您的计算机上保存许多文件, 而您无法看到这些文 件。 rootkit 本身不会像病毒或蠕虫那样影响计算机的运行。 攻击者可以找出目标 系统上的现有漏洞。漏洞可能包括:开放的网络端口、未打补丁的系统或者具有 脆弱的管理员密 码的系统。在获得存在漏洞的系统的访问权限之后,攻击者便 可手动安装一个 rootkit。这种类型的偷偷摸摸的攻击通常不会触发自动执行的 网络安全控制功能,例如入侵检测系统。 5 随着互联网的普及,windows 系统上出现了越来越多的 virus, spyware, worm。而最新的趋势是这些软件和 windows 上的 rootkit 绑定在一起。试想一 想,如果一个 spyware 将自己的进程和 registry 信息用 rootkit 给隐藏起来,普 通用户可能就无法发现还有这么一个软件在运行。而且,各种 anti-spyware 软件 恐怕也就不那 么有效了。如果连系统中有什么在运行都无法确定,检测和清除 有从何谈起呢? 2.1.3 windows rootkit 技术的工作原理 图 1 windows rootkit 的 7 个 hook 点 figure 1 seven hook points of windows rootkit windows 系统上的 rootkit 分为 user mode 和 kernel mode 两种 8,取决于它 是采用何种方式修改操作系统的。举个例子,对于一个典型的 win32 api 调用, 例如 createfile 用户模式下:application - kernel32.dll - ntdll.dll 接着通过调 用 int 2eh 进入内核模式:- kiservicetable - ntexecutives 在 这一调用系列 中,rootkit 可以修改任何一处,最终目的都是一样的,控制特定的系统调用的 返回结果。例如,如果修改了 findfirstfile/findnextfile 调用的结果,那么不管 你用 dir 命令,还是 explorer, 都看不到 rootkit 想要隐藏的文件。 6 以往,不管是用户模式的 rootkit,还是内核模式的 rootkit,主要是 hook/intercept api 调用。最近的发展是,kernel mode 的 rootkit 直接修改关键的 kernel mode 的数据结构,例如把自己的 pcb 从系统的活动进程表中直接删除。 这种 rootkit,要检测起来是非常难办的。 2.2 windows 系统关键内核对象分析 windows 内核对象是由操作系统内核分配一个内存块,只能由内核访问和管 理。所以,应用程序是无法在内存中找到这些并维护它们的,应用程序只能通过 句柄的方式并调用windows提供的一系列内核对象操作接口并依赖于os来进行 维护,而且这些句柄对于应用程序来说也是不透明的,应用程序只有句柄的使用 权,而无修改权。本文提出的检测方法就是从 windows 内核对象为研究对象,所 以研究 windows 内核对象是我们必须要做的。 2.2.1 中断描述符表 全局描述符表 16(gdt,global describtor table) :该表中存有整个系统用的 段描述符和各个进程共用的段描述符,如数据段、代码段、堆栈段等等,最大表 长 64kb; 局部描述符表(ldt,local describtor table) :该表中存有某个进程专用的 各段的段描述符,最大表长 4gb; 段描述符(segment describtor) :该结构用来描述一个段的基地址(该地址 是线性地址) ,该段的类型,对该段操作的限制等等; 段选择符(segment selector) :该结构是 gdt 或 ldt 中的索引; 中断描述表(idt,interrupt describer table) :该结构中存有中断门描述符, 陷阱门描述符和任务门描述符; 在实地址模式下,在内存的 01k 字节地址范围内存放一个中断向量表。 该表的每个表项占四个字节, 高端两个字节存放段地址和低段两个字节存放段内 偏移量,这四个字节的地址就是相对应中断处理程序的入口地址。但是,在保护 模式下,四个字节的表项所构成的中断向量表根本不能实现这种设计。所以在保 护模式下,除了高端两个字节存储段描述符外,用四个字节来存储段内偏移量。 这样中断向量表中的表项由 8 个字节组成。下面就是中断向量表 idt(interrupt descriptor table) 。 7 图 2 中断向量表 idt figure 2 interrupt describer table(idt) 中断描述符表寄存器 idtr, 是用来存放中断描述符表在内存中的起始地址。 中断描述符表寄存器 idtr 是一个 48 位的寄存器, 其低端 16 位保存中断描述符 表的大小,高端 32 位保存 idt 的基址。 图 3 中断向量表寄存器 idtr figure3 interrupt describer table register(idtr) 现在我们以中断处理过程为例来描述一下如何通过中断描述符表找到真正 的中断处理程序。当用户层产生一个中断请求后,保存中断前进程的执行环境, 进入内核状态,访问中断描述符表寄存器 idtr,得到中断描述符表的基地址, 然后以中断描述表的段选择符为索引, 查找通过全局描述符表或局部描述符表得 到段描述符表中对应的段,再通过中断描述符表中段内偏移地址,找到对应段内 的具体地址,也就是该中断处理函数。 2.2.2 系统服务描述符表 系统调用进入内核后,大多数是为了调用系统描述符表,然后调用该表中的 具体函数。winnt 内核中有两个全局变量,keservicedescriptortable, keservicedescriptortableshadow,我们这里只讨论 keservicedescriptortable,该 变量指向一个数组,该数组里存储着 ntoskrnl.exe 模块中的系统函数。我们可以 用 windbg 工具查看。 8 lkdddnt!keservicedescriptortable 8089f460 80830bb4 00000000 00000128 80831058 8089f470 00000000 00000000 00000000 00000000 8089f480 00002710 bf89ce45 00000000 00000000 8089f490 f9d774c0 81760740 814cd100 80a5d380 8089f4a0 00000000 00000000 e2ce5688 000001a5 8089f4b0 c488e748 01c84136 00000000 00000000 8089f4c0 00000000 00000000 00000000 00000000 8089f4d0 00000000 00000000 00000000 00000000 获得 keservicedescriptortable 变量指向的地址 0 x80830bb4,该地址存储着 ntoskrnl.exe 模块的 294(windows 2003)或者 248(windows 2000)个系统函数。 lkd dd 80830bb4 80830bb4 80917510 80962516 809667ce 80962548 80830bc4 80966808 8096257e 8096684c 80966890 80830bd4 80989248 8098a200 8098a200 8095da44 80830be4 8095d698 80945e8e 80945e3e 80989616 80830bf4 80927e5e 80988da6 80840014 8098cbb1 80830c04 80923578 80948388 8082dde4 80938550 80830c14 808e35c2 8087a850 80981cb2 8092b790 80830c24 80966cf8 808b1172 8096af1e 80917e0c 9 上面的地址就是 ntoskrnl.exe 模块中函数在内核中的虚拟地址。利用 ln 命令 查看这些地址可以得到这些函数的详细信息。 lkd ln 80917510 (80917510) nt!ntacceptconnectport | (80917e0c) nt!ntcompleteconnectport exact matches: nt!ntacceptconnectport = lkd ln 80962516 (80962516) nt!ntaccesscheck | (80962548) nt!ntaccesscheckbytype exact matches: nt!ntaccesscheck = keservicedescriptortable 提供系统核心函数的调用,当用户进程在调用 ntdll.dll 中的函数时,ntdll.dll 将调用转到系统服务描述符表中。我们先 来看看系统服务分配器的结构 typedef struct _service_descriptor_table system_service_table ntoskrnl; / ntoskrnl.exe system_service_table win32k; / win32k.sys system_service_table table3; / not used system_service_table table4; / not used service_descriptor_table, * pservice_descriptor_table, *ppservice_descriptor_table; 从上面可以看出,系统服务分配器其实一共由四张表组成,通过前面的 kd 我们知道对于 keservicedescriptortable,只有 ntoskrnl 和 table3(也许有的 windows2000 系统只有 ntoskrnl)有效,ntoskrnl 服务描述符表我们已经知道了,是 系统核心服务程序 ntoskrnl.exe 来执行的。 对 table3 我也不知道是用来干什么的, 只知道由 spud.sys 来执行的。接下来我们来看看 system_service_table 表 的结构 10 typedef ntstatus (ntapi *ntproc) (); typedef ntproc *pntproc; typedef struct _system_service_table pntproc servicetable; /真正的函数表 pdword countertable; dword servicelimit; pbyte argumenttable; system_service_table, * psystem_service_table, *ppsystem_service_table; 一共有 4 个成员,第一个为函数执行地址,第二个为使用的次数,只有在调试版 中才有用,第三个为服务表函数的个数,第四个参数为参数表。 2.2.3 pe 文件格式分析 图 4 pe 文件的物理分布图 figure 4 the distributing diagram of pe file 现在我们来看看加载 pe 文件主要步骤: 11 1、当 pe 文件被执行时, 首先 pe 装载器检查该文件是否是仅仅在 dos 环境 下运行,若否,则查看 dos mz header 里的 pe header 偏移量。若找到 该偏移量,则地址转换后跳到 pe header 部分。 2、pe 装载器先检查 pe header 的有效性。 若有效, 则加上 pe header 的大小, 得出 section header 的地址,然后跳到该地址。 3、到了节表后。pe 装载器读取其中的节信息,并采用文件映射方法将这些 节映射到内存,同时付上节表里指定的节属性。 pe 文件映射入内存后,pe 装载器将处理 pe 文件中类似 import table(引入表) 逻辑部分。 image_nt_headers 结构,该结构就是 pe header 的结构。如下: struct image_nt_headers dword signature; image_file_header fileheader; image_optional_header32 optionalheader; ; 现在我们来看一下 image_file_header 结构,pe header 的 file header(文 件头)部分。 typedef struct _image_file_header word machine; word numberofsections; dword timedatestamp; dword pointertosymboltable; dword numberofsymbols; word sizeofoptionalheader; word characteristics; image_file_header, *pimage_file_header; 现在对以上几个重要的字段进行描述如下: machine :该文件运行所要求的 cpu。对于 intel 平台,该值是 image_file_machine_i386 (14ch)。 12 numberofsections:文件的节数目。 sizeofoptionalheader:指示紧随本结构之后的 optionalheader 结构大小,必须 为有效值。 characteristics:关于文件信息的标记,比如文件是 exe 还是 dll。 我们也可以反汇编 image_optional_header 结构 10,该结构中有一个 很重要的字段是 datadirectory。datadirectory 是一个 image_data_directory 结构数组,共有 16 个成员。如果您还记得节表可 以看作是 pe 文件各节的根目录的话,也可以认为 data directory 是存储在这些 节里的逻辑元素的根目录。明确点,data directory 包含了 pe 文件中各重要数据 结构的位置和尺寸信息。 每个成员包含了一个重要数据结构的信息。 (以下是 data directory 数组的元素, 即 data directory0=输出表, data directory1输入表) 图 5 datadirectory 数组元素类型 figure 5 the element type of datadirectory array 以下这个结构是 data directory 每个元素的结构 struct image_data_directory dword virtualaddress; dword size; ; virtualaddress 实际上是数据结构的相对虚拟地址(rva)。比如,如果该结构是 关于 import symbols 的,该域就包含指向 image_import_descriptor 数组 的 rva。 13 isize 含有 virtualaddress 所指向数据结构的字节数。 比如输入表的地址base+ data directory1. virtualaddress typedef struct _image_import_descriptor union dword characteristics; image_thunk_data *originalfirstthunk; u; dword timedatestamp; dword forwarderchain; dword name; image_thunk_data *firstthunk; image_import_descriptor; 结构第一项是一个 union 子结构。 事实上,这个 union 子结构只是给 originalfirstthunk 增添了个别名,您也可以称其为characteristics。 该成员项 含有指向一个 image_thunk_data 结构数组的 rva。 image_import_descriptor 数组中,最重要的部分是 imported dll 的名称以及两个 image_thunk_data 数组。每个 image_thunk_data 对应一个导入函数。 在 exe 中, 两个数组(分别由 characteristics 和 firstthunk 域 指向)平行存在,并且都以 null 位结束符。 需要两个平行数组的原因是 10:第一个数组(由 characteristics 指向)从不被 修改,有时它被称为 hint-name table。第二个数组(由 firstthunk 指向)则被装载 器改写。装载器一一检查每一个 image_thunk_data 并且找出它所记录的 函数的地址, 然后把地址写入 image_thunk_data 这个 dword 之中。 由 于这个 image_thunk_data 数组内容已经被装载器改写为输入函数的地 址, 所以它又被叫做 import address table(iat)。 iat 是一个可写区域。 api hook 就 利 用 到 这 一 特 性 。 pe装 载 器 载 入pe后 , firstthunk 指 向 的 image_thunk_data 被 改 写 , 而characteristics所 指 向 的 image_thunk_data 没有被改写。所以若还反过头来查找导入函数名,pe 装载器还能够根据 characteristics 所指向的 image_thunk_data 找寻到函 数名。 14 image_thunk_data 是一个 dword 类型的集合。通常我们将其解释为指 向一个 image_import_by_name 结构的指针。注意 image_thunk_data 包含了指向一个 image_import_by_name 结构 的指针: 而不是结构本身。 请看这里: 现有几个 image_import_by_name 结构,我们收集起这些结构 的 rva (image_thunk_datas)组成一个数组,并以 0 结尾,然后再将数组的 rva 放入 originalfirstthunk。 image_import_by_name 结构存有一个引入函数的相关信息。 再来研究 image_import_by_name 结构: typedef struct _image_import_by_name word hint; byte name1; image_import_by_name,*pimage_import_by_name; 引出表的设计是为了方便 pe 装载器工作。首先,模块必须保存所有引出函 数的地址以供 pe 装载器查询。模块将这些信息保存在 addressoffunctions 域指 向的数组中,而数组元素数目存放在 numberoffunctions 域中。 因此,如果模 块引出 40 个函数,则 addressoffunctions 指向的数组必定有 40 个元素,而 numberoffunctions 值为 40。现在如果有一些函数是通过名字引出的,那么模块 必定也在文件中保

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论