Windows系统的文件重定向机制

这几天在分析病毒的时候发现,病毒在执行遍历文件操作的时候,会调用Wow64DisableWow64FsRedirection和Wow64RevertWow64FsRedirection这两个API,
MSDN网址:https://docs.microsoft.com/zh-cn/windows/win32/api/wow64apiset/nf-wow64apiset-wow64revertwow64fsredirection
经过查阅资料发现,这两个API函数的作用分别是禁止调用线程的文件系统重定向、恢复调用线程的文件系统重定向。这个时候问题由来了,文件系统重定向是个什么东西?有什么用呢?为什么病毒在运行的时候,要禁用文件系统重定向呢?又为什么禁用之后还要开启?

查阅资料之后,有所了解,姑且写出来,供大家参阅
1、文件重定向机制是Windows64位系统存在的一种文件访问机制;
2、在Windows64位系统中,在C:Windows目录下存在System32和SysWow64两个文件夹,但是需要注意的是System32文件夹里边存放的是64位的文件以及DLL,而SysWow64文件夹下存放的是32位DLL。
3、重要的是,我们要知道64位Windows通过System32和SysWoW64两件文件夹来区分64位和32位的系统文件。
4、当32位的程序尝试访问System32文件夹的时候,重定向机制就上线了,当32位程序试图访问System32下的文件的时候就会被重定向到SysWow64文件夹下
5、那么最关键的问题来了,如果说我们32位的程序就偏偏想访问我们的System32目录下的东西呢?其实很好解决,Windows再提供重定向机制的同时,也为我们提供了一组这样的API函数,用来禁止和开启Windows的重定向。在默认情况下,Windows系统的重定向机制是开启的,但是当我们要用32位的程序去放问System32 目录下的文件的时候,可以使用禁止文件重定向机制的API函数,这样就可以直接访问到System32目录下的文件,但是需要注意一点,完成访问之后必须立刻重新启用文件系统重定向机制
6、最后需要主意一点,禁用文件系统的从定向值在线程当中有效,也就是说你在线程1禁用之后并不影响线程2;
7、如何在不禁用文件系统重定向机制的情况下,用32位的程序访问System32文件夹的内容,直接访问SysNative文件夹就好了,SysNative这个文件夹是不能直接找到的,它是一个虚拟的文件夹。
后附上两种实现的方法;(代码来源:查看网上资源和MSDN,在再加上自己的调试):
禁用重定向的方法:

#include <Windows.h>
#include <string>
#include <tchar.h>
#include <Shlwapi.h>
#pragma comment(lib,"Shlwapi.lib")  
int main()
{    std::wstring strFile = L"C://Windows//System32//QQUrlMgr.exe";    // 64位系统下 system32 文件系统重定向   
	PVOID OldValue = NULL;    
	Wow64DisableWow64FsRedirection(&OldValue);                 //禁用文件系统重定向  
	if (::PathFileExists(strFile.c_str()))    
		{        
			::MessageBox(NULL, _T("文件存在"), _T("Good"), MB_OK);   
		}    
	else    
	{        
		::MessageBox(NULL, _T("文件不存在"), _T("Opps"), MB_OK);   
	}   
	Wow64RevertWow64FsRedirection(OldValue);  //启用文件系统重定向

	return EXIT_SUCCESS;
}

不禁用重定向的方法:

#include <Windows.h>
#include <string>
#include <tchar.h>
#include <Shlwapi.h>
#pragma comment(lib,"Shlwapi.lib")  
int main()
{   
	int c;
	std::wstring strFile = L"C://Windows//SysNative//QQUrlMgr.exe";    
	if (::PathFileExists(strFile.c_str()))   
	{        ::MessageBox(NULL, _T("文件存在"), _T("Good"), MB_OK);
			printf("adsdass");
			Sleep(1000);
	}   
	else    
	{        ::MessageBox(NULL, _T("文件不存在"), _T("Opps"), MB_OK);    }    
	return EXIT_SUCCESS;
}

如果有什么不太对的地方希望大家可以指正

重定向系统各临时文件夹到另外盘符 首先要在“开始”——“运行”内输入“regedit”打开注册表编辑器,然后要在“文件”下拉菜单中的“导出”功能备份好注册表,以防万一,接着在左侧窗口依次打开: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders 在右侧窗口里,你看到的“名称”就代表那些特殊的文件夹,“数据”就是它们所对应的默认存储路径。修改默认的路径就可以让你的桌面文件夹移动了,下面是所有的. 下面介绍一下各个“名称”所代表的文件夹 名称 含义 默认路径 AppData 应用程序数据目录 C:\Documents and Settings\User name\Application Data Cookies Cookies路径 C:\Documents and Settings\User name\Cookies Desktop 桌面路径 C:\Documents and Settings\User name\桌面 Favorites 收藏夹 C:\Documents and Settings\User name\Favorites NetHood NetHood路径 C:\Documents and Settings\User name\NetHood Personal 我的文档 C:\Documents and Settings\User name\My Documents PrintHood 打印 C:\Documents and Settings\User name\PrintHood Recent 文档项路径 C:\Documents and Settings\User name\Recent SendTo SendTo路径 C:\Documents and Settings\User name\SendTo Start Menu 开始菜单路径 C:\Documents and Settings\User name\「开始」菜单 Templates 新建文件目录 C:\Documents and Settings\User name\Templates Programs 程序菜单路径 C:\Documents and Settings\User name\「开始」菜单\程序 Startup 启动路径 C:\Documents and Settings\User name\「开始」菜单\程序\启动 History 网页历史记录 C:\Documents and Settings\ User name \Local Settings\History My Pictures 图片收藏 C:\Documents and Settings\User name\My Documents\My Pictures My Music 我的音乐 C:\Documents and Settings\User name\My Documents\My Music My Video 我的视频 C:\Documents and Settings\User name\My Documents\My Videos Cache Internet临时文件夹 C:\ Documents and Settings\User name \Temporary Internet Files 这些文件夹称为Shell文件夹 其中“User name”为当前用户的名称 了解了对应的文件夹,就可以根据自己的需要去更改对应的路径了。(千万不要在这儿改啊,那样可就瞎忙乎了,系统重起后它会恢复成原来的路径) 在同一层中你可以看到一个“User Shell Folders”的子键,即在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ User Shell Folders 这里包括了用户定制的所有Shell文件夹的值项。只要通过修改“数据”,就可以改变它们的存储路径。双击需要修改的名称,在弹出的“编辑字符串”的“数值数据”里填上你要更改的完整路径,按下“确定”就完成了。如果没有你需要的,可以在右边窗口单击鼠标右键,选择“新建”菜单中的“字符串值”命令,对应上表,添加一个用于Shell文件夹的字符串值。 在上面的文件夹中,并没有outlook的通讯簿和邮件存放路径,它们分别在 通讯簿路径: HKEY_CURRENT_USER\Software\Microsoft\WAB\WAB4\Wab File Name主键下,将
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值