课题获取加载后就自动删除的驱动SYS文件.docx

上传人:b****5 文档编号:26425292 上传时间:2023-06-19 格式:DOCX 页数:15 大小:371.85KB
下载 相关 举报
课题获取加载后就自动删除的驱动SYS文件.docx_第1页
第1页 / 共15页
课题获取加载后就自动删除的驱动SYS文件.docx_第2页
第2页 / 共15页
课题获取加载后就自动删除的驱动SYS文件.docx_第3页
第3页 / 共15页
课题获取加载后就自动删除的驱动SYS文件.docx_第4页
第4页 / 共15页
课题获取加载后就自动删除的驱动SYS文件.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

课题获取加载后就自动删除的驱动SYS文件.docx

《课题获取加载后就自动删除的驱动SYS文件.docx》由会员分享,可在线阅读,更多相关《课题获取加载后就自动删除的驱动SYS文件.docx(15页珍藏版)》请在冰豆网上搜索。

课题获取加载后就自动删除的驱动SYS文件.docx

课题获取加载后就自动删除的驱动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}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1