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即可。