逆向工程实验报告

合集下载

逆向工程训练实验报告(3篇)

逆向工程训练实验报告(3篇)

第1篇一、实验目的本次实验旨在通过逆向工程的方法,深入了解软件的内部结构和运行机制,提高对编程语言的掌握程度,增强程序调试和问题解决的能力。

通过本次实验,我学会了如何使用逆向工程工具对程序进行解构和分析,为今后的软件开发和问题排查打下坚实的基础。

二、实验内容1. 实验环境- 操作系统:Windows 10- 逆向工程工具:OllyDbg、IDA Pro- 被分析程序:一款简单的计算器软件2. 实验步骤(1)导入程序:使用OllyDbg或IDA Pro打开被分析程序,将其加载到调试器中。

(2)分析程序入口:找到程序的入口点,即程序的开始执行位置。

(3)分析函数调用:观察程序中各个函数的调用关系,了解程序的整体结构。

(4)分析关键代码段:针对程序中的关键代码段,进行详细分析,包括变量、数据结构、算法等。

(5)分析程序流程:根据函数调用关系和关键代码段,绘制程序流程图,了解程序的执行过程。

(6)分析程序漏洞:在分析过程中,注意查找程序中可能存在的漏洞,如缓冲区溢出、整数溢出等。

(7)总结实验结果:对实验过程中发现的问题进行总结,并提出相应的解决方案。

3. 实验结果(1)程序结构:经过分析,该计算器软件主要由以下几个模块组成:- 输入模块:负责获取用户输入的数值。

- 运算模块:负责进行加、减、乘、除等运算。

- 输出模块:负责将运算结果输出到屏幕。

(2)关键代码段:在运算模块中,发现以下关键代码段:```cdouble result = 0.0;char operator = '+';while (scanf("%lf", &num) != EOF) {if (operator == '+') {result += num;} else if (operator == '-') {result -= num;} else if (operator == '') {result = num;} else if (operator == '/') {result /= num;}operator = getchar();}printf("Result: %lf\n", result);```(3)程序漏洞:在分析过程中,发现以下漏洞:- 缓冲区溢出:在读取用户输入时,未对输入长度进行检查,可能导致缓冲区溢出。

软件逆向工程实验报告

软件逆向工程实验报告

一、实验目的通过本次实验,使学生掌握软件逆向工程的基本原理、方法和工具,提高对软件程序的理解和分析能力,为后续的软件安全、漏洞挖掘和软件维护等方向的学习打下基础。

二、实验环境1. 操作系统:Windows 102. 编译器:Visual Studio 20193. 逆向工程工具:IDA Pro4. 源代码:C语言编写的简易计算器程序三、实验步骤1. 编译源代码首先,使用Visual Studio 2019将C语言编写的简易计算器程序编译成可执行文件。

2. 加载可执行文件在IDA Pro中打开编译生成的可执行文件,开始逆向工程分析。

3. 分析程序结构观察程序的结构,了解程序的入口点、函数调用关系、数据结构等。

4. 反汇编代码将程序代码反汇编,查看汇编指令和寄存器使用情况。

5. 分析函数逻辑对关键函数进行逐行分析,理解函数的功能和实现逻辑。

6. 分析变量和参数分析程序中的变量和参数,了解程序的数据处理过程。

7. 恢复源代码尝试使用IDA Pro的插件或工具将反汇编代码恢复成C语言源代码。

8. 总结实验结果总结实验过程中遇到的问题、解决方法以及实验心得。

四、实验结果与分析1. 程序结构分析通过分析程序结构,发现该简易计算器程序主要由主函数(main)和辅助函数(如:add、sub、mul、div等)组成。

主函数负责处理用户输入,调用相应的辅助函数进行计算,并将结果显示在屏幕上。

