首页
社区
课程
招聘
未解决 [求助]windows内核驱动通信问题 50雪币
发表于: 2024-10-7 18:23 1908

未解决 [求助]windows内核驱动通信问题 50雪币

2024-10-7 18:23
1908

以下是驱动程序的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDriver,PIRP pIrp)
{
NTSTATUS status = STATUS_INVALID_DEVICE_REQUEST;
PIO_STACK_LOCATION pIrpStack;
ULONG uIoControlCode;
PVOID pIoBuffer;
ULONG uInSize;
ULONG uOutSize;
 
ini
 
复制
// 获得IRP里的关键数据
pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
 
// 获取控制码
uIoControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
 
// 输入和输出的缓冲区(DeviceIoControl的InBuffer和OutBuffer都是它)
pIoBuffer = pIrp->AssociatedIrp.SystemBuffer;
 
// EXE发送传入数据的BUFFER长度(DeviceIoControl的nInBufferSize)
uInSize = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;
 
// EXE接收传出数据的BUFFER长度(DeviceIoControl的nOutBufferSize)
uOutSize = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;
 
// 对不同控制信号的处理流程
switch (uIoControlCode)
{
case IOCTL_IO_LyShark:
{
DWORD dw = 0;
 
stylus
 
复制
// 得到输入参数
memcpy(&dw, pIoBuffer, sizeof(DWORD));
DbgPrint("[+] hello lyshark \n");
// 对输入参数进行处理
dw++;
// 设置输出参数
memcpy(pIoBuffer, &dw, sizeof(DWORD));
// 返回通信状态
status = STATUS_SUCCESS;
break;
}
pIrp->IoStatus.Status = status;
pIrp->IoStatus.Information = uOutSize;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return status;
}
// 设定DeviceIoControl的lpBytesReturned的值(如果通信失败则返回0长度)
if (status == STATUS_SUCCESS)
pIrp->IoStatus.Information = uOutSize;
else
pIrp->IoStatus.Information = 0;
// 设定DeviceIoControl的返回值是成功还是失败
pIrp->IoStatus.Status = status;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return status;
}

以下是用户程序代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main(int argc, char argv[])
{
HANDLE hDevice = CreateFileA("\.\LySharkDriver", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hDevice == INVALID_HANDLE_VALUE)
{
CloseHandle(hDevice);
return 0;
}
// 发送控制信号
// input = 发送数据 output = 接受数据 ref_len = 数据长度
DWORD input = 100, output = 0, ref_len = 0;
DeviceIoControl(hDevice, IOCTL_IO_LyShark, &input, sizeof(input), &output, sizeof(output), &ref_len, 0);
printf("输出: %d \n", output);
printf("输入: %d \n", input);
system("pause");
CloseHandle(hDevice);
return 0;
}

用户代码与此驱动交互

1
2
3
4
将结果为
输出: 101
输入: 100
请按任意键继续. . .

用户程序中input 和output 位于不同的内存空间,但是传递到内核时,输入和输出缓冲区都是pIoBuffer = pIrp->AssociatedIrp.SystemBuffer,那么当修改这一块内存空间的值时,用户态的input 和output都应该发生变化,为什么一个变了一个没变


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 784
活跃值: (1439)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
在内核申请了一块新的 内存空间(大小为输入或输出缓冲区的较大值) 把输入缓冲区得内容COPY过去了 在返回得时候 根据 pIrp->IoStatus.Information 的大小在拷贝内容到输出缓冲区 
2024-10-8 00:24
1
雪    币: 634
活跃值: (1203)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
dw是一个新的空间吧,改的是dw,没影响到pIrp->AssociatedIrp.SystemBuffer。你dw改成指针,然后指向pIrp->AssociatedIrp.SystemBuffer,再改*dw试试。
2024-10-8 11:59
1
游客
登录 | 注册 方可回帖
返回
//