windows环境下隐蔽调试器的设计与实现 硕士论文.doc_第1页
windows环境下隐蔽调试器的设计与实现 硕士论文.doc_第2页
windows环境下隐蔽调试器的设计与实现 硕士论文.doc_第3页
windows环境下隐蔽调试器的设计与实现 硕士论文.doc_第4页
windows环境下隐蔽调试器的设计与实现 硕士论文.doc_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

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

文档简介

电 子 科 技 大 学 university of electronic science and technology of china 硕士学位论文 master dissertation 论 文 题 目: windows 环境下隐蔽调试器的设计与实 现 学 科 专 业: 计算机应用技术 指 导 教 师: 作 者 姓 名: 班 学 号: 200620603016 分类号 密级 udc 1注 学 位 论 文 windows 环境下隐蔽调试器的设计与实现 (题名和副题名) 指导教师姓名 副教授 电子科技大学 成 都 (职务、职称、学位、单位名称及地址) 申请专业学位级别 硕士 专业名称 计算机应用技术 论文提交日期 2009.3 论文答辩日期 2009.5 学位授予单位和日期 电子科技大学 答辩委员会主席 评阅人 2009 年 月 日 注 1:注明国际十进分类法 udc的类号。 独 创 性 声 明 本人声明所呈交的学位论文是本人在导师指导下进行的研究工作 及取得的研究成果。据我所知,除了文中特别加以标注和致谢的地方 外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含为 获得电子科技大学或其它教育机构的学位或证书而使用过的材料。与 我一同工作的同志对本研究所做的任何贡献均已在论文中作了明确的 说明并表示谢意。 签名: 日期: 年 月 日 关于论文使用授权的说明 本学位论文作者完全了解电子科技大学有关保留、使用学位论文 的规定,有权保留并向国家有关部门或机构送交论文的复印件和磁盘, 允许论文被查阅和借阅。本人授权电子科技大学可以将学位论文的全 部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描 等复制手段保存、汇编学位论文。 (保密的学位论文在解密后应遵守此规定) 签名: 导师签名: 日期: 年 月 日 摘 要 在安全事件中,恶意代码造成的经济损失占有最大的比例。恶意代码的检测 技术总是滞后于新恶意代码的出现。一方面是人们很难区别正常代码和恶意代码; 另一方面,很多信息系统缺少必要的保护措施。因此,人们常常被恶意代码欺骗, 而无意地执行恶意代码。可见恶意代码被引入系统并执行是不可避免的,监控、 分析或检测二进制程序是否为恶意程序已经成为现阶段的研究热点。 恶意代码为了防止被分析,都有很强的自保护功能,现在主要的调试器很难 对恶意代码进行分析。同时,软件保护技术的发展使大量的反调试工具出现,既 有针对源代码的反调试工具,又有针对二进制程序的反调试工具。在反调试工具 中,加壳工具功能比较突出,它综合使用多种技术对抗代码分析调试,而且加壳 工具使用非常简单,越来越多的恶意代码使用加壳技术保护自己。 本文在分析了很多反调试技术后,包括检测断点技术、检测调试器技术和自 动修改代码技术等,设计并实现了一种隐蔽性强的调试器。该隐蔽调试器利用 windows 分页管理机制,巧妙地对目标进程设置断点以获取控制,很好地实现了 隐蔽调试的特性。 为获得对目标进程的控制权,本调试器利用了 windows 系统中进程的地址空 间分为用户空间和系统空间,代码执行之前系统会进行权限检查的特点,通过修 改了目标进程内存页面属性,使目标进程执行时出现异常,从而获得目标进程的 控制权。为增强隐蔽性,本调试器还采用了多种设计技术,包括:通过向目标进 程插入 shellcode 控制目标进程、不产生在 windows 系统中的注册信息等等。在功 能使用性方面,本隐蔽调试器为系统增加了一些新的系统调用,以方便实现调试 功能设置和用户交互。 实验和测试证明,本文提出的调试方法可以作为现行调试技术的一种有效的 补充。 关键词:调试器,反调试,恶意代码,进程 abstract iii abstract the economic loss which the malicious code creates holds the maximum proportion in the security incident. at present, the detection technology of malicious code could not meet the expectations of network security for a great diversity of malicious code. it is very difficult to distinguish the normal code and the malicious code, and many information systems lack the essential protective measures. analyzing of the malicious code in detail is meaningful in resisting the attack of malicious code and also a hot research spot. the malicious code has the inner self protection function to prevent to be analyzed. most debuggers are very difficult to analyze the malicious code. software protection technique now receives broad attention from all fields both at home and abroad, and there are a lot of anti debug softwares witch are used for an application code protection from reverse engineering. packers are created to protect an executable from analysis. they are used legitimately by commercial applications to prevent information disclosure, tampering and piracy. unfortunately, malcodes also use packers for the same reasons but for a malicious purpose. due to a large number of packed malcode, researchers and malcode analysts started to develop the skills to unpack samples for analysis. there are many anti-debug techniques, for example, software breakpoint detection, code checksum calculation and encryption and compression. the debugger is designed and completed witch uses the windows paging management mechanism to debug malcodes. the debugger doesnt register the debugger in the windows system, and controls the behavior of the object process by the shellcode. the debugger communicates with the user by adding some new system calls. the debugger is different from the other debuggers. the results of experiment showed that the method offered here is a supplement for traditional debugging techniques. keywords: debugger, anti-debug, malicious code, process 目录 iv 目录 第 1 章 绪论 .1 1.1 研究背景 .1 1.2 研究内容 .1 1.3 本文组织结构 .2 第 2 章 调试技术研究分析 .3 2.1 调试的基本概念 .3 2.2 调试器的结构 .5 2.2.1 调试器基础 5 2.2.2 调试器调试模型 6 2.3 主流调试器比较 .11 第 3 章 反调试技术研究分析 .13 3.1 反调试技术简介 .13 3.1.1 检测断点 13 3.1.2 计算校验和 13 3.1.3 检测调试器 13 3.1.4 自修改代码 14 3.1.5 覆盖调试程序信息 14 3.1.6 解除调试器线程 15 3.1.7 加密解密 15 3.2 反调试工具 .15 3.2.1 antidebuglib.15 3.2.2 themida.16 3.2.3 加壳工具 16 第 4 章 隐蔽调试器设计基础 .20 4.1 调试器的 cpu 支持 20 4.1.1 cpu 基础 20 4.1.2 中断和异常 22 目录 v 4.1.3 断点和单步执行 23 4.2 调试器的操作系统支持 .24 4.2.1 windows 概述 24 4.2.2 windows 页面机制 25 4.2.3 windows 异常处理 28 4.2.4 hook 技术 .29 第 5 章 隐蔽调试器系统地位及总体设计 .32 5.1 隐蔽调试器与其它子系统关系 .32 5.2 隐蔽调试器的系统框架 .33 5.2.1 隐蔽调试器框架 33 5.2.2 trais 和 csxe 关系 34 5.2.3 隐蔽调试器工作流程 35 5.3 隐蔽调试器的通信协议 .35 第 6 章 隐蔽调试引擎各模块详细设计 .39 6.1 页面异常处理(pfh)模块详细设计 39 6.2 断点处理模块详细设计 42 6.3 断点表模块详细设计 .43 6.4 通信模块详细设计 .46 第 7 章 实验和测试 .51 7.1 概述 .51 7.2 实验环境 .51 7.3 测试程序 51 7.3.1 调试器界面程序 51 7.3.2 目标程序 54 7.4 功能测试 .56 7.5 总结和展望 .59 致谢 .60 参考文献 .61 攻硕期间取得的研究成果 .64 图录 vi 图录 图 2-1 进程内调试模型 7 图 2-2 进程外调试模型 .8 图 2-3 混合调试模型图 .9 图 2-4 双机内核调试模型 10 图 2-5 单机内核调试模型 10 图 4-1 常用寄存器图 21 表 4-1 处理器工作方式与 cr0 的关系 21 图 4-2 windows 简明结构图 24 图 4-3 windows 虚拟地址空间布局 26 图 4-4 页面地址转换 26 图 4-5 页表索引结构 28 图 4-6 idt 表 28 表 4-2 异常和中断的优先级表 29 图 4-7 dll 文件替换法 30 图 5-1 恶意代码动态分析平台总体框架 32 图 5-2 隐蔽调试器框架 33 图 5-3 隐蔽调试引擎 trais 框架 34 图 5-4 隐蔽调试器工作流程 35 图 5-5 隐蔽调试器和目标进程的关系 36 图 5-6 隐蔽调试器通信流程 36 图 6-1 异常处理程序的堆栈图 39 图 6-2 页面异常错误代码结构 40 图 6-3 目标进程中页面和断点关系图 40 图 6-4 pfh 模块的流程图 41 图 6-5 设置断点流程图 42 图 6-6 查找断点流程图 43 图 6-7 断点表插入流程图 44 图 6-8 断点表删除流程图 45 图 6-9 目标程序调试功能初始化图 50 图录 vii 图 6-10 回调函数流程图 .50 图 7-1 界面程序流程图 52 图 7-2 目标进程执行 shellcode 时堆栈分布图 54 图 7-3 中间调用 api 图 54 图 7-4 themida 基本界面图 55 图 7-5 themida 加壳选项图 55 图 7-6 隐蔽调试器界面图 56 图 7-7 隐蔽调试器用户命令菜单图 56 图 7-8 隐蔽调试器设置断点图 57 图 7-9 隐蔽调试器查看断点图 57 图 7-10 od 调试 notepad.58 图 7-11 隐蔽调试器调试 notepad .58 第 1 章 绪论 1 第 1 章 绪论 1.1 研究背景 在安全事件 1中,恶意代码(malicious code)造成的经济损失占有最大的比例。 恶意代码主要包括计算机病毒(virus)、蠕虫(worm)、木马程序(trojan horse)、后 门程序(backdoor) 、间谍软件 (spyware)、逻辑炸弹(logic bomb)等等。 恶意代码感染就是通过用户执行该恶意代码或已经感染恶意代码的可执行代 码,从而使得恶意代码得以执行,进而将自身或者是自身的变体植入其他可执行 程序。被执行的恶意代码在完成自身传播的同时,若满足一定的条件,并具有足 够的权限时,就发作并进行破坏活动,造成信息丢失或者泄密等严重后果。 恶意代码的检测技术总是滞后于新的恶意代码的出现。一方面是人们很难区 别正常代码和恶意代码;另一方面,很多信息系统缺少必要的保护措施。因此, 人们常常被恶意代码欺骗,而无意地执行恶意代码。所以,恶意代码被引入系统 并执行是不可避免的。恶意代码为了防止被分析,都有很强的自保护功能 2,现 在主要的调试器很难对恶意代码进行分析。同时,软件保护技术的发展使大量的 反调试工具出现,既有针对源代码的反调试工具,又有针对二进制程序的反调试 工具。在反调试工具中,加壳工具 3功能比较突出,它综合使用多种技术对抗代 码分析调试,而且加壳工具使用非常简单,越来越多的恶意代码使用加壳技术保 护自己。因此,监控、分析或检测二进制程序是否为恶意程序已经成为现阶段的 研究热点。 目前比较流行的二进制程序分析工具3或调试器4常见的有: ollydbg、ida 、softice,注册表检测器 regmon 和文件监视器 filemon,以及最 近出现的 dynamorio 平台和 dyninst 平台等等。但是这些工具需要相互配合使用, 而且目前恶意代码的不断进化,抗分析能力越来越强,迫切需要具有高效、可靠 的恶意代码与安全漏洞动态分析平台。 1.2 研究内容 本论文是国家 242 项目恶意代码动态分析平台研究内容的一部分,主要研究 内容是分析目前主要的反调试技术和深入理解 windows 进程的管理机制,设计出 一种隐蔽性很强的调试方法。本文简述了软件调试 5的一般概念,论述了软件调 电子科技大学硕士学位论文 2 试的一般原理和调试器的结构,以及 cpu 对调试的支持(包括硬件断点,中断 和异常,保护模式等) 。本文充分研究了 windows 分页管理机制和进程管理机制, 设计了一种隐蔽性很强的调试机制和断点机制,以保证对恶意代码进行有效地动 态分析。 1.3 本文组织结构 本文首先介绍了项目的研究背景,然后概述了软件调试的一般原理和调试器 结构,并介绍了目前主要使用的调试器,接下来分析目前主要的反调试技术。最 后,介绍隐蔽调试器的设计原理和总体设计,以及隐蔽调试器各个模块的详细设 计。具体章节内容安排如下: 第 1 章为项目相关背景,研究内容的介绍。 第 2 章概述了软件调试的一般原理和调试器结构,并介绍了目前主要使用的 调试器。 第 3 章分析目前主要的反调试技术。 第 4 章简述了隐蔽调试器的设计原理,包括 cpu 基础、软件调试的支持和 windows 操作系统分页管理机制和进程管理机制。 第 5 章介绍了隐蔽调试器与恶意代码动态分析平台的关系,以及隐蔽调试器 的总体设计,并详细介绍了隐蔽调试器通信协议的设计。 第 6 章介绍了隐蔽调试器的各个模块详细设计,每个模块的流程图,以及关 键数据结构。 第 7 章对隐蔽调试器进行测试,验证本调试器的功能、性能。 最后,对隐蔽调试器进行总结,并就未来进行展望。 第 2 章 调试技术研究分析 3 第 2 章 调试技术研究分析 2.1 调试的基本概念 软件调试是软件开发和维护中非常频繁的一项任务,几乎在软件生命周期的 每个阶段,都有很多这样那样的问题需要进行调试。软件调试泛指重现软件故障, 定位故障根源,并最终解决软件问题的过程。软件调试的另一种解释就是使用调 试工具求解各种软件问题的过程,例如跟踪软件的执行过程,探索软件本身工作 原理等。 软件调试的基本过程 7: (1) 重现故障,通常是在用于调试的系统上重复导致故障的步骤,使要解决的问 题出现在被调试的系统中。 (2) 定位根源,即综合利用各种调试工具,使用各种调试手段寻找导致软件故障 的根源。通常测试人员报告和描述的是软件故障的外在症状,例如界面或执 行结果中所表现的异常;或者与软件需求和功能规约不符的地方。而这些表 面的缺欠总是一个或多个内在因素所导致的,这些内因要么是代码的行为错 误,要么是不行为的错误。 (3) 设计解决方案,即根据寻找到的故障根源,资源情况,紧迫程度等设计解决 方案。 (4) 验证方案,在目标环境中测试方案的有效性。如果问题已经解决,那么就可 以关闭问题。如果没有解决,则回到第三步调整和修改解决方案。 软件调试过程中,定位根源是非常困难,也是最关键的步骤,它是软件调试 过程中的核心和灵魂。如果没有找到故障根源,那么解决方案便是无从下手。 软件调试的基本特征 9: (1) 难度大 8,如果把定位软件错误看作是一种特别的搜索问题,那么它通常是 一个很复杂的搜索问题。为了探寻问题的根源,很多时候必须深入到被调试 模块或系统的底层,研究内部的数据结构和代码。与顶层不同,底层的数据 大多是以原始形态存在的,理解和分析的难度比顶层大。因为要在一个较大 的问题域内定位错误,所以要求调试者必须有丰富的知识,熟习问题域内的 各个软硬件模块,以及他们之间的协作方式。每个软件调试任务都有很多特 殊性,或者说很难找到两个调试任务是一样的。软件的大型化,层次的增多, 电子科技大学硕士学位论文 4 多核和多处理器系统的普及都在增加软件的调试难度。 (2) 完成时间难以估计,对一个软件错误,到底需要多久才能定位到它的根源并 解决这个问题是一个很难回答的问题。这是因为软件调试问题的问题域比较 大,调试过程中包含的随机性和不确定性很多,调试人员对问题及相关模块 和系统的熟悉程度,对调试技术的熟练程度也会加入很多不确定性。在现实 中,很多软件难题经常成为整个项目的瓶颈,是项目团队中所有人关注的焦 点。接收调试任务的工程师除了要面对技术上的难题外,还要承受很多其他 方面的压力。 (3) 关联性广泛 10,软件调试与计算机系统的硬件核心(cpu)和软件核心(操 作系统)都有着很紧密的耦合关系,与编译器也息息相关。因此,软件调试 具有广泛的关联性。软件调试的广泛关联性增加了理解软件调试过程的难度, 同时也导致软件调试技术难以在短时间内迅速发展和升级。开发一种新的调 试手段,通常需要硬件、操作系统和工具软件的支持,使软件调试技术滞后 于其他技术。 软件调试方法 6包括交互式调试、静态分析和动态检查三种。 交互式软件调试工具包括 gdb,windbg 等,是大多数程序员最常用的调试 方法。因为开发者对自己的程序非常熟悉,所以可以通过调试器来手工的找到错 误。但是,由于程序在调试器环境中运行非常缓慢,而且程序员必须手工地检查 程序的执行情况,所以,这种方法非常的耗时,而且需要大量的人工参与,因此 也要求程序员有丰富的经验。更为重要的是,它很难重现一个软件错误,因为错 误常常会在执行数小时甚至数天后发生,或者需要某一个特殊的用户输入组合才 会发生,或者与时间相关的事件导致错误发生,所以在这些情况下,交互式调试 器只能提供非常有限的帮助。 静态检查技术是对程序执行静态检查,主要通过定义泛化的故障模式、挖掘 潜在编程规则、分析代码编写的不一致行为,以及对历史故障模型的学习等手段 来实现对软件系统中潜在故障的检测。由于故障静态检测方法无法获取软件动态 运行信息,因而,对于降低故障误报率方面仍存在较大局限性。 动态监控技术主要在程序的运行过程中,检查程序执行是否违反了一些语义 规则。可以分为两类:程序员参与的监控和自动监控。程序员参与的监控主要包 括断言(assert) 和数据结构一致性检查。数据结构一致性表示一个数据结构的状态 在整个程序执行期间需要满足的性质,当然,对数据结构修改时可能会违反这种 性质,但最终修改完成后会达到一致。而传统的一致性检查需要遍历整个数据结 第 2 章 调试技术研究分析 5 构,然后确定是否满足一致性,这种方法的主要问题就是检查开销非常大,因此 不能在程序中插入大量检查,否则会显著影响程序的运行效率。大多数动态监控 技术都使用了自动监控工具。 2.2 调试器的结构 随着计算机技术的发展,调试器已成为软件开发的重要工具。由于调试器和 硬件紧密相关,和操作系统结合紧密,其开发设计因而比较复杂和困难。现代操 作系统和硬件提供了越来越强和越来越多的功能和设备来支持查错和意外处理, 加之高级编程语言的飞速发展,就要求跟踪调试器能更加有效的利用操作系统接 口和硬件功能,向用户提供高效,便利和功能强大的开发调试差错能力。跟踪调 试器是软件开发人员在开发过程中定位,去除软件错误的工具。 2.2.1 调试器基础 调试器可以中断程序的执行以检查代码,计算和编辑程序中的变量,查看寄 存器,以及查看应用程序所占用的内存空间等。 建立和终止调试会话 调试器在调试一个程序前,必须先与其建立起调试和被调试的关系,即建立 调试会话。对于用户态调试,建立调试会话的方式通常有两种,一种在调试器中 启动被调试程序,另一种在被调试程序加载后,将调试器附加到被调试程序。对 于内核态调试,建立调试会话的过程就是调试引擎被加载到操作系统中,通常是 在系统启动时完成。 终止调试会话的方式有很多种,可以直接退出调试器,此时通常被调试程序 也会终止;或者将被调试程序分离,让调试器继续运行;被调试程序也可以直接 退出。 断点和观察点 11 断点是一个信号,它通知调试器,在某个特定点上暂时将程序执行挂起。当 执行在某个断点处挂起时,我们称程序处于中断模式。进入中断模式并不会终止 或结束程序的执行。执行可以在任何时候继续。断点提供了一种强大的工具,使 调试者能够在需要的时间和位置挂起执行。与逐条指令地检查代码不同的是,可 以让程序一直执行,直到遇到断点,然后开始调试。这大大地加快了调试过程。 没有这个功能,调试大的程序几乎是不可能的。 电子科技大学硕士学位论文 6 观察点是一种特殊的断点,它区别于断点的地方在于,它不是一个可中断的 指令代码地址,而是一个内存地址,当指定地址的内存被访问时会引起中断异常。 中断异常的处理类似于断点。 单步 11 当程序处于被调试模式,且碰到断点停止执行时,单步执行使程序向前执行 一条指令后停止,并等待调试器的进一步命令。它分为两种:机器码级单步执行 和源代码级单步执行。前者使程序向前执行一条机器指令,后者则向前执行到下 一行源代码所对应的机器指令处,一行源代码可以由一条或很多条机器指令构成, 因此源码级单步更加复杂,它需要确定源码与机器码的对应关系。 程序状态信息 1112 程序状态信息包括寄存器内容,内存内容,调用堆栈上的函数名,程序创建 的线程等。程序的调试信息中有些需要符号文件支持。默认情况下,符号文件中 包含了所有的结构、函数,以及对应的源代码信息。微软提供的 windows 符号文 件去掉了源代码信息、函数参数定义和一些内部数据结构的定义。 符号文件(pdb 文件)除了包含符号外,还负责把符号和该符号所处的二进 制地址联系起来。比如有一个全局变量叫做 gbuffer,pdb 文件不仅仅记录了 gbuffer 的类型,还能让调试器找到保存 gbuffer 的内存地址。当在调试器中试图 读取某一个内存地址的时候,调试器会尝试在对应的 pdb 文件中配对,看这个 内存地址是否有符号对应。如果能够找到,调试器就可以把对应的符号显示出来, 极大程度上方便了开发人员的观察。 内存是软件工作的舞台,软件的代码必须先被读入到内存后才能被 cpu 执行。 除了少数分配在寄存器中的局部变量外,软件的大多数变量都是保存在内存中, 因此观察和操作被调试程序的内存对调试器来说非常重要。 2.2.2 调试器调试模型 调试器调试模型 12根据与目标进程关系可分为进程内调试模型、进程外调试 模型和混合调试模型。 进程内调试模型 进程内调试模型是指调试器与被调试程序工作在同一个进程的地址空间中。 如图 2-1 进程内调试模型。 第 2 章 调试技术研究分析 7 调试器 被调试程序 进 程 空 间 图 2-1 进程内调试模型 因为与被调试程序在同一个空间中,所以进程内模式有如下优势: (1) 可以直接访问被调试程序的代码和数据,速度快,实现也简单。 (2) 调试器可以复用被调试程序的某些资源和数据结构,从总体上看可以节约资 源。 (3) 在调试器代码和被调试程序代码之间可以方便地跳转或互相调用。 进程内模型的不足如下: (1) 调试器的存在和工作可能影响被调试程序的行为。 (2) 调试器的代码和数据容易遭到破坏。 (3) 因为在同一进程内,所以不利于独立控制被调试程序。例如,挂起进程时, 调试器线程也会被挂起。 在某些简单的计算机系统中,要么没有操作系统,要么操作系统是 dos 这样 的单任务操作系统,这些操作系统中的调试器通常是和被调试程序工作在同一个 空间中。dos 下的 debug 调试器也属于这种情况。调试时,debug 需要先运 行并将自己加载到内存中,然后再将被调试程序加载到内存中。某些嵌入式系统 的调试器使用的也是类似的方法。尽管在这样简单系统中不存在严格意义上的进 程,但是从地址空间的角度来看,仍然可以将这些调试器所使用的模型称为进程 内模型。 在 windows 这样的操作系统中,完全使用进程内模型的调试器是不存在的。 因为当操作系统发送调试事件时会先将被调试进程挂起,所以,如果调试器在同 一个进程内,那么调试器的代码也会被挂起,根本无法接收和处理调试事件了。 进程外调试模型 进程外调试模型是指调试器和被调试程序分别工作在各自的进程空间。如图 2-2 进程外调试模型。在进程外模型中,调试器和被调试器分别在各自的进程空 电子科技大学硕士学位论文 8 间中工作,调试器借助系统的 api 和调试子系统与被调试程序进行通信。 调试子系统和系统服务 被调试程序 调试器 操作系统 图 2-2 进程外调试模型 进程外模型具有如下优势: (1) 调试器进程使用自己的进程空间来工作,不占用被调试程序的地址空间,也 不会直接访问它的数据和代码,因此减少对被调试程序的影响。 (2) 被调试程序很难触及到调试器的代码和数据,因此调试器的代码和数据也不 容易被调试程序所破坏。 (3) 控制被调试程序时不会影响调试器进程。 进程外模型也有一下不足: (1) 两者在不同的地址空间中,调试器无法直接访问被调试程序的代码和数据, 必须借助操作系统的 api 间接读取。 (2) 调试事件是通过操作系统调试子系统的转发而送给调试器的,调试器处理后 再把处理结果返回给调试子系统。这个过程通常要经历核心态和用户态的多 次转换所以速度比较慢。 (3) 调试器和被调试程序之间很难进行代码共享和函数调用。 在 windows 系统中可以使用进程外模型实现对普通应用程序的调试。 混合调试模型 混合调试模型是将进程内调试模型和进程外调试模型放在一个调试方案中混 合使用。如图 2-3 混合调试模型图,除了有一个专门的调试器进程外,在被调试 程序的进程内也存在一部分调试器代码,通常是一个线程。调试进程和被调试进 程内的调试代码互相配合共同完成调试任务。通常将位于被调试进程中的那部分 称为调试器左端,而独立的调试器进程称为调试器右端。 第 2 章 调试技术研究分析 9 调试子系统和系统服务 被调试程序 调试器右端 操作系统 调试器 左端 进程 间通 信 图 2-3 混合调试模型图 混合调试模型同时使用了进程内模型和进程外模型,这样既引入两个模型的 优点,也同时引入了缺点,同时该模型比较复杂和工作效率不高。 内核调试模型 前面 3 种模型都是用户态调试,下面介绍一下内核态调试模型 14。内核调试 的目标是操作系统内核和内核模式下的其他代码,即要对内核模式下的代码设置 断点和使系统中断到调试器。因为内核负责整个系统的线程调度和正常运行,所 以内核中断意味着整个系统将被停下来。内核调试通常有 3 种方法:硬件调试、 双机内核调试和单机内核调试。 硬件调试在 cpu 一级实现各种调试功能,这样不需要对操作系统的内核加入 任何调试支持,而且几乎可以调试操作系统从启动到关闭的任何代码,但硬件调 试也存在如下缺点: (1) 需要比较昂贵的硬件,而且要求主板上有调试系统接头或必要的转接头,另 外,设置调试环境比较麻烦,时间较长。 (2) 适合做汇编一级的分析,难以观察进程、线程等操作系统一级的数据结构和 数据对象。 双机调试需要两台计算机,如图 2-4 双机内核调试模型。一台运行调试器, 被称为主机;另一台运行被调试的系统,称为目标机。 电子科技大学硕士学位论文 10 调试器 用户态程序 主机 ( h o s t ) 目标机器 ( t a r g e t c o m p u t e r ) 内核调 试引擎 硬件和固件 内核模块 ( 操作系统 内核 , 驱动程序等 ) 硬件和固件 内核模块 ( 操作系统 内核 , 驱动程序等 ) 图 2-4 双机内核调试模型 主机和目标机之间通过某种电缆进行通信,常见的有 1394 线缆和 usb 电缆 等。1394 线缆又称火线。支持主机到主机通信的 usb 电缆大都是上行口,所以 这样的电缆中间会有一个负责中转的芯片。随着虚拟机的流行,也可以在一台机 器(主机)上调试虚拟机(目标机)中的系统。这时使用管道虚拟出来的串口进 行通信。 主机主要是运行调试器的,因此它的操作系统可以和目标机器中操作系统不 同。目标系统中的内核调试引擎负责与调试器进行通信,报告调试事件并执行调 试器所下达的命令,例如读写内存,收集信息,设置断点等。内核调试引擎通常 是和操作系统紧密结合在一起的,例如 windows 的内核调试引擎就在内核文件中。 单机内核调试是在同一系统中进行内核调试。如图 2-5 单机内核调试模型。 第 2 章 调试技术研究分析 11 调试程序 应用程序 显示设备驱动 输入设备驱动 内核模块 ( 操作系统内核 , 驱动程序等 ) 中断处理 硬件 图 2-5 单机内核调试模型 在单机内核调试模型中,调试器的中断处理函数是位于操作系统的内核之下 的,因此可以把操作系统和调试器看作是运行在中断处理函数之上的两个系统。 当调试器没有激活时,中断处理函数会将中断和异常转发给操作系统,这样操作 系统可以正常工作。当有调试事件发生或通过热键将调试器激活时,中断处理函 数会将操作系统冻结,让调试器活动。 使用单机内核调试模型的著名调试器有 softice。 windows 系统和 windbg 调试器的本机内核调试功能只支持有限的观察功能,不可以设置断点和跟踪,因 此不属于严格意义上的单机内核调试模型。 2.3 主流调试器比较 目前主要使用的调试有 ollydbg,windbg,gdb,rr0d,immunity debugger 等。 ollydbg 这是一款提供可视化界面的 win32 汇编级的调试器。尽管你可以用 它调试任何 win32 用户态的程序,但是它的主要用户都是在破解界和病毒木马界。 因为它最大的特点是能够自动的识别出大量的系统函数及函数参数、句柄对象、 甚至直接修改二进制代码,所以如果想要分析竞争对手的特色功能的话, ollydbg 非常适合。 windbg 是微软推出的多功能调试器,提供了极为强大的调试功能,支持用 户态和内核态源码级的调试,图形化的界面,使用起来还是挺方便的。windbg 可以自动加载符号文件,它可以很轻松的调试一些平常不容易解决的问题,比如 电子科技大学硕士学位论文 12 死锁,cpu 占用率 100%,内存破坏,堆栈破坏,程序崩溃等错误。 gdb 是 gnu 软件系统中的标准调试器,此外 gdb 也是个具有移植性的调 试器,经过移植需求的调修与重新编译,如今许多的 类 unix 操作系统上都可以 使用 gdb,而现有 gdb 所能支持的编程语言有 c、c+、以及 fortran。 gdb 是一个调试器,而不像 vc 一样是一个集成环境。gdb 功能非 常强大,他除了可以实现普通商业调试器几乎所有的功能外,其中蕴涵的一些设 计思想也颇有值得学习之处。例如,它对用户接口的封装,使得人们对 gdb 加 入图形界面的支持相对容易,你可以使用一些前端工具如 xxgdb,ddd 等。他 们都有图形化界面,因此使用更方便,但它们仅是 gdb 的一层外壳。 rr0d 是 ring 0 级的调试器,可以调试用户态和核心态代码,而且它是系统独 立的,可以被安装在 linux, bsd, windows。rr0d 是设计在 x86 上运行的开源 项目。rr0d 调试器有键盘驱动和显卡驱动, hook 一些系统关键点实现调试功能。 immunity debugger 是一个功能强大的漏洞编写新途径, 分析恶意软件,反编 译二进制文件。 它建立在一个具备图形功能的坚实用户界面上,是该领域首个堆 分析工具,并且支持 pythonapi,提供了方便的可扩展性。 几种调试器之间的比较,如表 2-1 调试器比较表。 表 2-1 调试器比较表 ollydbg windbg gdb 原理 windows 的用户程序 调试支持。 windows 操作系统内 置调试支持。 hook 中断,接管系 统。 系统和平台支持 主要支持 nt 系统。 x86、itanium 和 x64 机器上的所有 nt 平 台操作系统 。 x86/windows, netbsd, linux 符号和源码支持 支持符号调试和源码 调试。强大的代码分 析能力,无符号和源 码时也能很好的进行 调试。 完美支持符号调试和 源码调试,可直接使 用微软公共符号。 支持符号调试和源码 调试。 远程调试 不支持 通过和远程工具、转 发器的配合,实现各 种灵活的远程调试方 式,以支持不同的网 络环境 。 支持 用户界面 gui 界面强大,能够 由于是双机调试,调 用户界面差,可以使 第 2 章 调试技术研究分析 13 实现大多数调试操作。 试器只是主控机上运 行的一个普通软件。 拥有 gui 界面,可以 同时进行其他应用。 用很多第三方图形界 面。 扩展性 支持脚本和插件,有 大量可用的资源。 支持脚本和插件,并 且软件包本身提供了 大量非常有用的插件。 支持性差。 电子科技大学硕士学位论文 14 第 3 章 反调试技术研究分析 反调试技术 151617是一种常见的反检测技术,因为恶意软件总是企图监视自 己的代码以检测是否自己正在被调试。为做到这一点,恶意软件可以检查自己代 码是否被设置了断点,或者直接通过系统调用等方法来检测调试器。无论是处于 分析恶意软件的目的,还是防止软件被分析的目的,了解恶意软件常用的反检测 手段 18都是很有必要的。 3.1 反调试技术简介 3.1.1 检测断点 检测断点 1920为了检测其代码是否被设置断点,恶意软件可以查找指令操作 码 0xcc(调试器会使用该指令在断点处取得恶意软件的控制权) ,它会引起一个 sigtrap。如果恶意软件代码本身建立了一个单独的处理程序的话,恶意软件也 可以设置伪断点。用这种方法恶意软件可以在被设置断点的情况下继续执行其指 令。 恶意软件也可以设法覆盖断点,例如有的病毒采用了反向解密循环来覆盖病 毒中的断点。相反,还有的病毒则使用汉明码自我纠正自身的代码。汉明码使得 程序可以检测并修改错误,但是在这里却使病毒能够检测并清除在它的代码中的 断点。 3.1.2 计算校验和 校验和 21是一种保护信息资源完整性的控制技术,例如 hash 值和循环冗余 码等。只要文件内部有一个比特发生了变化,校验和值就会改变。恶意代码首先 会生成检测数据,然后周期性地使用校验和法检测文件的改变情况。如果校验和 发生变化,那么恶意代码会假定它正在被调试,并且其代码内部已被放置断点。 3.1.3 检测调试器 在 linux 系统上检测调试器有一个简单的方法,只要调用 ptrace 即可,因为 对于一个特定的进程而言无法连续地调用 ptrace 两次以上。在 windows 中,如 果程序目前处于被调试状态的话,系统调用 isdebuggerpresent 将返回 1,否则返 第 3 章 反调试技术研究分析 15 回 0。这个系统调用检查一个标志位,当调试器正在运行时该标志位被置 1,或 者直接通过进程环境块的第二个字节就可以完成这项检查。 如果某个进程为提前运行的调试器所创建的,那么系统就会给 ntdll.dll 中的堆 操作例程设置某些标志,这些标志分别是 flg_heap_enable_tail_check、flg_heap_enable_free_check 和 flg_heap_validate_parameters。检查堆头部内诸如 forceflags 之类的 标志也能检测是否有调试器在运行。 另一种检测调试器的方法是,使用 ntqueryinformationprocess 这个系统调用。 我们可以将 processinformationclass 设为 7 来调用该函数,这样会引用 processdebugport,如果该进程正在被调试的话,该函数将返回-1。 另外,还有其他一些检测调试器的方法,如检查设备列表是否含有调试器的 名称,检查是否存在用于调试器的注册表键,以及通过扫描内存以检查其中是否 含有调试器的代码等。 另一种非常类似于 epo 的方法是,通知 pe 加载器通过 pe 头部中的线程局 部存储器(tls) 表项来引用程序的入口点。这会导致首先执行 tls 中的代码,而 不是先去读取程序的入口点。因此,tls 在程序启动就可以完成反调试所需检测。 从 tls 启动时,使得病毒得以能够在调试器启动之前就开始运行,因为一些调试 器是在程序的主入口点处切入的。 3.1.4 自修改代码 恶意软件也可以让其代码自行修改,这样的一个例子是 hdspoof。这个恶意 软件首先启动了一些异常处理例程,然后在运行过程中将其消除。这样一来,如 果发生任何故障的话,运行中的进程会抛出一个异常,这时病毒将终止运行。此 外,它在运行期间有时还会通过清除或者添加异常处理例程来篡改异常处理例程。 3.1.5 覆盖调试程序信息 一些恶意软件使用各种技术来覆盖调试信息,这会导致调试器或者病毒本身 的功能失常。通过钩住中断 int 1 和 int 3(int 3 是调试器使用的操作码 0xcc) , 恶意软件还可能致使调试器丢失其上下文。这对正常运行中的病毒来说毫无妨碍。 另一种选择是钩住各种中断,并调用另外的中断来间接运行病毒代码。 一般情况下,当没有安装调试器的时候,钩子例程被设置为 iret。v2px 使 电子科技大学硕士学位论文 16 用钩子来解密带有 int 1 和 int 3 的病毒体。在代码运行期间,会不断地用到 int 1 和 int 3 向量,有关计算是通过中断向量表来完成的。 3.1.6 解除调试器线程 我们可以通过系统调用 ntsetinformationthread 从调试器拆卸线程。为此,将 threadinformationclass 设为 0x11(threadhidefromdebugger)来调用 ntsetinformationthread,如果存在调试器的话,这会将程序的线程从调试器拆下 来。 3.1.7 加密解密 加密解密 2122可以通过各种防止调试的方式来进行。有的解密依赖于特定的 执行路径。如果这个执行路径没被沿用,比如由于在程序中的某个地方启动了一 个调试器,那么解密算法使用的值就会出错,因此程序就无法正确进行自身的解 密。 3.2 反调试工具 3.2.1 antidebuglib antidebuglib 是专门为 windows xp/2003/vista sp1 操作系统设计的软件加密 工具,它能帮助软件开发者保护他们的应用程序不被高级反编译专家和黑客破解。 应用程序经 antidebuglib 加密,它将不能被任何调试工具调试,不能被静态或 动态分析,不能从内存中 dump 出来,也不能被肆意地修改。 如果一个被加密的程序在运行时,每时每刻都要使用调试工具所必需使用的 资源,那么任何调试工具都将被禁止或者不能与被加密程序同时运行。 antidebuglib 软件加密工具运用上述原理,对软件进行保护、加密的工作。 antidebuglib 提供了一些函数,这些函数的定义格式和 c+ 运行时库的一样, 不同的是它们需要许可证才能正常运行。antidebuglib 提供了函数定制和加密宏 机制以及强有力的 pe 文件保护工具-eagle protector,能帮助软件开发者快速加 密他们的代码。 完成程序加密的工作步骤: 第 3 章 反调试技术研究分析 17 (1) 在非共享或关键代码中,将 c+的函数用 antidebuglib 的函数进行简单的 替换。 (2) 使用 antidebuglib 的函数定制功能产生具有自生代码功能的函数。 (3) 插入一些 antidebuglib 的加密宏标注出想要加密的代码段范围。 (4) 重建工程之后再用 eagle protector 将 pe 文件加密即可。 3.2.2 themida themida 拥有高级保护功能以及注册管制。它提供了最强和具伸缩性的技术, 使开发者可以安全地分发他们软件的试用版和完全版。themida 是一个强劲的保 护系统,专为了那些想保护自己的程序不被先进的逆向工程和黑客软件破解的软 件开发者而开发的。 themida 的设

温馨提示

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

评论

0/150

提交评论