2. 函数逻辑分析以加法函数(add)为例,分析其实现逻辑如下:```add:mov eax, [ebp+8] ; 将第一个参数(被加数)的值存储在eax寄存器add eax, [ebp+12] ; 将第二个参数(加数)的值加到eax寄存器mov [ebp+16], eax ; 将计算结果存储在内存地址[ebp+16]处ret```该函数首先将第一个参数的值存储在eax寄存器中,然后将其与第二个参数的值相加,并将结果存储在内存地址[ebp+16]处。

逆向工程技术实习报告

逆向工程技术实习报告

一、实习背景随着科技的飞速发展,逆向工程技术在各个领域得到了广泛的应用。

为了提高自身的专业技能,培养实践能力,我于2021年7月至8月参加了逆向工程技术实习。

本次实习使我深入了解了逆向工程技术的原理、方法和应用,提高了我的专业技能。

二、实习目的1. 掌握逆向工程技术的理论知识,了解其发展现状和应用领域。

2. 熟悉逆向工程软件的操作,提高实际应用能力。

3. 学会逆向工程技术的数据处理和模型重建方法。

4. 培养团队协作和沟通能力。

三、实习内容1. 逆向工程原理及方法实习期间,我学习了逆向工程的基本原理和方法。

逆向工程主要包括数据采集、数据处理、模型重建和逆向设计四个阶段。

数据采集阶段,主要采用三维扫描仪获取实物模型的点云数据;数据处理阶段,对采集到的点云数据进行预处理,包括降噪、去噪、分割等;模型重建阶段,通过曲面重建技术将点云数据转换为曲面模型;逆向设计阶段,根据重建的曲面模型进行修改和优化,以满足实际需求。

2. 逆向工程软件操作实习期间,我学习了逆向工程软件的操作,包括ZBrush、Rhino、SolidWorks等。

通过实际操作,我掌握了软件的基本功能,如曲面建模、曲线建模、网格编辑等。

同时,我还学会了如何利用软件进行逆向设计,提高了我的实际应用能力。

3. 数据处理与模型重建在实习过程中,我学习了数据处理和模型重建的方法。

首先,对采集到的点云数据进行预处理,包括降噪、去噪、分割等,提高数据的准确性;然后,利用曲面重建技术将点云数据转换为曲面模型,通过编辑和优化曲面,满足实际需求。

4. 团队协作与沟通在实习过程中,我与团队成员共同完成了多个逆向工程项目。

通过团队协作,我们解决了项目中的各种问题,提高了工作效率。

同时,我还学会了与团队成员有效沟通,提高了自己的沟通能力。

四、实习成果1. 熟练掌握了逆向工程的基本原理和方法。

2. 熟练掌握了逆向工程软件的操作,提高了实际应用能力。

3. 学会了数据处理和模型重建的方法,为今后的工作打下了基础。

逆向工程实习报告

逆向工程实习报告

逆向工程实习报告一、实习背景与目的随着科技的飞速发展,逆向工程作为一种重要的技术手段,在各个领域得到了广泛的应用。

为了更好地了解逆向工程的基本原理和实际操作过程,提高自己的实践能力,我参加了为期一个月的逆向工程实习。

本次实习的主要目的是学习逆向工程的基本概念、方法和技术,通过实际操作,掌握逆向工程在实际工程中的应用,培养自己的创新意识和团队协作能力。

二、实习内容与过程1. 实习前的准备在实习开始前,我们参加了为期一周的理论学习,学习了逆向工程的基本概念、方法和技术。

通过学习,我们对逆向工程有了更深入的了解,为接下来的实习操作打下了坚实的基础。

2. 实习过程实习过程中,我们分为若干小组,每组成员共同完成一个逆向工程项目。

我所在的小组选择了一个汽车零部件作为逆向工程的对象。

(1)实物测绘我们首先对汽车零部件进行了实物测绘,通过测量得到了零部件的尺寸、形状等关键信息。

在这个过程中,我们学会了使用测量工具,如卡尺、量角器等,并掌握了测绘的基本技巧。

