首页
社区
课程
招聘
[分享]调戏:用CreateFile通信
发表于: 2014-4-11 07:08 9393

[分享]调戏:用CreateFile通信

2014-4-11 07:08
9393
在这个驱动随便什么人都可以写的时代里。
DeviceIoControl通信肯定是被人用烂了的。
用hook 通信么,又不支持x64系统。
Callback通信又多写很多代码。
WMI通信代码写起来很烦人,Flt通信代码也很冗长。

于是猜测是不是可以用CREATEFILE来通信呢?


观察ZwCreateFile的参数,发现有一个EA参数,这个东西是一个可以自己改变大小的结构体。

NTSTATUS ZwCreateFile(
  _Out_     PHANDLE FileHandle,
  _In_      ACCESS_MASK DesiredAccess,
  _In_      POBJECT_ATTRIBUTES ObjectAttributes,
  _Out_     PIO_STATUS_BLOCK IoStatusBlock,
  _In_opt_  PLARGE_INTEGER AllocationSize,
  _In_      ULONG FileAttributes,
  _In_      ULONG ShareAccess,
  _In_      ULONG CreateDisposition,
  _In_      ULONG CreateOptions,
  _In_opt_  PVOID EaBuffer,
  _In_      ULONG EaLength
);


EA的基础结构是
typedef struct _FILE_FULL_EA_INFORMATION {
	ULONG NextEntryOffset;
	UCHAR Flags;
	UCHAR EaNameLength;
	USHORT EaValueLength;
	CHAR EaName[1];
} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;


于是可以写出一个IRP_MJ_CREATE处理根据EA来进行处理,这样通信代码就很简单了。
驱动的代码写起来很简单了。
NTSTATUS
	DrvCreate(
	IN PDEVICE_OBJECT DeviceObject,
	IN PIRP Irp
	)
{
	PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp);
	NTSTATUS ntStatus = STATUS_SUCCESS;
	PFILE_FULL_EA_INFORMATION StartEA, ea;

	StartEA = (PFILE_FULL_EA_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
	if ( StartEA != NULL )
		ntStatus = ProcessEA(StartEA);
	

	Irp -> IoStatus.Status = ntStatus;
	Irp -> IoStatus.Information = 0;

	IoCompleteRequest ( Irp, IO_NO_INCREMENT );

	return ntStatus;
}


应用层填充起来也很容易:
	CHAR Buffer[sizeof(FILE_FULL_EA_INFORMATION) + CMD_LENGTH + sizeof(CMD_STRING)] = {0};
	PFILE_FULL_EA_INFORMATION Ea = (PFILE_FULL_EA_INFORMATION)&Buffer;
	PCMD_CONTEXT cmd;
Ea->NextEntryOffset = 0;
	Ea->Flags = 0;
	Ea->EaNameLength = CMD_LENGTH;
	RtlCopyMemory(Ea->EaName, CMD_STRING, CMD_LENGTH);
	Ea->EaValueLength = sizeof(CMD_CONTEXT);	
	cmd = (PCMD_CONTEXT)&Ea->EaName[Ea->EaNameLength+1];
	cmd->dwKey = dwCmd;


剩下的东西很简单了,无非就是用ZwCreateFile通信了~
具体完整事例代码见附件了。
CreateEADemo.zip

抛弃DeviceIoControl之后是不是世界很清凉呢?

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (21)
雪    币: 6
活跃值: (74)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不错好文章~!
2014-4-11 08:13
0
雪    币: 11
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
hook 通信么,又不支持x64系统。
2014-4-11 08:35
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
给力啊,不用随时占用驱动句柄了。
2014-4-11 09:19
0
雪    币: 130
活跃值: (3483)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
hidetool 用的 ZwTerminateProcess 通信
2014-4-11 09:40
0
雪    币: 33
活跃值: (653)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
mark...
2014-4-11 09:41
0
雪    币: 1907
活跃值: (2075)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7

通信的话,SSDT里面还有几个函数可以有通信功能的。
2014-4-11 09:51
0
雪    币: 8833
活跃值: (2419)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
8
HOOK就没意义了~~

我这种EA附加数据模型是M$官方支持的~
2014-4-11 09:56
0
雪    币: 239
活跃值: (133)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
老V,这不符合你身份。
2014-4-11 10:08
0
雪    币: 8833
活跃值: (2419)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
10
这东西很古老~~好多人都不知道了~~有需求的时候,我才发现的~
2014-4-11 10:21
0
雪    币: 281
活跃值: (33)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
真早~~~  我都起不来这么早

IRP、iostack里面有的结构都能通信
2014-4-11 10:49
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
这大早上的,老V是不是在地球那边发的贴啊。
2014-4-11 10:53
0
雪    币: 21
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
遇到不少通过createfile交流的外挂
2014-4-11 10:55
0
雪    币: 69
活跃值: (252)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wmg
14
话说V大这是神马需求非得走createfile通信呢?
2014-4-11 11:12
0
雪    币: 8833
活跃值: (2419)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
15
产品的奇葩的需求~
2014-4-11 11:18
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
问题是效率。。。。。createfile需要string parse的。。。。。。要求不高的话浪费这么点时间到也无所谓。。。效率要求高的场合,这个不适用
2014-4-11 11:41
0
雪    币: 8833
活跃值: (2419)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
17
高效率的地方都是直接驱动插APC回来了~
2014-4-11 11:48
0
雪    币: 346
活跃值: (129)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
18
这东西确实挺早就人有些过文章了
支持一下
2014-4-11 11:56
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
19
用内存映射的说
2014-4-11 13:13
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
@mark
2014-4-11 14:16
0
雪    币: 341
活跃值: (85)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
21
mark
2014-4-11 15:39
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
mark///
2014-4-11 23:43
0
游客
登录 | 注册 方可回帖
返回