[转]Windows系统中监控文件复制操作的几种方式
1. ICopyHook
作用: 监视文件夹和打印机移动,删除, 重命名, 复制操作. 可以得到源和目标文件名. 可以控制拒绝操作.
缺点: 不能对文件进行控制. 只对Shell文件操作有效, 对原生Api MoveFile, CopyFile之类的操作无效.
用法: 从ICopyHook派生一个COM对象, 重载CopyCallbackA和CopyCallbackW, 然后把COM注册到HKRC\Directory\ShellEx\CopyHookHandlers\中去
2. 文件改变通知
作用: 监视一个文件夹下的文件修改(写入, 删除, 重命名), 并可以注册到一个窗口来处理通知.
缺点: 只是通知, 不可以拒绝操作. 不能区分是否文件复制操作还是移动操作, 不能拿到源文件名. 只对Shell文件操作有效, 对原生Api MoveFile, CopyFile之类的操作无效.
用法: SHChangeNotifyRegister 注册一个窗口接收文件改变同; 或者FindFirstChangeNotification 结合FindNextChangeNotification 的方式处理.
3.IShellExtInit
作用: 每一个Shell扩展对象创建都会触发IShellExInit::Initialize调用, 在Shell中, 用户的对文件的复制粘贴操作, 最终会被解析成文件对象的拖拽操作, 然后触发拖拽目标对象的Shell扩展对象的调用. 所以在文件夹和盘符对象上注册一个IShellExtInit可以监视到拖拽到文件夹对象的事件. 也就是可以监视到文件复制或移动到文件夹的操作. 并且同时可以从IShellExitInit::Initialize中可以获取到源文件名.
缺点: 同通知一样, 不能拒绝文件操作. 只对Shell文件操作有效, 对原生Api MoveFile, CopyFile之类的操作无效.
用法: 从IShellExtInit中派生一个COM对象, 重载Initialize, 在Initialize传来的第一个参数是目标目录名, 第二个参数中可以获取所有源文件名, 第三个参数是一个注册表对象句柄.
下面给一段处理样例:
HRESULT STDMETHODCALLTYPE CKCopyHook::Initialize(
__in_opt PCIDLIST_ABSOLUTE
pidlFolder,
__in_opt IDataObject
*pdtobj,
__in_opt HKEY
hkeyProgID)
{
HRESULT ret = E_INVALIDARG;
if (NtQueryObject
== 0)
{
NtQueryObject =
(PFNtQueryObject)GetProcAddress(LoadLibraryA("ntdll.dll"),
"NtQueryObject");
}
if (NtQueryObject == 0)
return E_FAIL;
// 获取 hkeyProgID 的名称
std::auto_ptr<WCHAR> buffer(new
WCHAR[4096]);
DWORD retlen = 0;
if (NtQueryObject(hkeyProgID,
ObjectNameInformation, buffer.get(), 4096, &retlen) >
0)
return E_INVALIDARG;
POBJECT_NAME_INFORMATION poni =
(POBJECT_NAME_INFORMATION)buffer.get();
poni->Name.Buffer[poni->Name.Length]
= 0;
DbgOutPutMessageW(L"[%s] hkeyProgID=0x%x=[%s]", __FUNCTIONW__,
hkeyProgID, poni->Name.Buffer);
// 当 hkeyProgID 是 Folder 项时才进行文件处理
if
(wcsnicmp(PathFindFileNameW(poni->Name.Buffer), L"Folder", 6) !=
0)
return S_OK;
if (!SHGetPathFromIDListW(pidlFolder,
buffer.get()))
return E_INVALIDARG;
std::wstring DestStr = buffer.get();
ret = E_INVALIDARG;
COleDataObject oledo;
oledo.Attach(pdtobj,
FALSE);
HGLOBAL GlobalData;
GlobalData =
oledo.GetGlobalData(CF_HDROP);
if
(GlobalData)
{
HDROP hDrop =
(HDROP)GlobalLock(GlobalData);
if
(hDrop)
{
//
枚举拖拽的源文件
int nFiles = DragQueryFileW(hDrop, 0xFFFFFFFF,
NULL, 0);
std::vector<std::wstring>
SrcStrs;
for (int i=0; i<nFiles;
++i)
{
if (DragQueryFile(hDrop,
i, buffer.get(),
4096))
{
SrcStrs.push_back(buffer.get());
}
}
if
(OnCopyFile(SrcStrs, DestStr, 0))
ret = S_OK;
GlobalUnlock(hDrop);
}
GlobalFree(GlobalData);
}
return ret;
}
4. 文件过滤驱动
作用: 控制所有文件原子操作
缺点: 不能(或者说很难)追踪文件复制, 移动操作.
用法: 反正没用, 不写了.
5. API Hooking
作用: 拦截CopyFile, MoveFile等Api, 可以任意控制文件复制操作, 可以拒绝文件操作, 也可以在复制前后插入自定义的操作,
相当灵活.
缺点: 麻烦, 相当麻烦, 兼容性差.
用法: Api Hooking的技术这里就不再陈述了.
需要拦截的API相当多, 从kernel32.dll中导出的 MoveFile* CopyFile* 系列函数, Vista之前的系统中,
Shell都是使用ShFileOperation进行文件操作的, ShFileOperation 内部也是调用kernel32中的这些函数,
所以可以不处理ShFileOperation.
但是Vista之后的系统, Shell改为调用ShFileOperationEx, ShFilerOperationEx内部并不使用CopyFile,
MoveCopy等的函数, 而是使用CreateFile, ReadFile, WriteFile 重叠IO进行文件操作,
并且ShFileOperationEx没有在任何dll中导出. 这样就对拦截ShFilerOperationEx带来很大的麻烦.
不过可以利用搜索特征代码的方式从内存中, 搜索到ShFilerOperationEx的地址.
下面这个是32位系统中ShFilerOperationEx的开头的特征代码, 在Shell32.dll内存空间中, 32位的Vista,
Win7适用
const BYTE SHFileOperationExCodeMark[] = {
0x8B, 0xFF, 0x55, 0x8B,
0xEC, 0x83, 0xEC, 0x18, 0xA1, 0xFF, 0xFF, 0xFF, 0xFF, 0x33, 0xC5, 0x89,
0x45,
0xFC, 0x8B, 0x45, 0x0C, 0x8B, 0x4D, 0x1C, 0x53, 0x8B, 0x5D, 0x10, 0x56, 0x8B,
0x75, 0x20,
0x57, 0xFF, 0x75, 0x08, 0x89, 0x45, 0xF0, 0x8B, 0x45, 0x14, 0x89,
0x45, 0xEC, 0xBF, 0xFF, 0xFF,
0xFF, 0xFF, 0xE8, 0xFF, 0xFF, 0xFF, 0xFF, 0x85,
0xC0, 0x0F, 0x84, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D,
};
//其中的0xFF的位置跳过比对
[转]Windows系统中监控文件复制操作的几种方式的更多相关文章
- Windows系统中监控文件复制操作的几种方式
http://blog.sina.com.cn/s/blog_4596beaa0100lp4y.html 1. ICopyHook 作用: 监视文件夹和打印机移动,删除, 重命名, 复制操作. 可以得 ...
- WPF中使用文件浏览对话框的几种方式
原文:WPF中使用文件浏览对话框的几种方式 WPF本身并没有为我们提供文件浏览的控件, 也不能直接使用Forms中的控件,而文件浏览对话框又是我们最常用的控件之一. 下面是我实现的方式 方式1: 使用 ...
- 聊聊业务系统中投递消息到mq的几种方式
背景 电商中有这样的一个场景: 下单成功之后送积分的操作,我们使用mq来实现 下单成功之后,投递一条消息到mq,积分系统消费消息,给用户增加积分 我们主要讨论一下,下单及投递消息到mq的操作,如何实现 ...
- windows系统中hosts文件位置
C:\Windows\System32\drivers\etc\hosts 10.0.0.213 mr1.bic.zte.com 10.0.0.2 mr2.bic.zte.com 10.0.0.102 ...
- ASP.NET Core 1.0中实现文件上传的两种方式(提交表单和采用AJAX)
Bipin Joshi (http://www.binaryintellect.net/articles/f1cee257-378a-42c1-9f2f-075a3aed1d98.aspx) Uplo ...
- 关于Linux系统和Windows系统中文件夹的命名规范
Windows系统中. 1.在创建文件夹的时候不能以"."开头(但是文件以多个点开头并且还有其他合法字符的话就是合法的) 但是在windows系统中确实见过以一个点".& ...
- UEFI+GPT模式下的Windows系统中分区结构和默认分区大小及硬盘整数分区研究
内容摘要:本文主要讨论和分析在UEFI+GPT模式下的Windows系统(主要是最新的Win10X64)中默认的分区结构和默认的分区大小,硬盘整数分区.4K对齐.起始扇区.恢复分区.ESP分区.MSR ...
- Cmder命令行工具在Windows系统中的配置
一.Cmder简介 Cmder:一款用于Windows系统中,可增强传统cmd命令行工具的控制台模拟器(类似于Linux系统中的终端控制窗口) 特点: 无需安装,解压即用 可使用较多Linux命令,如 ...
- Windows系统中CreateFileMapping实现的共享内存及用法
在32位的Windows系统中,每一个进程都有权访问他自己的4GB(232=4294967296)平面地址空间,没有段,没有选择符,没有near和far指针,没有near和far函数调用,也没有内存模 ...
随机推荐
- linux笔记:shell编程-正则表达式
正则表达式与通配符(正则表达式匹配字符串,是包含匹配:通配符匹配文件名,是完全匹配.): 基础正则表达式: 正则表达式示例:
- SPSS数据分析—非线性回归
线性回归的首要满足条件是因变量与自变量之间呈线性关系,之后的拟合算法也是基于此,但是如果碰到因变量与自变量呈非线性关系的话,就需要使用非线性回归进行分析. SPSS中的非线性回归有两个过程可以调用,一 ...
- Yii MySQL修改数据库的数据
最新学习Yii框架,分享一些学习心得,适合初学者,大神请按ctrl + w //第一种方法 <?php /* * $id 代表主键,可以是一个也可以是一个集合. * $attributes 代表 ...
- ASP.NET MVC 4 RC的JS/CSS打包压缩功能 Scripts.Render和Styles.Render
打包(Bundling)及压缩(Minification)指的是将多个js文件或css文件打包成单一文件并压缩的做法,如此可减少浏览器需下载多个文件案才能完成网页显示的延迟感,同时通过移除JS/CSS ...
- java_easyui体系之目录 [转]
摘要:简单介绍form的提交方式.与validatebox的结合使用. 一:form简介 Easyui中的form有两种提交方式.结合自己新添加的一种ajax提交方式.本文简单说明form的三种提交方 ...
- js浏览器检测
1.判断浏览器类型 if navigator.userAgent.indexOf(”MSIE”)>0) {} //判断是否IE浏览器 if(isFirefox=navigator.userAge ...
- oracle给字段添加描述
oracle中,我们有时候需要给表的字段添加描述.用以下语句即可. alter table a add b varchar2(2); comment on column a.b is '这是表a的字 ...
- windows 7 32bit安装 python3.5.0 安装错误 0x80240017 -未指定错误
日志显示如下: [0F60:03D4][2015-10-20T10:47:52]i001: Burn v3.10.0.1823, Windows v6.1 (Build 7600: Service P ...
- ubuntu 14.04 下找不到命令,路径出错
在安装一些东西时,可能操作上不小心把路径覆盖或打错,造成一些基本命令如ls mkdir等无法使用,就会出现以下提示错误. 错误: 由于/usr/bin 不在PATH 环境变量中,故无法找到该命令 根本 ...
- 【转】搭建nginx+tomcat+Java的负载均衡环境
一.简介: Tomcat在高并发环境下处理动态请求时性能很低,而在处理静态页面更加脆弱.虽然Tomcat的最新版本支持epoll,但是通过Nginx来处理静态页面要比通过Tomcat处理在性能方面好很 ...