(2)建立三维模型根据测绘得到的数据,我们利用计算机辅助设计(CAD)软件,建立了零部件的三维模型。

在这个过程中,我们学会了如何将实物的二维信息转换为三维模型,并进行了模型的优化和调整。

(3)模型分析与改进通过对三维模型的分析,我们发现了零部件设计中存在的问题,如结构不合理、强度不足等。

针对这些问题,我们提出了改进方案,并对模型进行了修改。

(4)原型制作与测试根据改进后的三维模型,我们利用快速成型技术制作了零部件的原型。

然后,我们对原型进行了功能测试和性能测试,验证了改进方案的可行性。

三、实习收获与反思通过本次实习,我深刻体会到了逆向工程在实际工程中的重要性。

实习过程中,我们不仅学到了逆向工程的基本知识和技能,还培养了团队协作和创新意识。

同时,我也认识到逆向工程并非简单的复制和模仿,而是需要结合实际情况进行分析和改进。

四、总结总之,本次逆向工程实习让我受益匪浅。

逆向工程实习报告

逆向工程实习报告

一、实习背景随着科技的发展,逆向工程在各个领域中的应用越来越广泛。

逆向工程(Reverse Engineering)是指通过对现有产品进行剖析、分析和建模,从而获得产品设计的原理和结构信息。

为了更好地了解逆向工程的应用和发展,我选择了参加这次逆向工程实习,以期在实践中提升自己的专业技能。

二、实习内容1. 实习单位及时间实习单位:XX科技有限公司实习时间:2021年7月1日至2021年8月31日2. 实习项目及任务(1)项目名称:某型汽车零件逆向工程(2)任务描述:1. 对汽车零件进行实物测量,获取其尺寸和形状信息;2. 利用三维扫描仪对汽车零件进行扫描,获取其表面数据;3. 对扫描数据进行预处理,包括降噪、去噪等;4. 利用逆向工程软件对扫描数据进行曲面重建,生成三维模型;5. 对生成的三维模型进行优化,确保其精度和实用性;6. 将优化后的三维模型用于后续的设计和制造。

3. 实习过程(1)前期准备在实习开始前,我首先了解了逆向工程的基本原理和流程,包括实物测量、三维扫描、数据处理、曲面重建等。

同时,我还学习了相关的软件操作,如CNC加工中心、SolidWorks、UG等。

(2)实物测量在实习过程中,我参与了汽车零件的实物测量工作。

通过对零件的尺寸和形状进行测量,获取了其基本参数,为后续的三维扫描和数据处理提供了基础。

(3)三维扫描在实物测量完成后,我利用三维扫描仪对汽车零件进行了扫描。

扫描过程中,我注意了以下几点:1. 扫描仪与零件的距离和角度要适中,以保证扫描数据的准确性;2. 扫描过程中要保证扫描仪稳定,避免因抖动导致数据误差;3. 扫描时要覆盖零件的所有表面,确保数据的完整性。

(4)数据处理扫描完成后,我利用逆向工程软件对扫描数据进行预处理。

预处理主要包括降噪、去噪等操作,以提高数据的准确性。

(5)曲面重建在预处理完成后,我利用逆向工程软件对扫描数据进行曲面重建。

重建过程中,我注意了以下几点:1. 选择合适的重建算法,以保证重建结果的准确性;2. 优化重建参数,如网格密度、曲面质量等;3. 对重建结果进行修正,如填补空洞、消除噪声等。

逆向工程实验报告

逆向工程实验报告

逆向工程实验报告本次实验主要是对逆向工程的学习和应用。

逆向工程是一种通过分析一个系统或产品的结构和工作原理,来还原其设计、生产和制造的技术手段。

它的应用十分广泛,包括软件、硬件、机械、电子等领域。

在本次实验中,我们主要通过对一个简单的二进制程序的分析,来了解逆向工程的主要思想和基本技术。

实验环境和工具本次实验使用的操作系统是Windows 10,主要工具有IDA Pro和OllyDbg。

