内核双机调试——追踪并分析内核API函数的调用

Temperature

发布日期: 2019-09-01 09:25:57 浏览量: 98
评分:
star star star star star star star star star star
*转载请注明来自write-bug.com

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

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

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

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

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

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

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

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

输入指令:uf nt!NtQueryDirectoryFile

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

输入指令:uf nt!BuildQueryDirectoryIrp

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

输入指令:uf nt!IopSynchronousServiceTail

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

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

  1. NTSTATUS IofCallDriver(
  2. PDEVICE_OBJECT DeviceObject,
  3. __drv_aliasesMem PIRP Irp
  4. );

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

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

输入指令:bu nt!NtQueryDirectoryFile

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

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

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

输入指令:u @eip

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

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

输入指令:bp 84043fdc

输入指令:g

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

输入指令:uf @eip

输入指令:bp 83e4cd19

输入指令:g

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

输入指令:u @eip

输入指令:r

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

输入指令:dt nt!_DEVICE_OBJECT @ecx

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

输入指令:dt nt!_DRIVER_OBJECT 0x86f5e670

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

上传的附件

keyboard_arrow_left上一篇 : 深度学习 20、CNN 深度学习 19、DNN : 下一篇keyboard_arrow_right



Temperature
2019-09-01 09:26:26
追踪并分析内核API函数的调用
catastrophe
2019-09-01 10:54:59
太厉害了,谢谢大佬总结分享
飘邈仙云
2019-09-06 10:40:04
谢谢,大神分享

发送私信

不是所有的命中注定都会是你的盖世英雄

8
文章数
7
评论数
最近文章
eject