32位/64位WINDOWS驱动之windbg双机调试栈溢出问题分析解决

文章描述了一个在32位/64位Windows驱动中,通过PID获取进程名时引发的栈溢出问题。开发者使用Windbg进行调试,发现死循环和递归导致的堆栈溢出,根源在于GetProcessName2函数。解决方案是避免使用ZwOpenProcess。
摘要由CSDN通过智能技术生成

32位/64位WINDOWS驱动之windbg双机调试栈溢出问题分析解决

驱动层 driverentry21.c

添加一个控制码

#define 通过PID获取进程名 CTL_CODE(FILE_DEVICE_UNKNOWN,0x809,METHOD_BUFFERED,FILE_ANY_ACCESS) //读写测试

在这里插入图片描述

控制开关里面添加代码如下:

else if (控制码 == 通过PID获取进程名)
		{
			IRP_IO_通过PID获取进程名(pirp);
			return STATUS_SUCCESS;
			break;
		}

在这里插入图片描述

添加一个函数

void IRP_IO_通过PID获取进程名(PIRP pirp)
{
	PIO_STACK_LOCATION irpStackL = IoGetCurrentIrpStackLocation(pirp);//获取应用层传来的参数;
	UINT32* 缓冲区 = (UINT32*)(pirp->AssociatedIrp.SystemBuffer);//和IRP有关的系统缓冲区
	if (缓冲区)
	{
		//int*p = (int*)缓冲区;
		UINT32 PID = 缓冲区[0];

		const char*返回进程名 = GetProcessName2(PID);//16
		//写入返回数值
		if (返回进程名)
		{
			memcpy_s(缓冲区, 16, 返回进程名, 16);
		}
		
		pirp->IoStatus.Status = STATUS_SUCCESS;
		pirp->IoStatus.Information = 16;//返回给DeviceIoControl中的倒数第二个参数lpBytesReturned
		IoCompleteRequest(pirp, IO_NO_INCREMENT);//调用方已完成所有I/O请求处理操作,并且不增加优先级
	}
	irpStackL;
}

在这里插入图片描述

进程保护.h声明一下

const char* GetProcessName2(HANDLE ProcessId);//功能:进程ID,进程名称

在这里插入图片描述

MFC应用层

添加控制码:

#define 通过PID获取进程名 CTL_CODE(FILE_DEVICE_UNKNOWN,0x809,METHOD_BUFFERED,FILE_ANY_ACCESS) //读写测试

在这里插入图片描述

添加一个按钮 按钮名称 :获取进程名 双击按钮触发事件

代码如下:

void CD002122MFCDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);//窗口数据更新到变量

	DWORD dwRetSize = 0;//返回字节数

	char buftest[256];
	sprintf_s(buftest, "yjx:EXE R3 读写测试 控制码=%X\n", 读写测试);
	OutputDebugStringA(buftest);

	//int 传入数据[3] = {3,7,8};

	UINT32 传入数据 = m_PID;// { 3, 6, 5 };

	//数组示例
	char OutBuf[32] = { 0 };//输出缓冲区
	DeviceIoControl(
		DeviceHandle,//CreateFile打开驱动设备 返回的句柄
		通过PID获取进程名,//控制码 CTL_CODE

		&传入数据,//输入缓冲区指针
		sizeof(传入数据),//输入缓冲区大小

		&OutBuf,//输出缓冲区
		sizeof(OutBuf),//返回缓冲区大小

		&dwRetSize, //返回字节数
		NULL);
	::MessageBoxA(0, OutBuf, "获取进程名",MB_OK);
}

在这里插入图片描述
虚拟机调试结果
在这里插入图片描述
const char*目标进程名 = GetProcessName2(dwProcessId);//要保护是这个进程名 这个改为GetProcessName2时出现蓝屏,蓝屏中给我们生成了dump文件
在这里插入图片描述
在文件夹C:\Windows\minidump里面
在这里插入图片描述
我们把他复制出来或者在虚拟机里面装Windows10版本1709适用于Windows10版本1709的WDK
用WinDbg (X64)来分析-附加DUMP文件
在这里插入图片描述
打开的很慢大概要4-5分钟慢慢等

在这里插入图片描述点击!analyze -v 点一次即可,比较慢

在这里插入图片描述
从上可以看出 堆栈溢出
STACK_OVERFLOW: Stack Limit: ffff840a470da000. Use (kF) and (!stackusage) to investigate stack usage.

OpenProcess,ZwOpenProcess/NtOpenProcess
NtOpenProcess->my_pre_callback->GetProcessName2->NtOpenProcess //死循环//递归//栈溢出

分析结果:形成了死循环导致堆栈溢出,不使用ZwOpenProcess即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

a756598009

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值