IDA Pro 是一个在逆向工程领域广泛应用的二进制代码分析工具,它可以将二进制程序转化成汇编代码,并提供调试和反汇编功能。

OllyDbg是一个Windows平台下,功能强大的动态调试器,它可以对正在运行的程序进行调试,并提供反汇编和实时内存查看等功能。

实验步骤1.运行二进制程序并观察其行为我们首先运行了一个名为CrackMe.exe的二进制程序,并观察程序的启动界面。

从启动界面可以看出该程序是一个密码破解工具,需要输入一个正确的密码才能解锁。

2.反汇编程序代码接着我们使用IDA Pro对该程序进行反汇编,将其转化成可读的汇编代码。

我们可以看到程序的逻辑十分简单,主要是读取用户输入的密码,然后与一个预先设定的密码进行比较。

如果输入的密码和预设的密码一致,则会输出一段恭喜信息。

否则则会提示密码错误并退出程序。

3.使用OllyDbg进行调试为了更加深入地了解程序的行为,我们使用OllyDbg对程序进行调试,并查看程序的状态和运行轨迹。

我们可以看到,程序在启动的时候会首先调用MessageBox函数,弹出提示用户输入密码的对话框。

如果用户输入的字符串长度不为0,则会调用与字符串比较的函数,判断输入的字符串是否正确。

如果字符串正确,则会返回到提示窗口中,输出“Congratulations! You have entered the correct password. ”的信息。

4.修改程序为了更好地理解逆向工程的应用,我们试图修改程序的行为,即尝试绕过输入正确密码的操作,直接进入正确密码的输出。

逆向工程报告

逆向工程报告

逆向工程报告一、报告概述本报告旨在对某社交软件进行逆向工程分析,其中包括该软件的功能模块、技术实现原理及其脆弱性。

该社交软件的代码基于Java开发,其中主要涉及了Socket通信、Java反射、消息队列等技术,同时也涉及到数据备份和恢复等方面。

二、软件分析1. 功能模块该社交软件的功能模块主要包括用户登录、添加好友、消息发送等。

其中用户登录模块采用了加密传输方式,但是由于弱加密算法,导致该模块存在安全风险。

添加好友模块采用了Java反射技术,使得该模块可以绕过权限检查。

消息发送模块采用了消息队列技术,提高了消息传递效率。

2. 技术实现原理该软件代码基于Java开发,采用了许多Java技术,如Socket通讯、Java反射等。

其中,Socket通讯是该软件实现客户端和服务器端通信的重要技术手段,通过TCP协议实现通讯过程中数据的可靠传输。

Java反射是该软件实现动态加载类和方法的基础技术,其主要实现原理是通过Class.forName()方法加载类,然后通过Class对象的getMethod()方法获取方法,再通过invoke()方法调用方法。

3. 脆弱性分析在逆向工程分析中,我们还发现该软件存在一些安全脆弱性,如用户登录模块采用的弱加密算法,导致用户密码被盗取的风险较高;添加好友模块采用的Java反射技术,存在权限绕过和代码注入的风险;消息发送模块采用的消息队列技术,如果没有进行适当的身份验证和消息加密,可能会导致消息泄露和篡改的风险。

三、结论与建议通过对该社交软件进行逆向工程分析,我们得出了该软件的功能模块、技术实现原理及其脆弱性等关键信息。

针对脆弱性问题,建议开发人员应加强对用户密码的加密处理,合理使用Java反射技术,确保代码的安全性;同时对消息传递进行适当的身份验证和消息加密,以保证数据的机密性和完整性。

逆向加工实训报告

逆向加工实训报告

一、实训目的本次逆向加工实训旨在通过实际操作,加深对逆向工程和加工原理的理解,提高动手实践能力,掌握逆向工程的基本流程和关键技术。

通过实训,使学生能够熟练运用逆向工程软件进行数据采集、处理和建模,并能够运用加工设备完成产品的加工制作。

