课题获取加载后就自动删除的驱动SYS文件.docx
- 文档编号:26425292
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:15
- 大小:371.85KB
课题获取加载后就自动删除的驱动SYS文件.docx
《课题获取加载后就自动删除的驱动SYS文件.docx》由会员分享,可在线阅读,更多相关《课题获取加载后就自动删除的驱动SYS文件.docx(15页珍藏版)》请在冰豆网上搜索。
课题获取加载后就自动删除的驱动SYS文件
获取加载后就自动删除的驱动SYS文件
最近闲得没事做,想逆几个驱动玩玩,于是就把目标投向了Xuetr,利用Xuetr查询它的驱动文件位置
发现DriverPath里面显示的是驱动的位置,但是驱动文件死活找不到,原来是因为它在加载完驱动之后,马上自删除了该文件,估计是考虑到不想被别有用心的人拿来逆向吧
今天我们的任务就是要来获取这个SYS文件,然后利用IDA来XX,以学习Xuetr里面的一些先进技术
一开始想到的方法是既然文件在这个位置出现过,那么我写一个死循环的函数来不断的CopyFile,这样不就可以获取到它的SYS文件么,于是就有了下面的代码
#include
#include
#defineSRC_PATH"C:
\\Users\\stefanie\\Desktop\\XueTr.sys"
#defineDST_PATH"C:
\\Xuetr.SYS"
intmain()
{
while(!
CopyFileA(SRC_PATH,DST_PATH,FALSE));
printf("CopyFilesuccess!
\n");
return0;
}
这样只要这个Console程序退出就知道已经拷贝成功了,注意文件的保存位置是在C盘的根目录下,所以WIN7的话要以管理员运行程序,不然CopyFile会出现AccessDenied的错误,还有就是要在文件夹选项中去掉“隐藏系统保护的重要文件”选项才能看到
现在虽然能够获取到SYS文件,但是每次加载一个新的驱动的话就要把上面的SRC_PATH和DST_PATH做一番修改,有没有办法获取到驱动的ImagePath,从而做到一劳永逸呢?
自己写过加载驱动的程序的都知道,首先在HKLM\SYSTEM\CurrentControlSet\Services\键下创建一个名字为驱动名的子健,然后在这个子健中创建一些ValueKey,比如ImagePath,StartType等等,因此如果我们可以从这里入手
于是就想到了利用SSDTHOOK来钩住ZwLoadDriver,通过ZwLoadDriver传进来的第一个参数DriverServiceName来读取这个注册表键,然后再进一步的得到ImagePath的值,再利用这个ImagePath来构造我们的DestinationFileName,假设Xuetr的ImagePath为\?
?
\C:
\Users\stefanie\Desktop\XueTr.sys,那么我们最终存放的驱动位置就是C:
\Xuetr.sys,这些都是在FilterZwLoadDriver中实现的
同样在这个函数里面也实现了拷贝文件的功能,由于WDK中并没有ZwCopyFile等函数,所以自己写了个ZwCopyFile通过打开文件,读取文件,和写入文件的方法来实现
(这种方法有个弊端,就是文件读取的时候,文件内容是读取在驱动的内部缓冲区里面,如果文件过大的话,怕分配不了那么大的空间,内核空间貌似挺宝贵的,当然可以比如每次4K这样子读写,网上有人利用自己生成和发送IRP来进行文件的操作,等我研究好了再回来补充一下~)
BTW:
这个驱动并没有考虑到要过主防,如果你的机器装了360的话,那么这个方法将会失效,360的HOOKPORT.SYS框架钩住了KiFastCallEntry,同时它也保存了敏感函数比如ZwLoadDriver的原始地址在它的一个索引表里面,虽然你在这里SSDTHOOK了,但是系统调用的必经之路KiFastCallEntry被360给钩住了,当ZwLoadDriver的时候,不是通过读取SSDT来获得它的地址,而是通过查360自己的那张表。
。
。
说的有点拗口。
。
。
别的杀毒软件没有测试过,HIPS应该都会钩住这个函数,所以最好在虚拟机中使用而且是干净的操作系统
好了,废话不多说,贴代码了,这份代码同时也为那些不知道在内核中怎么操作注册表和操作文件的新手提供参考
ps:
刚在路上突然想到,下面的开关中断是不是应该KeAquireSpinLock一下,因为如果是多核的话,其他的核在读取地址的时候,万一正在修改的话会不会出现BSOD?
?
?
?
?
看了某驱动用的是InterLockedExChange来锁住CPU的地址线,应该要加吧。
。
。
1#include
2
3externULONG_PTRKeServiceDescriptorTable;
4
5typedefNTSTATUS(__stdcall*ZWLOADDRIVER)(INPUNICODE_STRINGDriverServiceName);
6
7ZWLOADDRIVEROriginalZwLoadDriver;
8
9DRIVER_INITIALIZEDriverEntry;
10DRIVER_UNLOADDriverUnload;
11
12NTSTATUSZwCopyFile(PUNICODE_STRINGDestinationFileName,PUNICODE_STRINGSourceFileName)
13{
14NTSTATUSstatus;
15HANDLESourceFileHandle=NULL;
16HANDLEDestinationFileHandle=NULL;
17OBJECT_ATTRIBUTESObjectAttributes;
18IO_STATUS_BLOCKIoStatusBlock;
19FILE_STANDARD_INFORMATIONFileInfo;
20ULONGAllocationSize;
21PVOIDFileBuffer=NULL;
22BOOLEANbAllocateInVirtualMemory=FALSE;
23
24InitializeObjectAttributes(&ObjectAttributes,
25SourceFileName,
26OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,
27NULL,
28NULL);
29status=IoCreateFile(&SourceFileHandle,
30GENERIC_READ|SYNCHRONIZE,
31&ObjectAttributes,
32&IoStatusBlock,
33NULL,
34FILE_ATTRIBUTE_NORMAL,
35FILE_SHARE_READ,
36FILE_OPEN,
37FILE_SYNCHRONOUS_IO_NONALERT,
38NULL,
390,
40CreateFileTypeNone,
410,
42IO_NO_PARAMETER_CHECKING);
43if(!
NT_SUCCESS(status))
44{
45DbgPrint("IoCreateFile(%wZ)failed,eid=0x%08x\n",SourceFileName,status);
46gotocleanup;
47}
48
49//DbgPrint("Open%wZsuccess!
\n",SourceFileName);
50
51status=ZwQueryInformationFile(
52SourceFileHandle,
53&IoStatusBlock,
54(PVOID)&FileInfo,
55sizeof(FileInfo),
56FileStandardInformation);
57if(!
NT_SUCCESS(status))
58{
59DbgPrint("ZwQueryFileInformation(%wZ)failed,eid=0x%08x\n",SourceFileName,status);
60gotocleanup;
61}
62
63//DbgPrint("ZwQueryInformationFilesuccess!
\n");
64
65AllocationSize=FileInfo.AllocationSize.LowPart;
66
67FileBuffer=ExAllocatePoolWithTag(PagedPool,AllocationSize,'CODE');
68if(!
FileBuffer)
69{
70status=ZwAllocateVirtualMemory((HANDLE)(-1),
71(PVOID)&FileBuffer,
720,
73&AllocationSize,
74MEM_COMMIT,
75PAGE_READWRITE);
76if(!
NT_SUCCESS(status))
77{
78DbgPrint("CannotAllocateSuchLargeBuffer!
\n");
79gotocleanup;
80}
81bAllocateInVirtualMemory=TRUE;
82}
83
84status=ZwReadFile(SourceFileHandle,
85NULL,
86NULL,
87NULL,
88&IoStatusBlock,
89FileBuffer,
90AllocationSize,
91NULL,
92NULL);
93
94if(!
NT_SUCCESS(status))
95{
96DbgPrint("ZwReadFile(%wZ)failed,eid=0x%08x\n",SourceFileName,status);
97gotocleanup;
98}
99
100InitializeObjectAttributes(&ObjectAttributes,
101DestinationFileName,
102OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,
103NULL,
104NULL);
105status=IoCreateFile(&DestinationFileHandle,
106GENERIC_READ|GENERIC_WRITE,
107&ObjectAttributes,
108&IoStatusBlock,
109NULL,
110FILE_ATTRIBUTE_NORMAL,
111FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
112FILE_OVERWRITE_IF,
113FILE_SYNCHRONOUS_IO_NONALERT,
114NULL,
1150,
116CreateFileTypeNone,
117NULL,
118IO_NO_PARAMETER_CHECKING);
119if(!
NT_SUCCESS(status))
120{
121DbgPrint("IoCreateFile(%wZ)failed,eid=0x%08x\n",DestinationFileName,status);
122gotocleanup;
123}
124
125status=ZwWriteFile(DestinationFileHandle,
126NULL,
127NULL,
128NULL,
129&IoStatusBlock,
130FileBuffer,
131AllocationSize,
132NULL,
133NULL);
134
135if(!
NT_SUCCESS(status))
136DbgPrint("ZwWriteFile(%wZ)failed,eid=0x%08x\n",DestinationFileName,status);
137
138cleanup:
139if(bAllocateInVirtualMemory)
140ZwFreeVirtualMemory((HANDLE)(-1),(PVOID)&FileBuffer,&AllocationSize,MEM_RELEASE);
141elseif(FileBuffer)
142ExFreePoolWithTag(FileBuffer,'CODE');
143if(SourceFileHandle)
144ZwClose(SourceFileHandle);
145if(DestinationFileHandle)
146ZwClose(DestinationFileHandle);
147
148returnstatus;
149}
150
151NTSTATUSFilterZwLoadDriver(INPUNICODE_STRINGDriverServiceName)
152{
153NTSTATUSstatus;
154HANDLEServiceKeyHandle;
155OBJECT_ATTRIBUTESObjectAttribute;
156UNICODE_STRINGusValueKey;
157UNICODE_STRINGusDestinationFileName;
158UNICODE_STRINGusSourceFileName;
159ULONGcbNeeded;
160PKEY_VALUE_PARTIAL_INFORMATIONInfo;
161WCHARszDestinationFileName[260]=L"\\?
?
\\C:
\\";
162WCHAR*EndPointer;
163
164//DbgPrint("SSDTHOOKZwLoadDriversuccess!
\n");
165
166InitializeObjectAttributes(&ObjectAttribute,DriverServiceName,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,NULL,NULL);
167status=ZwOpenKey(&ServiceKeyHandle,KEY_READ,&ObjectAttribute);
168if(!
NT_SUCCESS(status))
169{
170DbgPrint("ZwOpenKeyfailed,eid=0x%08x!
\n",status);
171returnstatus;
172}
173
174//DbgPrint("ZwOpenKey(%wZ)success!
\n",DriverServiceName);
175
176RtlInitUnicodeString(&usValueKey,L"ImagePath");
177ZwQueryValueKey(ServiceKeyHandle,&usValueKey,KeyValuePartialInformation,NULL,0,&cbNeeded);
178//DbgPrint("cbNeeded=%d\n",cbNeeded);
179
180Info=ExAllocatePoolWithTag(PagedPool,cbNeeded,'CODE');
181status=ZwQueryValueKey(ServiceKeyHandle,&usValueKey,KeyValuePartialInformation,(PVOID)Info,cbNeeded,&cbNeeded);
182if(!
NT_SUCCESS(status))
183{
184DbgPrint("ZwQueryValueKeyfailed,eid=0x%08x\n",status);
185ExFreePoolWithTag(Info,'CODE');
186returnstatus;
187}
188
189ZwClose(ServiceKeyHandle);
190
191//DbgPrint("Type=%d,ImagePath=%ws,DataLength=%d\n",Info->Type,Info->Data,Info->DataLength);//includeUNICODE_NULL_TERMINATOR
192
193RtlInitUnicodeString(&usSourceFileName,(PCWSTR)(Info->Data));
194
195EndPointer=(WCHAR*)(Info->Data+Info->DataLength);
196
197while(*EndPointer!
='\\')
198EndPointer--;
199memcpy(szDestinationFileName+wcslen(szDestinationFileName),EndPointer+1,((ULONG)(Info->Data)+Info->DataLength-(ULONG)EndPointer));
200
201RtlInitUnicodeString(&usDestinationFileName,szDestinationFileName);
202
203//DbgPrint("Destination=%wZ\n",&usDestinationFileName);
204
205ExFreePoolWithTag(Info,'CODE');
206
207status=ZwCopyFile(&usDestinationFileName,&usSourceFileName);
208if(!
NT_SUCCESS(status))
209{
210DbgPrint("ZwCopyFilefailed,eid=%d!
\n",status);
211returnstatus;
212}
213
214DbgPrint("CopyFile%ws--->%wssuccess!
\n",(&usSourceFileName)->Buffer+wcslen(L"\\?
?
\\"),(&usDestinationFileName)->Buffer+wcslen(L"\\?
?
\\"));
215
216DbgPrint("MissionComplete,Congratulations!
\n");
217
218return(OriginalZwLoadDriver)(DriverServiceName);
219}
220
221VOIDSSDT_HOOK_ZwLoadDriver()
222{
223__asm
224{
225cli
226pusheax
227moveax,CR0
228andeax,0FFFEFFFFh
229movCR0,eax
230popeax
231}
232
233_asm{
234movecx,dwordptr[ZwLoadDriver];
235movedx,[ecx+1];
236moveax,dwordptr[KeServiceDescriptorTable];
237movesi,[eax];
238movedx,[esi+edx*4];
239movdwordptr[OriginalZwLoadDriver],edx
240movecx,[ecx+1]
241moveax,[eax]
242movdwordptr[eax+ecx*4],offsetFilterZwLoadDriver;
243}
244
245__asm
246{
247pusheax
248moveax,CR0
249oreax,NOT0FFFEFFFFh
250movCR0,eax
251popeax
252sti
253}
254}
255
256VOIDSSDT_UNHOOK_ZwLoadDriver()
257{
258__asm
259{
260cli
261pusheax
262moveax,CR0
263andeax,0FFFEFFFFh
264movCR0,eax
265popeax
266}
267
268_asm{
269
270movecx,dwordptr[ZwLoadDriver];
271movedx,[ecx+1];
272moveax,dwordptr[KeServiceDescriptorTable];
273movesi,[eax];
274movebx,dwordptr[OriginalZwLoadDriver];
275mov[esi+edx*4],ebx;
276}
277
278__asm
279{
280pusheax
281moveax,CR0
282oreax,NOT0FFFEFFFFh
283movCR0,eax
284popeax
285sti
286}
287}
288
289NTSTATUSDriverEntry(PDRIVER_OBJECTDriverObject,PUNICODE_STRINGRegPath)
290{
291SSDT_HOOK_ZwLoadDriver();
292
293DriverObject->DriverUnload=DriverUnload;
294
295returnSTATUS_SUCCESS;
296}
297
298VOIDDriverUnload(PDRIVER_OBJECTDriverObject)
299{
300SSDT_UNHOOK_ZwLoadDriver();
301}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课题 获取 加载 自动 删除 驱动 SYS 文件
![提示](https://static.bdocx.com/images/bang_tan.gif)