-
-
[原创]win10 1909逆向----探寻文件体系1
-
发表于:
2020-9-27 03:37
8296
-
[原创]win10 1909逆向----探寻文件体系1
本来是想学一下MiniFilter,后面觉得没什么意思,就顺道将文件这一块逆了几天,越逆越觉得有意思,特将过程记录下来,从最开始CreateFile C盘开始,卷设备、NTFS文件系统、缓存管理、IO管理、到15个重要的元文件($MFT、$BOOT等),因为文件系统较复杂和繁琐,并且是以逆向为主,所以只记录关键流程,并争取简单明了,如果有错误还请指出,借此抛砖引玉。(参考书籍:windows内核原理与实现 windows内核设计思想)
我们在0环中断下来,知道内核NtCreateFile的第三个参数放的就是我们要打开的对象名:"\??\C:",至于这里是怎么转过来的,可以自已去三环跟一下,没什么难度。
在解释"\??\"是个什么玩意的时候,得先初步了解一下对象管理的一些知识。
windows内部维护了一个对象层次目录(即系统全局名字空间)。
如下图:根目录:“\”(用全局变量ObpRootDirectoryObject来定义),下面的ArcName、Device、Driver等都是子目录。
对象管理器在第1阶段初始化时,会先创建"\"根目录,在第一阶段完成后根目录对象会插入以下对象。
这里Name里面并没有显示??,但实际上,是已经创建了??这个目录,并且还创建了DosDevices这个符号链接来指向它,它的创建过程:
ObInitSystem---->ObpInitializeRootNamespace---->ObpCreateDosDevicesDirectory,感兴趣的同学可以逆。
1。对象管理器在遇到“\??\”字符串时,会进入到EPROCESS的DeviceMAP(设备表)里,找到他需要的目录来解析:
DosDevicesDirectory:指向局部空间的目录。 "\??"
GlobalDosDevicesDirectory:指向全局空间的目录。"\GLOBAL??"
注:先找局部空间目录,如果局部空间目录没找到,则进入全局空间目录查找。
2。 解析DosDevicesDirectory这个对象,找到ParseProcedure或者ParseProcedureEx的值,判断是否为NULL,如果为NULL为目录,再通过剩余的名字来解析。(后面会多次需要得到ParseProcedure,具体过程这里会详细一点,后面直接略过)
1>得到Object_Header的TypeIndex.
2>Object_Header右移8位,得到低2字节。
3>得到ObHeaderCookie(我把他理解为随机值)
4>取他们的异或0xC0 ^ 0x1D ^ 0xDE = 0x3;
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课