二、实训环境实训地点:XXX学院机械工程实验室实训设备:逆向工程扫描仪、逆向工程软件、三维建模软件、CNC加工中心、加工工具等实训时间:2023年X月X日至2023年X月X日三、实训原理逆向工程(Reverse Engineering,简称RE)是指通过分析实物产品的结构、尺寸、功能等信息,重建其三维模型和设计参数的过程。

逆向加工是逆向工程的重要组成部分,它将逆向工程得到的三维模型进行加工,以实现产品的实体化。

四、实训过程1. 数据采集:使用逆向工程扫描仪对实物产品进行扫描,采集其表面点云数据。

2. 数据处理:将采集到的点云数据进行预处理,包括去噪、滤波、分割等,以提高数据质量。

3. 三维建模:利用逆向工程软件将处理后的点云数据转化为三维模型,进行表面光顺、简化等操作。

4. 模型修正:根据实际情况对三维模型进行必要的修正,如去除模型中的多余部分、调整尺寸等。

5. CNC编程:使用CNC编程软件根据三维模型生成加工路径和刀具轨迹。

6. 加工制作:将CNC编程生成的加工路径和刀具轨迹导入CNC加工中心,进行产品加工。

五、实训结果1. 成功采集并处理了一款实物产品的表面点云数据。

2. 利用逆向工程软件重建了该产品的三维模型,并对模型进行了修正。

3. 生成了CNC编程文件,并成功导入CNC加工中心。

4. 完成了产品的加工制作,达到了预期效果。

六、实训总结1. 通过本次实训,掌握了逆向工程的基本流程和关键技术,提高了动手实践能力。

2. 了解了逆向工程在产品研发、维修、改进等方面的应用。

3. 发现了在逆向工程过程中存在的问题,如数据采集精度、数据处理效率等,为今后的实训和实际应用提供了改进方向。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

电子科技大学信息与软件工程学院逆向工程实验报告姓名:XXX学号:201852090710指导教师:何兴高一、题目基于MBR的Bootkit的逆向分析二、题目梗概利用逆向工程技术,从可运行的程序系统出发,运用解密、反汇编、系统分析、程序理解等多种计算机技术,对软件的结构、流程、算法、代码等进行逆向拆解和分析,推导出软件产品的源代码、设计原理、结构、算法、处理过程、运行方法及相关文档等。

随着用户需求的复杂度越来越高,软件开发难度不断上升,快速高效地软件开发已成为项目成败的关键之一。

Bootkit是一种比较旧的技术,这个概念最早是在2005年由eEye Digital 安全公司在他们的“BootRoot"项目中提及的。

Rootkit是一种特殊的恶意软件,它的功能是在安装目标上隐藏自身及指定的文件、进程和网络链接等信息,比较多见到的是Rootkit一般都和木马、后门等其他恶意程序结合使用。

Rootkit通过加载特殊的驱动,修改系统内核,进而达到隐藏信息的目的。

rootkit并不一定是用作获得系统root访问权限的工具。

实际上,rootkit是攻击者用来隐藏自己的踪迹和保留root访问权限的工具。

通常,攻击者通过远程攻击获得root 访问权限,或者首先密码猜测或者密码强制破译的方式获得系统的访问权限。

进入系统后,如果他还没有获得root权限,再通过某些安全漏洞获得系统的root 权限。

接着,攻击者会在侵入的主机中安装rootkit,然后他将经常通过rootkit 的后门检查系统是否有其他的用户登录,如果只有自己,攻击者就开始着手清理日志中的有关信息。

通过rootkit的嗅探器获得其它系统的用户和密码之后,攻击者就会利用这些信息侵入其它的系统。

所有在开机时比Windows内核更早加载,实现内核劫持的技术,都可以称之为Bootkit。

Bootkit主要是利用其内核准入和开机过程的隐身技术,在功能上无异于Rootkit。

