探索黑客技术攻防,实战研究与安全创新

导航菜单

Win7 ring3直接写硬盘(系统硬盘读写锁定扇区问题)

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写硬盘是可以的,但是,想要自由,还需要开动脑筋。