android 内核调试 双机,技术分享 - 内核双机调试——追踪并分析内核API函数的调用...

在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,点击确定即可。

4219c946820442bf6a64edf22adc0e9f.png

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

fc2667a0eb13f2a4a4eefbf8d022dd79.png

8aae7258999997e8a77f22701158e80a.png

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

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

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

41eb7cfa7a831b659bc0b9afb017aa9b.png

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

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

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

输入指令:uf nt!NtQueryDirectoryFile

4601605c5cdb00d67e7773d3ee8f826a.png

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

输入指令:uf nt!BuildQueryDirectoryIrp

953c9f1c317881a2d6c354496e5247e4.png

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

输入指令:uf nt!IopSynchronousServiceTail

d9328f1298569c788234babe78025be1.png

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

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

NTSTATUSIofCallDriver(

PDEVICE_OBJECTDeviceObject,

__drv_aliasesMem PIRPIrp

);

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

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

输入指令:bu nt!NtQueryDirectoryFile

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

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

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

f60b4eb9fcb84dd1908e39db46402b00.png

输入指令:u @eip

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

e3c38998e24b4aefc9e1ae5f09fe738b.png

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

输入指令:bp 84043fdc

输入指令:g

0904e67fb9d6d200816166af887f8359.png

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

输入指令:uf @eip

7a8e68938da69771ac67e277c8fd2cc4.png

输入指令:bp 83e4cd19

输入指令:g

f4c066dc7d182d5ab0a93353535f905f.png

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

输入指令:u @eip

输入指令:r

075ce9f8cf016af2613756646dea6541.png

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

输入指令:dt nt!_DEVICE_OBJECT @ecx

1692e62356cf2eeae7e8e2d6341b6fac.png

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

输入指令:dt nt!_DRIVER_OBJECT 0x86f5e670

107ab1513ec76192e0d6f9d0be6f2bbc.png

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

上传的附件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值