传统的Rootkit利用系统启动时提升权限,而Bootkit主要被安置在外设的主引导扇区(也有放于Ntldr 文件、BIOS中的Bootkit)并驻留在整个系统的启动过程。

Bootkit属于Rootkit 的一种,但它却是更加高级的Rootkit,因为其存放于主引导扇区、启动文件之类地方,在操作系统启动之前驻留内存并内核运行之前劫持内核。

MBR即主引导扇区(Master Boot Record)是装有Linux系统的硬盘的第一个扇区,即C/H/S地址的0柱面0磁头1扇区。

这个扇区是系统开启时必须访问的扇区,记录本磁盘相关信息以及硬盘各个分区的大小和信息。

本实验旨在对基于MBR的BootKit的启动模块代码,也就是感染MBR后第1、第61、62扇区的模块进行逆向分析。

三、涉及知识点在本项目中,逆向涉及到的知识点有以下几个,分别是:●保护模式下的汇编语言●实模式下的汇编语言●BIOS中断服务●多级HOOK技术●计算机系统内核原理●NTLDR(系统加载程序,用于装载Windows xp 2003等版本)四、涉及工具在本项目中,涉及到的工具有以下几个,分别是:●IDA(主要静态分析Bootkit)、●Windbg●Bochs(主要是用于动态调试这个Bootkit)●Winhex工具五、源程序见附件六、过程及分析首先介绍一下这个样本黑盒后的症状:感染MBR(感染的具体形式为:真正的MBR被挪到了第63个扇区,Bootkit启动模块的代码在第1、61、62个扇区。

)直接在硬盘上写入了一个驱动(这种写入不是普通的在磁盘上释放一个文件,在系统的文件系统里面是看不见这个驱动的,在实验的虚拟机上是写入了未分区的空间中,通过Winhex工具可以查看到);生成一个DLL并运行然后10分钟后自动关机。

第1、61、62个扇区的代码中,第1个扇区的代码是实模式下的汇编语言,第61、62个扇区是保护模式下的汇编语言,所以在用IDA分析的时候要进行选择,至于这三个扇区的代码直接用Winhex截取出来然后进行逆向分析。

这个Bootkit的启动代码主要用了三级HOOK,分别为HOOK INT13h、HOOK NTLDR的特征码,HOOK内核的特征码。

下面将主要分析这三级HOOK的行为。

1、第一级HOOK(HOOK INT13h)seg000:7C35 @HOOK_INT13H:seg000:7C35 xor bx, bxseg000:7C37 mov eax, [bx+4Ch]seg000:7C3B mov es:73h, eaxseg000:7C40 mov word ptr [bx+4Ch], 66h ; 'f'seg000:7C45 mov word ptr [bx+4Eh], esseg000:7C48 push esseg000:7C49 push 4Dh ; 'M'seg000:7C4C retf上面的代码实现了HOOK INT13h ,即HOOK了BIOS的磁盘中断服务。

下面为HOOK INT13h后的主要代码,其中主要是搜索了NTLDR文件的特征码,特征码为:SignatureCode is : 8B F0 mov esi,eax85 F6 test esi,esi74 21 jz $+23h80..............这段代码运行后内核和BootDriver已经加载到内存中,当找到这段代码以后就对这段特征码进行HOOK,HOOK的过程用到了CALL NEAR[offset32],即相对的寻址方式。

这个HOOK利用了eEye BootRoot 里面的技术。

上面的主要代码是在第一个扇区中的代码实现的,是实模式下执行的代码。

2、第二级HOOK(HOOK NTLDR的特征码)这里主要为HOOK了NLTDR以后代码执行的过程,第二个HOOK的代码主要是在第61个扇区中实现的。

首先第二个HOOK会去搜索NTLDR中的特征码,搜索这个特征码是为了定位到BlLoaderBlock这个变量,这个变量中包括了很多有用的信息,如内核和BootDriver等等。

搜索过程为下图:图1当搜索到以后就可以定位到BlLoaderBlock,然后[[BlLoaderBlock]+0]就正好为模块链表的指针。

