Win7 ring3可以直接写硬盘吗?不可以。相信很多人都有这个印象,有些人是道听途说,有些则是亲身试过,很多对此感兴趣的人可能都看过MJ0011的“VISTA&WIN7对直接磁盘写入的防护,不过真的一点办法也没有了吗?
“在VISTA 和WINDOWS 7的NTFS驱动中,对直接写入磁盘分区做了限制,RING3无法直接写入”受保护”的磁盘分区”—这是“VISTA&WIN7对直接磁盘写入的防护”的第一句话,可能大家都理解为ring3不能直接写入磁盘分区,因为磁盘分区”受保护”了,从下文来看,原意应该也是如此,不过,我将它理解为:ring3不能直接写入磁盘分区,因为磁盘分区”受保护”了;如果磁盘分区”不受保护”了,那么就可以ring3直接写入了。
接下来我们看下MS是怎么说的吧。
“Blocking Direct Write Operations to Volumes and Disks,“在 Windows Vista 和 Windows Server 2008 中对文件系统和存储堆栈进行的更改可限制对磁盘和卷的直接访问
只有存在以下情况时,文件系统才可以写入卷句柄:
情况 1:正要写入的扇区是启动扇区。
注意:这种情况是为了支持防病毒程序、安装程序以及其他必须更新系统卷启动代码的程序。无法锁定系统卷。
情况 2:正要写入的扇区位于文件系统空间外。
注意:文件系统空间末尾和卷空间末尾之间的区域不受文件系统的控制。因此,没有理由要求锁定卷以禁止对其进行写入操作。
情况 3:已经通过请求独占写入权限隐式锁定卷。
情况 4:已经通过锁定请求或卸载请求显式锁定卷。
情况 5:写入请求具有 SL_FORCE_DIRECT_WRITE 标志,该标志表示必须忽略情况 2。
注意:有些文件系统筛选器不用首先锁定卷就可以写入卷的可用空间区域。如果文件系统筛选器必须这样做,则文件系统筛选器可在写入请求上设置一个标志,通知文件系统允许执行写入行为。仅可在内核模式下设置该标志。
如果存在以下情况,则存储驱动器可以写入磁盘句柄:
情况 1:正要写入的扇区不位于卷内。
注意:程序使用卷之外的扇区来存储元数据。分区表也位于卷之外的扇区中。由于这些扇区不受任何文件系统的控制,因此没有理由阻止对这些扇区的访问。
情况 2:正要写入的扇区位于已显式锁定的已安装卷内。
情况 3:正要写入的扇区位于未安装或者无文件系统的卷内。
简单的说,第一个是对分区的,第二个是对磁盘的。(卷和分区不能直接等同,这里只是简略考虑。)
先看分区的:(可以直接ring3下的情况)
情况 1:正要写入的扇区是启动扇区。
也就是MBR这一块,对不去修改感染MBR的人基本无用。
情况 2:正要写入的扇区位于文件系统空间外。
一个分区,其实际全部空间大于可用空间,多余的部分就是不归系统管的,具体大小不定,经常位于分区的开头和末尾,这部分就是可以直接ring3操作的,如果你有私密数据,可以考虑放这里。但是,也不符合大家的期望。
情况 5:写入请求具有 SL_FORCE_DIRECT_WRITE 标志,该标志表示必须忽略情况 2。
这个标志很好,可惜不属于ring3。所以…只能挥手作别。
情况 3:已经通过请求独占写入权限隐式锁定卷。
情况 4:已经通过锁定请求或卸载请求显式锁定卷。
注意到了吗?锁定卷①,是不是有柳暗花明的感觉?不急,我们先看下对磁盘的写入。
情况 1:正要写入的扇区不位于卷内。
这是指分区表之类的数据,可以由ring3修改。有什么用吗?当然有。②
情况 2:正要写入的扇区位于已显式锁定的已安装卷内。
其实这个和分区的情况5是一样的意思,我们也放在锁定卷①中讲。
情况 3:正要写入的扇区位于未安装或者无文件系统的卷内。
也就是说,不受系统支持的文件系统是可以ring3写的。②
锁定卷:
第一种,独占写入,让我们试验下吧。
HANDLE hDev= CreateFile("\\\\.\\d:",GENERIC_ALL,0,0,OPEN_EXISTING,0,0);
DWORD dwRet;
LARGE_INTEGER a;a.QuadPart=1024*1024*16;
BYTE mem[512];
memset(mem,9,512);
SetFilePointer(hDev,a.LowPart,&a.HighPart,FILE_BEGIN);
WriteFile(hDev,mem,512,&dwRet,0);
CloseHandle(hDev);
很快我们发现,成功了。成功来得如此迅速,让我们有点措手不及。于是,不满足的我们,开始了更多的试验:更改某个文件的内容。
首先我们先找到需要更改的文件fscmd.exe,地址为0x152D 000(通过winhex),然后
将上面代码的地址改为0x152D000,运行。
运行后
不出所料,成功了,fscmd.exe被成功更改了,ring3下直接写磁盘,还是可以的。
当然,我们不可能就这样满足,如果fscmd.exe正在运行呢?还可以更改吗?
可惜了,不能,也就是说独占锁定失败了。那么,还有其他的办法吗?
这是刚才的结果?不是,这是在fscmd.exe运行的时候的结果。这次,用了新的办法。
情况 4:已经通过锁定请求或卸载请求显式锁定卷。
可以算是情况4。
代码如下:
HANDLE hDevice = CreateFile("\\\\.\\d:", // drive to open
GENERIC_ALL, // no access to the drive
FILE_SHARE_READ | // share mode
FILE_SHARE_WRITE,
NULL, // default security attributes
OPEN_EXISTING, // disposition
0, // file attributes
NULL); // do not copy file attributes
if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
{
return ;
}
DWORD junk;
DeviceIoControl(hDevice, // device to be queried
(DWORD)FSCTL_DISMOUNT_VOLUME, // operation to perform
NULL, 0, // no input buffer
NULL, 0, // output buffer
&junk, // # bytes returned
(LPOVERLAPPED) NULL); // synchronous I/O
if(hDevice!=INVALID_HANDLE_VALUE)
{
DWORD dwRet;
LARGE_INTEGER a;a.QuadPart=0x152d000;
BYTE mem[512];
memset(mem,8,512);
SetFilePointer(hDevice,a.LowPart,&a.HighPart,FILE_BEGIN);
WriteFile(hDevice,mem,512,&dwRet,0);
CloseHandle(hDev);
}
就是这么简单,即使这个时候分区内有程序在运行,也可以ring3直接写入。
等等,别高兴得太早,以上试验都是在非系统盘,那么系统盘呢?回答可能要让大家失望了,系统盘不允许上面那样操作。
所以,ring3下硬盘只能写到非系统所在分区。
当然,话也不是绝对,可能仍有办法实现,不过需要大家研究了。
②写入的位置不在分区内或无法识别的文件系统。
相对上面的①,②对于实际操作还不是很成熟,我仅有模糊的一点想法。
如图,上面的这个分区系统还能识别吗?
当然不可以,那么,对于这个分区的内容,系统将不再保护,所以,想如何修改那就随心所欲了,很开心的告诉大家,系统分区也是可以这么涂写的。不过呢?由于缓存的原因,在重启动前涂改不生效,而重启动?系统又启动不了。怎么破解这个死局,还要依靠大家的聪明才智了。
下面写点结论,win7 ring3写硬盘是可以的,但是,想要自由,还需要开动脑筋。