驱动相关
sys
sys也可以认为是一种dll(动态链接库) 其entry_point实际上就是DriverEntry,只不过内部进行了相应的注册和一些函数回调绑定
DriverEntry
1 | NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) { |
IoCreateDevice
1
2
3
4
5
6
7
8
9 NTSTATUS IoCreateDevice(
[in] PDRIVER_OBJECT DriverObject,//驱动对象
[in] ULONG DeviceExtensionSize,//驱动需要的额外空间
[in, optional] PUNICODE_STRING DeviceName,//驱动名
[in] DEVICE_TYPE DeviceType,//驱动类型
[in] ULONG DeviceCharacteristics,//
[in] BOOLEAN Exclusive,//
[out] PDEVICE_OBJECT *DeviceObject//输出对应的驱动对象
);
IoCreateSymbolicLink
用于创建跟device的链接,等效于device name(device name只能在内核中调用,所以在用户态调用时需要创建SymbolicLink)
1
2
3
4 NTSTATUS IoCreateSymbolicLink(
[in] PUNICODE_STRING SymbolicLinkName,
[in] PUNICODE_STRING DeviceName
);
majorfunction
1 | _Use_decl_annotations_ |
IRP结构
IRP请求分类
名称 描述 调用者 值 IRP_MJ_CREATE 请求句柄 CreateFile 0x00 IRP_MJ_CREATE_NAMED_PIPE 0x01 IRP_MJ_CLEANUP CloseHandle 0x12 IRP_MJ_CLOSE 关闭句柄 CloseHandle 0x02 IRP_MJ_READ 从设备输入数据 ReadFile 0x03 IRP_MJ_WRITE 输出数据到设备 WriteFile 0x04 IRP_MJ_DEVICE_CONTROL 控制操作(利用IOCTL) DeviceIoControl 0x0e IRP_MJ_INTERNAL_DEVICE_CONTROL 控制操作(内核操作) 0x0f IRP_MJ_QUERY_INFORMATION 得到文件的长度 GetFileSize 0x05 IRP_MJ_SET_INFORMATION 设置文件长度 SetFileSize 0x06 IRP_MJ_FLUSH_BUFFERS 写入或者丢弃缓冲区 FlushFileBuffers/FlushConsoleInputBuffer/PurgeComm 0x09 IRP_MJ_SHUTDOWN 系统关机 InitiateSystemShutdown 0x10
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
相关类型定义
DEVICE_TYPE
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
_DEVICE_OBJECT
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 typedef struct _DEVICE_OBJECT {
CSHORT Type;
USHORT Size;
LONG ReferenceCount;
struct _DRIVER_OBJECT *DriverObject;
struct _DEVICE_OBJECT *NextDevice;
struct _DEVICE_OBJECT *AttachedDevice;
struct _IRP *CurrentIrp;
PIO_TIMER Timer;
ULONG Flags;
ULONG Characteristics;
__volatile PVPB Vpb;
PVOID DeviceExtension;
DEVICE_TYPE DeviceType;
CCHAR StackSize;
union {
LIST_ENTRY ListEntry;
WAIT_CONTEXT_BLOCK Wcb;
} Queue;
ULONG AlignmentRequirement;
KDEVICE_QUEUE DeviceQueue;
KDPC Dpc;
ULONG ActiveThreadCount;
PSECURITY_DESCRIPTOR SecurityDescriptor;
KEVENT DeviceLock;
USHORT SectorSize;
USHORT Spare1;
struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
PVOID Reserved;
} DEVICE_OBJECT, *PDEVICE_OBJECT;
_DRIVER_OBJECT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 typedef struct _DRIVER_OBJECT {
CSHORT Type;
CSHORT Size;
PDEVICE_OBJECT DeviceObject;
ULONG Flags;
PVOID DriverStart;
ULONG DriverSize;
PVOID DriverSection;
PDRIVER_EXTENSION DriverExtension;
UNICODE_STRING DriverName;
PUNICODE_STRING HardwareDatabase;
PFAST_IO_DISPATCH FastIoDispatch;
PDRIVER_INITIALIZE DriverInit;
PDRIVER_STARTIO DriverStartIo;
PDRIVER_UNLOAD DriverUnload;
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
} DRIVER_OBJECT, *PDRIVER_OBJECT;
程序调用
写入注册表
Windows学习001:CurrentControlSet和ControlSet001 - 知乎 (zhihu.com)
安装驱动程序的本质就是向注册表内写入对应的值
比如
1 | RegCreateKeyExA(//创建指定的注册表项 |
RegCreateKeyExA
用于创建注册表项
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 LSTATUS RegCreateKeyExA(
[in] HKEY hKey,
/**
注册表项的句柄也算是注册表路径
HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
**/
[in] LPCSTR lpSubKey,//子路径
DWORD Reserved,
[in, optional] LPSTR lpClass,
[in] DWORD dwOptions,
[in] REGSAM samDesired,
[in, optional] const LPSECURITY_ATTRIBUTES lpSecurityAttributes,
[out] PHKEY phkResult,//输出的对应注册表项所存位置(实际上是个指针)
[out, optional] LPDWORD lpdwDisposition
);
RegSetValueExA
1
2
3
4
5
6
7
8 LSTATUS RegSetValueExA(
[in] HKEY hKey,//可以由 RegCreateKeyExA(创建注册表项)或者 RegOpenKeyEx(打开注册表项) 还有其他函数生成
[in, optional] LPCSTR lpValueName,//键
DWORD Reserved,//保留位,恒为0
[in] DWORD dwType,//数据类型
[in] const BYTE *lpData,//值
[in] DWORD cbData//lpdata大小,如果数据的类型为 REG_SZ、REG_EXPAND_SZ 或 REG_MULTI_SZ, 则 cbData 必须包含终止 null 字符的大小
);
驱动通信
CreateFileA
用于获取驱动的句柄
1
2
3
4
5
6
7
8
9 HANDLE CreateFileA(
[in] LPCSTR lpFileName,//驱动上来说,可以是device
[in] DWORD dwDesiredAccess,
[in] DWORD dwShareMode,
[in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes,
[in] DWORD dwCreationDisposition,
[in] DWORD dwFlagsAndAttributes,
[in, optional] HANDLE hTemplateFile
);
DeviceIoControl
可以调用驱动api执行一些操作
1
2
3
4
5
6
7
8
9
10 BOOL DeviceIoControl(
[in] HANDLE hDevice,//设备句柄
[in] DWORD dwIoControlCode,//操作码
[in, optional] LPVOID lpInBuffer,
[in] DWORD nInBufferSize,
[out, optional] LPVOID lpOutBuffer,
[in] DWORD nOutBufferSize,
[out, optional] LPDWORD lpBytesReturned,
[in, out, optional] LPOVERLAPPED lpOverlapped
);
- 标题: 驱动相关
- 作者: runwu2204
- 创建于 : 2024-03-30 00:02:58
- 更新于 : 2024-04-02 20:35:14
- 链接: https://runwu2204.github.io/2024/03/30/Re/windows/pe/驱动/驱动相关/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论