Windows内核

ntoskrnl.exe杂记

驱动也是一个PE文件,类似于DLL,DriverEntry类似于DllMain

多了一个INIT节

1720685269212

用IDA打开一个驱动程序:

1720685764612

发现使用到的函数都是来自一个库,叫做ntoskrnl,

1720685818416

发现貌似是一个exe文件,我们用IDA打开看看

ntoskrnl.exe 是 Windows 操作系统的内核映像,简称为 NT Kernel (Windows NT Kernel Image)。它是 Windows 内核的核心部分,负责多种关键任务和系统服务

发现导出函数都在这个EXE的导出表里面

1720685952974

说明,逆向内核就相当于逆向这个exe程序

做一个驱动加载工具

目标:尝试做一个驱动加载工具

自行写一个驱动的安装,启动,关闭,卸载

1720703714501

PrintErrorMessage

这个函数能够自动根据错误码输出错误内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void PrintErrorMessage(DWORD errorCode)
{
LPVOID lpMsgBuf;

FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
errorCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 默认语言
(LPTSTR)&lpMsgBuf,
0,
NULL
);

// 输出错误消息
CString errorMsg;
errorMsg.Format(L"Error code %d: %s", errorCode, (LPTSTR)lpMsgBuf);
AfxMessageBox(errorMsg);

// 释放缓冲区
LocalFree(lpMsgBuf);
}

创建服务就是往注册表里面写东西

驱动随系统加载自动加载导致一开机就蓝屏,解决方法:

用安全模式进入系统,只加载一些基本的驱动,剩下的驱动一律不加载,这下就可以把蓝屏的驱动删掉了

MFC核心代码:

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
void CLoadDriverRing3Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
return;
}


BOOL CLoadDriverRing3Dlg::InstallDriver(LPCWSTR serviceName, LPCWSTR driverPath)
{
SC_HANDLE hSCManager = NULL;
SC_HANDLE hService = NULL;
BOOL bSuccess = FALSE;

// 打开服务控制管理器
hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
if (hSCManager == NULL)
{

PrintErrorMessage(GetLastError());
return FALSE;
}

// 创建服务
hService = CreateService(
hSCManager, // 服务控制管理器句柄
serviceName, // 服务名称
serviceName, // 显示名称
SERVICE_ALL_ACCESS, // 所需访问权限
SERVICE_KERNEL_DRIVER, // 服务类型
SERVICE_DEMAND_START, // 启动类型
SERVICE_ERROR_NORMAL, // 错误控制类型
driverPath, // 服务二进制文件路径
NULL, // 不属于任何负载排序组
NULL, // 不需要标签标识
NULL, // 没有依赖项
NULL, // 使用 LocalSystem 帐户
NULL // 没有密码
);

if (hService == NULL)
{
// 如果服务已经存在,获取句柄
if (GetLastError() == ERROR_SERVICE_EXISTS)
{
hService = OpenService(hSCManager, serviceName, SERVICE_ALL_ACCESS);
if (hService == NULL)
{

PrintErrorMessage(GetLastError());
CloseServiceHandle(hSCManager);
return FALSE;
}
}
else
{

PrintErrorMessage(GetLastError());
CloseServiceHandle(hSCManager);
return FALSE;
}
}

// 服务创建或打开成功
AfxMessageBox(L"Service installed successfully!");
bSuccess = TRUE;

// 关闭句柄
if (hService != NULL)
{
CloseServiceHandle(hService);
}
if (hSCManager != NULL)
{
CloseServiceHandle(hSCManager);
}

return bSuccess;
}


void CLoadDriverRing3Dlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码

InstallDriver(L"cr_2024_07_13", m_editBrowseCtrl);
return;
}



BOOL CLoadDriverRing3Dlg::StartDriver(LPCWSTR serviceName)
{
SC_HANDLE hSCManager = NULL;
SC_HANDLE hService = NULL;
BOOL bSuccess = FALSE;

// 打开服务控制管理器
hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hSCManager == NULL)
{

PrintErrorMessage(GetLastError());
return FALSE;
}

