1、Win7 ring3 直接写硬盘的简单分析(扫盲)银砾石部分内容摘自 MSDN。Win7 ring3 可以直接写硬盘吗?不可以。相信很多人都有这个印象,有些人是道听途说,有些则是亲身试过,很多对此感兴趣的人可能都看过 MJ0011 的“VISTADWORD dwRet;LARGE_INTEGER a;a.QuadPart=1024*1024*16;BYTE mem512;memset(mem,9,512);SetFilePointer(hDev,a.LowPart,WriteFile(hDev,mem,512,CloseHandle(hDev);很快我们发现,成功了。成功来得如此迅速,让我们有
2、点措手不及。于是,不满足的我们,开始了更多的试验:更改某个文件的内容。首先我们先找到需要更改的文件 fscmd.exe,地址为 0x152D 000(通过 winhex) ,然后将上面代码的地址改为 0x152D000,运行。运行后不出所料,成功了,fscmd.exe 被成功更改了,ring3 下直接写磁盘,还是可以的。当然,我们不可能就这样满足,如果 fscmd.exe 正在运行呢?还可以更改吗?可惜了,不能,也就是说独占锁定失败了。那么,还有其他的办法吗?这是刚才的结果?不是,这是在 fscmd.exe 运行的时候的结果。这次,用了新的办法。情况 4:已经通过锁定请求或卸载请求显式锁定卷。
3、可以算是情况 4。代码如下:HANDLE hDevice = CreateFile(“.d:“, / drive to openGENERIC_ALL, / no access to the driveFILE_SHARE_READ | / share modeFILE_SHARE_WRITE,NULL, / default security attributesOPEN_EXISTING, / disposition0, / file attributesNULL); / do not copy file attributesif (hDevice = INVALID_HANDLE_VALU
4、E) / cannot open the drivereturn ;DWORD junk;DeviceIoControl(hDevice, / device to be queried(DWORD)FSCTL_DISMOUNT_VOLUME, / operation to performNULL, 0, / no input bufferNULL, 0, / output buffer/ synchronous I/Oif(hDevice!=INVALID_HANDLE_VALUE)DWORD dwRet;LARGE_INTEGER a;a.QuadPart=0x152d000;BYTE me
5、m512;memset(mem,8,512);SetFilePointer(hDevice,a.LowPart,WriteFile(hDevice,mem,512,CloseHandle(hDev);就是这么简单,即使这个时候分区内有程序在运行,也可以 ring3 直接写入。等等,别高兴得太早,以上试验都是在非系统盘,那么系统盘呢?回答可能要让大家失望了,系统盘不允许上面那样操作。所以,ring3 下硬盘只能写到非系统所在分区。当然,话也不是绝对,可能仍有办法实现,不过需要大家研究了。写入的位置不在分区内或无法识别的文件系统。相对上面的,对于实际操作还不是很成熟,我仅有模糊的一点想法。如图,上面的这个分区系统还能识别吗?当然不可以,那么,对于这个分区的内容,系统将不再保护,所以,想如何修改那就随心所欲了,很开心的告诉大家,系统分区也是可以这么涂写的。不过呢?由于缓存的原因,在重启动前涂改不生效,而重启动?系统又启动不了。怎么破解这个死局,还要依靠大家的聪明才智了。下面写点结论,win7 ring3 写硬盘是可以的,但是,想要自由,还需要开动脑筋。