这个指针所指向的结构的一些主要成员为:+00h LIST_ENTRY module list links+08h [10h] 不太了解+18h PTR image base address+1Ch PTR module entry point+20h DWORD size of loaded module in memory+24h UNICODE_STRING full module path and file name+2Ch UNICODE_STRING module file name下图的代码就是利用上面介绍BlLoaderBlock的结构定位到了内核的基址。

图2当定位到内核以后,Bootkit将搜索内核的特征代码,然后对内核进行HOOK。

搜索的内核代码为:push 4Bh 6Ah 4Bhpush 19h 6Ah 19hcall InbvSetProgressBarSubset(x,x) E8 E8 DD E6 FFpush [ebp+var_470] FF B5 90 FB FF FF call IoInitSystem(x) E8 53 E6 FF FF 当搜索到了上面的内核特征码后,就对内核的call IoInitSystem(x)进行了HOOK,这个搜索特征码的过程如下图所示:图3当搜索到特征码后接下就会对Kernel的特征码进行HOOK,HOOK的特征码为:call IoInitSystem(x) E8 53 E6 FF FF 修改的地方为后面四个字节的偏移量。

通过这个HOOK Bootkit就能在内核运行的时候再次获得执行的机会。

下面的代码便是对内核进行HOOK的操作:图4从上图的代码看出,在这个过程中Bootkit会将HOOK内核的代码挪到内存中内核映像文件的末尾位置,大小正好为200个字节。

上面便是Bootkit的第二个HOOK所完成的工作。

3、第三级HOOK(HOOK Kernel的特征码)当HOOK Kernel后的代码运行时,主要的代码是在第62个扇区中。

其中的代码有些复杂,这里只介绍主要的执行流程。

这个HOOK代码主要的功能实现了加载并运行一个驱动程序。

第三级HOOK中首先是通过内核的输出表定位到ExAllocatePool函数,搜索这个内核的函数是通过Hash的比较。

当找到这个函数的地址以后就调用这个函数分配一片内存池,然后把下面的代码拷贝到这份内存中并在内存池中执行Bootkit后面的代码。

上面这个过程具体实现如下入所示:图5接下来Bootkit会把调用之前被HOOK的IoInitSystem(x)函数,即去Call这个函数,让IO去初始化系统。

当执行完这步操作以后,则会在内核中搜索和多函数,如NtReadFile、NtOpenFile、NtClose等函数,调用这些函数主要是为了能够把驱动直接从磁盘上读出来,然后运行。

具体过程为如下。

首先调用NtOpenFile打开磁盘,并定位那个驱动的位置。

过程为:图6接下来调用NtReadFile函数,把驱动从磁盘上读到内存中,过程为下图所示:图7当把驱动读入到内存以后Bootkit还有一个将驱动进行内存对齐的操作。

具体过程为下图所示:图8当对驱动进行内存对齐以后,就开始根据偏移定位到驱动的入口地址,然后运行驱动程序,具体过程下图所示为:图9当驱动执行完毕后,则把控制权交还给Bootkit的启动代码,Bootkit最后做的善后处理为:把正在运行的内存池里面的代码清零,然后把控制权交给操作系统的内核,让内核继续进行计算机的启动过程。

以上便是这个Bootkit样本的启动模块代码执行流程。

最后附上一个图,下图为HOOK Kernel处留下的痕迹。

图10Call IoInitSystem(x)被替换成了Call 806cee00,而806cee00地址处的代码是Bootkit第三个HOOK的代码。

七、心得逆向工程是一个实践性很强的学科,通过在线课程的学习以及亲手上机实验使得我在本次课程中收获很大,通过对程序的逆向工程的分析,本人对计算机技术有了更加深刻的认识。

感谢何兴高老师在课堂上的谆谆教诲,更感谢何老师在休息时间对我们的耐心讲解。

相关文档
最新文档