// 打开服务
hService = OpenService(hSCManager, serviceName, SERVICE_START | SERVICE_QUERY_STATUS);
if (hService == NULL)
{

PrintErrorMessage(GetLastError());
CloseServiceHandle(hSCManager);
return FALSE;
}

// 启动服务
if (!StartService(hService, 0, NULL))
{

PrintErrorMessage(GetLastError());
}
else
{
AfxMessageBox(L"Service started successfully!");
bSuccess = TRUE;
}

// 关闭句柄
if (hService != NULL)
{
CloseServiceHandle(hService);
}
if (hSCManager != NULL)
{
CloseServiceHandle(hSCManager);
}

return bSuccess;
}





void CLoadDriverRing3Dlg::OnBnClickedButton3() //开启
{
// TODO: 在此添加控件通知处理程序代码
StartDriver(L"cr_2024_07_13");
return;
}



BOOL CLoadDriverRing3Dlg::StopDriver(LPCWSTR serviceName)
{
SC_HANDLE hSCManager = NULL;
SC_HANDLE hService = NULL;
BOOL bSuccess = FALSE;
SERVICE_STATUS serviceStatus;

// 打开服务控制管理器
hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hSCManager == NULL)
{

PrintErrorMessage(GetLastError());
return FALSE;
}

// 打开服务
hService = OpenService(hSCManager, serviceName, SERVICE_STOP | SERVICE_QUERY_STATUS);
if (hService == NULL)
{

PrintErrorMessage(GetLastError());
CloseServiceHandle(hSCManager);
return FALSE;
}

// 停止服务
if (!ControlService(hService, SERVICE_CONTROL_STOP, &serviceStatus))
{

PrintErrorMessage(GetLastError());
}
else
{
AfxMessageBox(L"Service stopped successfully!");
bSuccess = TRUE;
}

// 关闭句柄
if (hService != NULL)
{
CloseServiceHandle(hService);
}
if (hSCManager != NULL)
{
CloseServiceHandle(hSCManager);
}

return bSuccess;
}

void CLoadDriverRing3Dlg::OnBnClickedButton4() //停止
{
// TODO: 在此添加控件通知处理程序代码
StopDriver(L"cr_2024_07_13");
return;
}


BOOL CLoadDriverRing3Dlg::UninstallDriver(LPCWSTR serviceName)
{
SC_HANDLE hSCManager = NULL;
SC_HANDLE hService = NULL;
BOOL bSuccess = FALSE;

// 打开服务控制管理器
hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hSCManager == NULL)
{

PrintErrorMessage(GetLastError());
return FALSE;
}

// 打开服务
hService = OpenService(hSCManager, serviceName, DELETE);
if (hService == NULL)
{

PrintErrorMessage(GetLastError());
CloseServiceHandle(hSCManager);
return FALSE;
}

// 删除服务
if (!DeleteService(hService))
{

PrintErrorMessage(GetLastError());
}
else
{
AfxMessageBox(L"Service uninstalled successfully!");
bSuccess = TRUE;
}

// 关闭句柄
if (hService != NULL)
{
CloseServiceHandle(hService);
}
if (hSCManager != NULL)
{
CloseServiceHandle(hSCManager);
}

return bSuccess;
}


void CLoadDriverRing3Dlg::OnBnClickedButton5()
{
// TODO: 在此添加控件通知处理程序代码
UninstallDriver(L"cr_2024_07_13");
return;
}

void CLoadDriverRing3Dlg::PrintErrorMessage(DWORD errorCode)
{
LPVOID lpMsgBuf;

FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
errorCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 默认语言
(LPTSTR)&lpMsgBuf,
0,
NULL
);

// 输出错误消息
CString errorMsg;
errorMsg.Format(L"Error code %d: %s", errorCode, (LPTSTR)lpMsgBuf);
AfxMessageBox(errorMsg);

// 释放缓冲区
LocalFree(lpMsgBuf);
}

效果:

1720710122466

在服务的界面貌似找不到我们起的驱动服务,这是因为驱动是在0环运行,本地服务只能看到3环的。

1720710268489

所以用WinObj看:

1720710345290