ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:371.85KB ,
资源ID:26425292      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/26425292.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(课题获取加载后就自动删除的驱动SYS文件.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、课题获取加载后就自动删除的驱动SYS文件获取加载后就自动删除的驱动SYS文件最近闲得没事做,想逆几个驱动玩玩,于是就把目标投向了Xuetr,利用Xuetr查询它的驱动文件位置发现DriverPath里面显示的是驱动的位置,但是驱动文件死活找不到,原来是因为它在加载完驱动之后,马上自删除了该文件,估计是考虑到不想被别有用心的人拿来逆向吧今天我们的任务就是要来获取这个SYS文件,然后利用IDA来XX,以学习Xuetr里面的一些先进技术一开始想到的方法是既然文件在这个位置出现过,那么我写一个死循环的函数来不断的CopyFile,这样不就可以获取到它的SYS文件么,于是就有了下面的代码#include

2、 #include #define SRC_PATH C:UsersstefanieDesktopXueTr.sys#define DST_PATH C:Xuetr.SYSint main() while (!CopyFileA(SRC_PATH,DST_PATH,FALSE); printf(Copy File success!n); return 0;这样只要这个Console程序退出就知道已经拷贝成功了,注意文件的保存位置是在C盘的根目录下,所以WIN7的话要以管理员运行程序,不然CopyFile会出现Access Denied的错误,还有就是要在文件夹选项中去掉“隐藏系统保护的重要文件

3、”选项才能看到现在虽然能够获取到SYS文件,但是每次加载一个新的驱动的话就要把上面的SRC_PATH和DST_PATH做一番修改,有没有办法获取到驱动的ImagePath,从而做到一劳永逸呢?自己写过加载驱动的程序的都知道,首先在HKLMSYSTEMCurrentControlSetServices键下创建一个名字为驱动名的子健,然后在这个子健中创建一些ValueKey,比如ImagePath,StartType等等,因此如果我们可以从这里入手于是就想到了利用SSDT HOOK来钩住ZwLoadDriver,通过ZwLoadDriver传进来的第一个参数DriverServiceName来读取

4、这个注册表键,然后再进一步的得到ImagePath的值,再利用这个ImagePath来构造我们的DestinationFileName,假设Xuetr的ImagePath为?C:UsersstefanieDesktopXueTr.sys,那么我们最终存放的驱动位置就是C:Xuetr.sys,这些都是在FilterZwLoadDriver中实现的同样在这个函数里面也实现了拷贝文件的功能,由于WDK中并没有ZwCopyFile等函数,所以自己写了个ZwCopyFile通过打开文件,读取文件,和写入文件的方法来实现(这种方法有个弊端,就是文件读取的时候,文件内容是读取在驱动的内部缓冲区里面,如果文件

5、过大的话,怕分配不了那么大的空间,内核空间貌似挺宝贵的,当然可以比如每次4K这样子读写,网上有人利用自己生成和发送IRP来进行文件的操作,等我研究好了再回来补充一下)BTW:这个驱动并没有考虑到要过主防,如果你的机器装了360的话,那么这个方法将会失效,360的HOOKPORT.SYS框架钩住了KiFastCallEntry,同时它也保存了敏感函数比如ZwLoadDriver的原始地址在它的一个索引表里面,虽然你在这里SSDT HOOK了,但是系统调用的必经之路KiFastCallEntry被360给钩住了,当ZwLoadDriver的时候,不是通过读取SSDT来获得它的地址,而是通过查360

6、自己的那张表。说的有点拗口。别的杀毒软件没有测试过,HIPS应该都会钩住这个函数,所以最好在虚拟机中使用而且是干净的操作系统好了,废话不多说,贴代码了,这份代码同时也为那些不知道在内核中怎么操作注册表和操作文件的新手提供参考ps:刚在路上突然想到,下面的开关中断是不是应该KeAquireSpinLock一下,因为如果是多核的话,其他的核在读取地址的时候,万一正在修改的话会不会出现BSOD?看了某驱动用的是InterLockedExChange来锁住CPU的地址线,应该要加吧。 1 #include 2 3 extern ULONG_PTR KeServiceDescriptorTable; 4

7、 5 typedef NTSTATUS (_stdcall *ZWLOADDRIVER)(IN PUNICODE_STRING DriverServiceName); 6 7 ZWLOADDRIVER OriginalZwLoadDriver; 8 9 DRIVER_INITIALIZE DriverEntry; 10 DRIVER_UNLOAD DriverUnload; 11 12 NTSTATUS ZwCopyFile(PUNICODE_STRING DestinationFileName,PUNICODE_STRING SourceFileName) 13 14 NTSTATUS st

8、atus; 15 HANDLE SourceFileHandle=NULL; 16 HANDLE DestinationFileHandle=NULL; 17 OBJECT_ATTRIBUTES ObjectAttributes; 18 IO_STATUS_BLOCK IoStatusBlock; 19 FILE_STANDARD_INFORMATION FileInfo; 20 ULONG AllocationSize; 21 PVOID FileBuffer=NULL; 22 BOOLEAN bAllocateInVirtualMemory=FALSE; 23 24 InitializeO

9、bjectAttributes( &ObjectAttributes, 25 SourceFileName, 26 OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE, 27 NULL, 28 NULL); 29 status=IoCreateFile(&SourceFileHandle, 30 GENERIC_READ|SYNCHRONIZE, 31 &ObjectAttributes, 32 &IoStatusBlock, 33 NULL, 34 FILE_ATTRIBUTE_NORMAL, 35 FILE_SHARE_READ, 36 FILE_OPEN, 37

10、 FILE_SYNCHRONOUS_IO_NONALERT, 38 NULL, 39 0, 40 CreateFileTypeNone, 41 0, 42 IO_NO_PARAMETER_CHECKING); 43 if (!NT_SUCCESS(status) 44 45 DbgPrint(IoCreateFile (%wZ) failed,eid=0x%08xn,SourceFileName,status); 46 goto cleanup; 47 48 49 /DbgPrint(Open %wZ success!n,SourceFileName); 50 51 status=ZwQuer

11、yInformationFile( 52 SourceFileHandle, 53 &IoStatusBlock, 54 (PVOID)&FileInfo, 55 sizeof(FileInfo), 56 FileStandardInformation); 57 if (!NT_SUCCESS(status) 58 59 DbgPrint(ZwQueryFileInformation (%wZ) failed,eid=0x%08xn,SourceFileName,status); 60 goto cleanup; 61 62 63 /DbgPrint(ZwQueryInformationFil

12、e success!n); 64 65 AllocationSize=FileInfo.AllocationSize.LowPart; 66 67 FileBuffer=ExAllocatePoolWithTag(PagedPool,AllocationSize,CODE); 68 if (!FileBuffer) 69 70 status=ZwAllocateVirtualMemory( (HANDLE)(-1), 71 (PVOID)&FileBuffer, 72 0, 73 &AllocationSize, 74 MEM_COMMIT, 75 PAGE_READWRITE); 76 if

13、 (!NT_SUCCESS(status) 77 78 DbgPrint(Cannot Allocate Such Large Buffer!n); 79 goto cleanup; 80 81 bAllocateInVirtualMemory=TRUE; 82 83 84 status=ZwReadFile( SourceFileHandle, 85 NULL, 86 NULL, 87 NULL, 88 &IoStatusBlock, 89 FileBuffer, 90 AllocationSize, 91 NULL, 92 NULL); 93 94 if (!NT_SUCCESS(stat

14、us) 95 96 DbgPrint(ZwReadFile (%wZ) failed,eid=0x%08xn,SourceFileName,status); 97 goto cleanup; 98 99 100 InitializeObjectAttributes( &ObjectAttributes,101 DestinationFileName,102 OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,103 NULL,104 NULL);105 status=IoCreateFile(&DestinationFileHandle,106 GENERIC_REA

15、D|GENERIC_WRITE,107 &ObjectAttributes,108 &IoStatusBlock,109 NULL,110 FILE_ATTRIBUTE_NORMAL,111 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,112 FILE_OVERWRITE_IF,113 FILE_SYNCHRONOUS_IO_NONALERT,114 NULL,115 0,116 CreateFileTypeNone,117 NULL,118 IO_NO_PARAMETER_CHECKING);119 if (!NT_SUCCESS(s

16、tatus)120 121 DbgPrint(IoCreateFile (%wZ) failed,eid=0x%08xn,DestinationFileName,status);122 goto cleanup;123 124 125 status=ZwWriteFile( DestinationFileHandle,126 NULL,127 NULL,128 NULL,129 &IoStatusBlock,130 FileBuffer,131 AllocationSize,132 NULL,133 NULL);134 135 if (!NT_SUCCESS(status)136 DbgPri

17、nt(ZwWriteFile (%wZ) failed,eid=0x%08xn,DestinationFileName,status);137 138 cleanup:139 if (bAllocateInVirtualMemory)140 ZwFreeVirtualMemory(HANDLE)(-1),(PVOID)&FileBuffer,&AllocationSize,MEM_RELEASE);141 else if(FileBuffer)142 ExFreePoolWithTag(FileBuffer,CODE);143 if(SourceFileHandle)144 ZwClose(S

18、ourceFileHandle);145 if (DestinationFileHandle)146 ZwClose(DestinationFileHandle);147 148 return status;149 150 151 NTSTATUS FilterZwLoadDriver(IN PUNICODE_STRING DriverServiceName)152 153 NTSTATUS status;154 HANDLE ServiceKeyHandle;155 OBJECT_ATTRIBUTES ObjectAttribute;156 UNICODE_STRING usValueKey

19、;157 UNICODE_STRING usDestinationFileName;158 UNICODE_STRING usSourceFileName;159 ULONG cbNeeded;160 PKEY_VALUE_PARTIAL_INFORMATION Info;161 WCHAR szDestinationFileName260=L?C:;162 WCHAR *EndPointer;163 164 /DbgPrint(SSDT HOOK ZwLoadDriver success!n);165 166 InitializeObjectAttributes(&ObjectAttribu

20、te,DriverServiceName,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,NULL,NULL);167 status=ZwOpenKey(&ServiceKeyHandle,KEY_READ,&ObjectAttribute);168 if (!NT_SUCCESS(status)169 170 DbgPrint(ZwOpenKey failed,eid=0x%08x!n,status);171 return status;172 173 174 /DbgPrint(ZwOpenKey (%wZ) success!n,DriverServiceNa

21、me);175 176 RtlInitUnicodeString(&usValueKey,LImagePath);177 ZwQueryValueKey(ServiceKeyHandle,&usValueKey,KeyValuePartialInformation,NULL,0,&cbNeeded);178 /DbgPrint(cbNeeded=%dn,cbNeeded);179 180 Info=ExAllocatePoolWithTag(PagedPool,cbNeeded,CODE);181 status=ZwQueryValueKey(ServiceKeyHandle,&usValue

22、Key,KeyValuePartialInformation,(PVOID)Info,cbNeeded,&cbNeeded);182 if (!NT_SUCCESS(status)183 184 DbgPrint(ZwQueryValueKey failed,eid=0x%08xn,status);185 ExFreePoolWithTag(Info,CODE);186 return status;187 188 189 ZwClose(ServiceKeyHandle);190 191 /DbgPrint(Type=%d,ImagePath=%ws,DataLength=%dn,Info-T

23、ype,Info-Data,Info-DataLength);/include UNICODE_NULL_TERMINATOR192 193 RtlInitUnicodeString(&usSourceFileName,(PCWSTR)(Info-Data);194 195 EndPointer=(WCHAR*)(Info-Data+Info-DataLength);196 197 while (*EndPointer!=)198 EndPointer-;199 memcpy(szDestinationFileName+wcslen(szDestinationFileName),EndPoin

24、ter+1,(ULONG)(Info-Data)+Info-DataLength-(ULONG)EndPointer);200 201 RtlInitUnicodeString(&usDestinationFileName,szDestinationFileName);202 203 /DbgPrint(Destination=%wZn,&usDestinationFileName);204 205 ExFreePoolWithTag(Info,CODE);206 207 status=ZwCopyFile(&usDestinationFileName,&usSourceFileName);2

25、08 if (!NT_SUCCESS(status)209 210 DbgPrint(ZwCopyFile failed,eid=%d!n,status);211 return status;212 213 214 DbgPrint(CopyFile %ws-%ws success!n,(&usSourceFileName)-Buffer+wcslen(L?),(&usDestinationFileName)-Buffer+wcslen(L?);215 216 DbgPrint(Mission Complete,Congratulations!n);217 218 return (Origin

26、alZwLoadDriver)(DriverServiceName);219 220 221 VOID SSDT_HOOK_ZwLoadDriver()222 223 _asm224 225 cli226 push eax227 mov eax, CR0228 and eax, 0FFFEFFFFh229 mov CR0, eax230 pop eax231 232 233 _asm234 mov ecx, dword ptr ZwLoadDriver;235 mov edx, ecx+1;236 mov eax, dword ptr KeServiceDescriptorTable;237

27、mov esi, eax;238 mov edx, esi+edx*4;239 mov dword ptr OriginalZwLoadDriver, edx240 mov ecx, ecx+1241 mov eax, eax242 mov dword ptr eax+ecx*4, offset FilterZwLoadDriver;243 244 245 _asm246 247 push eax248 mov eax, CR0249 or eax, NOT 0FFFEFFFFh250 mov CR0, eax251 pop eax252 sti253 254 255 256 VOID SSD

28、T_UNHOOK_ZwLoadDriver()257 258 _asm259 260 cli261 push eax262 mov eax, CR0263 and eax, 0FFFEFFFFh264 mov CR0, eax265 pop eax266 267 268 _asm269 270 mov ecx, dword ptr ZwLoadDriver;271 mov edx, ecx+1;272 mov eax, dword ptr KeServiceDescriptorTable;273 mov esi, eax;274 mov ebx, dword ptr OriginalZwLoa

29、dDriver;275 mov esi+edx*4,ebx;276 277 278 _asm279 280 push eax281 mov eax, CR0282 or eax, NOT 0FFFEFFFFh283 mov CR0, eax284 pop eax285 sti286 287 288 289 NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegPath)290 291 SSDT_HOOK_ZwLoadDriver();292 293 DriverObject-DriverUnload=DriverUnload;294 295 return STATUS_SUCCESS;296 297 298 VOID DriverUnload(PDRIVER_OBJECT DriverObject)299 300 SSDT_UNHOOK_ZwLoadDriver();301

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

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