在64位Win10主机上调试32位Win7虚拟机内核,查看Win7内核中的函数调用关系,从而分析API函数实现的具体原理和流程。

一、环境配置

前提,对Win7虚拟机设置了调试的COM端口:\\.\pipe\com_1,波特率设置为115200,那么接下来就可以使用WinDbg来进行调试了。具体步骤如下所示:

首先,在Win10上“以管理员身份”运行64位的WinDbg,点击File—>Kernel Debug—>COM,波特率设置为115200,端口与上面对应\\.\pipe\com_1,并勾选pipe、Reconnect,点击确定即可。

android修改内核 手机内核修改 安卓内核调试_API

如果我们不动它,WinDbg命令窗口将会一直显示“Waiting to reconnect…”的信息!这时,我们需要点击下工具栏上“Break”按钮,让Win7系统断下来,这样我们才可以用WinDbg进行调试,输入控制指令。

android修改内核 手机内核修改 安卓内核调试_f5_02

android修改内核 手机内核修改 安卓内核调试_f5_03

接着,设置符号路径:File—>Symbol File Path—>输入:

srv*c:\symbols*https://msdl.microsoft.com/download/symbols

确定即可,这样WinDbg就会自动根据链接下载符号表到本地上。

android修改内核 手机内核修改 安卓内核调试_函数实现_04

等待一会儿,即可下载完毕,方可输入指令。

二、使用WingDbg追踪API调用流程

接下来,我们以分析内核API函数NtQueryDirectoryFile为例,介绍WinDbg调试软件的使用方法。

输入指令:uf nt!NtQueryDirectoryFile

android修改内核 手机内核修改 安卓内核调试_函数实现_05

大概可以看出,NtQueryDirectoryFile函数的实现主要是调用了nt!BuildQueryDirectoryIrp函数构造查询文件的IRP以及nt!IopSynchronousServiceTail发送IRP来实现的。为了验证我们的想法,我们继续对这两个函数进行查看。

输入指令:uf nt!BuildQueryDirectoryIrp

android修改内核 手机内核修改 安卓内核调试_f5_06

从它函数实现调用了nt!IoAllocateIrp函数可知,我们的猜想是正确的。

输入指令:uf nt!IopSynchronousServiceTail

android修改内核 手机内核修改 安卓内核调试_f5_07

从它函数实现调用了nt!IofCallDriver函数可知,我们的猜想是正确的。

nt!IofCallDriver函数定义如下所示:

NTSTATUSIofCallDriver(

PDEVICE_OBJECTDeviceObject,

__drv_aliasesMem PIRPIrp

);

该函数的功能就是将IRP发送到指定的设备对象中处理,第1个参数就是处理IRP的设备对象。

所以,接下来,我们继续用WinDbg分析上述nt!IopSynchronousServiceTail函数将IRP发给了哪个驱动设备进行处理的。

输入指令:bu nt!NtQueryDirectoryFile

输入指令:bl;查看所有断点

输入指令:g;继续往下执行

下断点,只要系统执行到nt!NtQueryDirectoryFile这个函数就会停下来。

android修改内核 手机内核修改 安卓内核调试_f5_08

输入指令:u @eip

输入指令:r;查看寄存器

android修改内核 手机内核修改 安卓内核调试_API_09

由于是对nt! NtQueryDirectoryFile这个函数下断点,所以现在停下来,指令指针eip指向的就是nt! NtQueryDirectoryFile函数的入口地址。此时,uf @eip就是反汇编nt! NtQueryDirectoryFile函数的内容。

输入指令:bp 84043fdc

输入指令:g

android修改内核 手机内核修改 安卓内核调试_函数实现_10

84043fdc就是nt!IopSynchronousServiceTail函数的入口地址,断点会自动在此处断下。我们一步步下断点,逼近最终我们需要下断点的nt!IofCallDriver函数,确保是由nt!NtQueryDirectoryFile函数内容实现调用的nt!IofCallDriver函数。

输入指令:uf @eip

android修改内核 手机内核修改 安卓内核调试_API_11

输入指令:bp 83e4cd19

输入指令:g

android修改内核 手机内核修改 安卓内核调试_函数实现_12

83e4cd19是nt!IofCallDriver函数的入口地址,WinDbg断点断下后,就会自动停在此处。

输入指令:u @eip

输入指令:r

android修改内核 手机内核修改 安卓内核调试_API_13

IofCallDriver函数是FASTCALL类型的调用约定,所以第1个参数的值存储在寄存器ecx中,即873f3508。所以,我们继续查看下该设备对象的结构数据。

输入指令:dt nt!_DEVICE_OBJECT @ecx

android修改内核 手机内核修改 安卓内核调试_函数实现_14

这时,我们边可以获取到驱动对象的地址DriverObject(0x86f5e670 _DRIVER_OBJECT),继续查看驱动对象的数据内容。

输入指令:dt nt!_DRIVER_OBJECT 0x86f5e670

android修改内核 手机内核修改 安卓内核调试_函数实现_15

由DriverName中我们可以看出,nt!NtQueryDirectoryFile是将IRP请求包发送给FltMgf驱动程序来处理的。

上传的附件