请问全局钩子如何钩住系统的文件操作,例如复制和剪切

qq14923349 2011-05-04 10:35:33
我需要监控电脑的所有文件操作,

请不要推荐WINAPI --ReadDirectoryChangesW

请不要推荐filemon驱动级


我很简单 就需要钩住 复制和剪切 新建 修改等文件操作


我自己写过键盘钩子和鼠标钩子
但是如何截取 文件操作的消息?
能否给个例子

谢谢了
...全文
512 47 打赏 收藏 转发到动态 举报
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangmengvv 2013-08-15
  • 打赏
  • 举报
回复
引用 16 楼 Lactoferrin 的回复:
改了一点

#include<windows.h>
#include<Shlobj.h>
#pragma comment(lib,"Shell32.lib")
using namespace std;

long __stdcall WindowProc(HWND hwnd,unsigned int uMsg,PIDLIST_ABSOLUTE*wParam,long lParam)
{
	static wchar_t Buffer[2048];static HANDLE hStdOut;unsigned long count;
	if(uMsg==WM_USER+123)
	{
		switch(lParam)
		{
			case SHCNE_RENAMEITEM:wcscpy(Buffer,L"SHCNE_RENAMEITEM:");break;
			case SHCNE_CREATE:wcscpy(Buffer,L"SHCNE_CREATE:");break;
			case SHCNE_DELETE:wcscpy(Buffer,L"SHCNE_DELETE:");break;
			case SHCNE_MKDIR:wcscpy(Buffer,L"SHCNE_MKDIR:");break;
			case SHCNE_RMDIR:wcscpy(Buffer,L"SHCNE_RMDIR:");break;
			case SHCNE_MEDIAINSERTED:wcscpy(Buffer,L"SHCNE_MEDIAINSERTED:");break;
			case SHCNE_MEDIAREMOVED:wcscpy(Buffer,L"SHCNE_MEDIAREMOVED:");break;
			case SHCNE_DRIVEREMOVED:wcscpy(Buffer,L"SHCNE_DRIVEREMOVED:");break;
			case SHCNE_DRIVEADD:wcscpy(Buffer,L"SHCNE_DRIVEADD:");break;
			case SHCNE_NETSHARE:wcscpy(Buffer,L"SHCNE_NETSHARE:");break;
			case SHCNE_NETUNSHARE:wcscpy(Buffer,L"SHCNE_NETUNSHARE:");break;
			case SHCNE_ATTRIBUTES:wcscpy(Buffer,L"SHCNE_ATTRIBUTES:");break;
			case SHCNE_UPDATEDIR:wcscpy(Buffer,L"SHCNE_UPDATEDIR:");break;
			case SHCNE_UPDATEITEM:wcscpy(Buffer,L"SHCNE_UPDATEITEM:");break;
			case SHCNE_SERVERDISCONNECT:wcscpy(Buffer,L"SHCNE_SERVERDISCONNECT:");break;
			case SHCNE_UPDATEIMAGE:wcscpy(Buffer,L"SHCNE_UPDATEIMAGE:");break;
			case SHCNE_DRIVEADDGUI:wcscpy(Buffer,L"SHCNE_DRIVEADDGUI:");break;
			case SHCNE_RENAMEFOLDER:wcscpy(Buffer,L"SHCNE_RENAMEFOLDER:");break;
			case SHCNE_FREESPACE:wcscpy(Buffer,L"SHCNE_FREESPACE:");break;
        }
		if(SHGetPathFromIDListW(*wParam,Buffer+wcslen(Buffer)))
		{
			WriteConsoleW(hStdOut,Buffer,wcslen(Buffer),&count,0);
		}
		if(SHGetPathFromIDListW(wParam[1],Buffer))
		{
			WriteConsoleW(hStdOut,L"->",2,&count,0);
			wcscat(Buffer,L"\n");
			WriteConsoleW(hStdOut,Buffer,wcslen(Buffer),&count,0);
		}else WriteConsoleW(hStdOut,L"\n",1,&count,0);
		return 0;
	}else if(uMsg==WM_CREATE)
	{
		hStdOut=GetStdHandle(STD_OUTPUT_HANDLE);
		return 0;
	}else
	return DefWindowProcW(hwnd,uMsg,(WPARAM)wParam,lParam);
}

int wmain(int argc, _TCHAR* argv[])
{
static WNDCLASSEXW wc={sizeof(WNDCLASSEXW),0,(WNDPROC)WindowProc,0,0,0,0,0,0,0,L"a",0};
wc.hInstance=GetModuleHandleW(0);
HWND hwnd=CreateWindowExW(0,(wchar_t*)RegisterClassExW(&wc),0,0,0,0,0,0,HWND_MESSAGE,0,0,0);
static SHChangeNotifyEntry shcne={0,1};
SHGetFolderLocation(0,CSIDL_DESKTOP,0,0,const_cast<_ITEMIDLIST**>(&shcne.pidl));
ULONG id=SHChangeNotifyRegister(hwnd,SHCNRF_InterruptLevel|SHCNRF_ShellLevel|SHCNRF_RecursiveInterrupt,SHCNE_ALLEVENTS,WM_USER+123,1,&shcne);
if(!id)return 1;
MSG msg;
while(GetMessageW(&msg,0,0,0))DispatchMessageW(&msg);
return 0;
}
您的这个方法能和hook相结合吗?
niushitang 2012-12-01
  • 打赏
  • 举报
回复
我也是和楼主同样的问题。我HOOK CopyFileEx。CopyFileA 。SHFileOperation这三个函数系统什么都没反馈给我。我在Win7上。是否和操作系统有关系。
qq14923349 2011-05-09
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 lactoferrin 的回复:]
移动文件可以hook NtSetInformationFile
[/Quote]

你的代码我在VS2008试了 很不错 就是ctrl+c复制没出事件

另外我用API挂接 复制倒是拦截到
但是弹出个\\.\shadow 什么意思哦
qq14923349 2011-05-09
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 lactoferrin 的回复:]
移动文件可以hook NtSetInformationFile
[/Quote]

你的代码我在VS2008试了 很不错 就是ctrl+c复制没出事件

另外我用API挂接 复制倒是拦截到
但是弹出个\\.\shadow 什么意思哦
qq14923349 2011-05-09
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 lactoferrin 的回复:]
移动文件可以hook NtSetInformationFile
[/Quote]

你的代码我在VS2008试了 很不错 就是ctrl+c复制没出事件

另外我用API挂接 复制倒是拦截到
但是弹出个\\.\shadow 什么意思哦
Lactoferrin 2011-05-06
  • 打赏
  • 举报
回复
文件/文件夹操作不是用消息钩子的
qq14923349 2011-05-06
  • 打赏
  • 举报
回复
请问hook文件/文件夹操作

WH_SHELL 可以吗?

还是其他消息
qq14923349 2011-05-06
  • 打赏
  • 举报
回复
我刚好碰上8楼的情况
8楼能不能把新建 复制 粘贴 剪切 移动等对应的API 映射都发给我
那我就太感激了

:我也碰到右键获取不到CreateFile:: -_-!!!
蒙飞鸿 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 qq14923349 的回复:]
引用 39 楼 mengfeihong 的回复:
拦截复制比较容易,但是剪切,当初试了很多API都不行,如果是CreateFile的话,太多系统动作走这个API了,不知道怎么判断其中哪个是剪切。


复制你是怎么拦截的
剪切分为 复制 和创建不行吗?
[/Quote]
记得是CopyFileExW吧,移动、剪切是不走这个API的
Lactoferrin 2011-05-06
  • 打赏
  • 举报
回复
移动文件可以hook NtSetInformationFile
qq14923349 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 mengfeihong 的回复:]
拦截复制比较容易,但是剪切,当初试了很多API都不行,如果是CreateFile的话,太多系统动作走这个API了,不知道怎么判断其中哪个是剪切。
[/Quote]

复制你是怎么拦截的
剪切分为 复制 和创建不行吗?
蒙飞鸿 2011-05-06
  • 打赏
  • 举报
回复
拦截复制比较容易,但是剪切,当初试了很多API都不行,如果是CreateFile的话,太多系统动作走这个API了,不知道怎么判断其中哪个是剪切。
Lactoferrin 2011-05-06
  • 打赏
  • 举报
回复
NtCreateFile,NtOpenFile,NtReadFile,NtWriteFile.........
qq14923349 2011-05-06
  • 打赏
  • 举报
回复
就是监视计算机的所有操作

不过本地或者远程的操作全部记录下来···-_-!!!

这个不算很难吧
Lactoferrin 2011-05-06
  • 打赏
  • 举报
回复
你到底要监视什么?远程复制肯定不会用CopyFile的
qq14923349 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 lactoferrin 的回复:]
复制文件不一定用的CopyFile
[/Quote]
我是在桌面ctrl+c 复制的
然后CreateFile响应了,CopyFile一直没响应
要是能响应就好了
我就可以记录下来
Lactoferrin 2011-05-06
  • 打赏
  • 举报
回复
复制文件不一定用的CopyFile
Lactoferrin 2011-05-06
  • 打赏
  • 举报
回复
复制文件一定用的CopyFile,CopyFile连进度条都没有
你SetWindowsHookEx应该只是用来注入dll,对tlntsvr.exe,svchost.exe无效的

我说的NtCreateFile是ntdll.dll中用户模式的stub
qq14923349 2011-05-06
  • 打赏
  • 举报
回复
NtCreateFile
这个是ring0层吗?
做这个不是要脱层皮?

我现在用detour挂ring3的CreateFile CopyFile
但是CopyFile不起作用
倒是复制的时候 CreateFile有通知 (基本所有操作CreateFile都有通知)

我是H_SHELL
::SetWindowsHookEx( WH_SHELL , MyShellProc ,(HINSTANCE)g_hInst, 0);

有点小郁闷
Lactoferrin 2011-05-06
  • 打赏
  • 举报
回复
vc6太老了,有些宏定义没有

你还是通过api hook监视对NtCreateFile,NtOpenFile,NtReadFile,NtWriteFile等的操作,不过比较麻烦
加载更多回复(27)
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 【运算单元构造实验报告】运算单元是计算机硬件系统中的关键构成部分,主要承担执行算术运算和逻辑运算的任务。在本次实验中,我们着重探讨了带有累加器的运算单元的设计,涵盖了溢出识别、有符号数值与无符号数值运算的差异性,以及采用补码方式进行的加法与减法运算的实现机制。 一、实验目标 1. 掌握运算单元的基本构造,理解带有累加器的运算单元的具体实现途径。 2. 学习并领会溢出检测的机制,能够设计并构建溢出检测电路,用以判定运算结果是否超出了数据类型的表示范畴。 3. 明辨有符号数值和无符号数值运算的不同特性,把握它们在运算过程中各自的处理方法。 4. 熟练掌握基于补码方式的加法与减法运算的执行,理解补码形式下的溢出判定准则。 5. 熟悉运算单元内部的数据传输路线,明晰数据在运算过程中的流转路径。 6. 设计一个能够支持有符号数值与无符号数值运算、补码加法/减法运算以及有符号数值溢出检测的运算单元电路。 二、实验仪器 采用JZYL—Ⅱ型计算机组成原理实验装置,配备2片74181运算单元芯片作为算术逻辑单元(ALU),2片74LS373用作八位D型锁存器,并辅以一些基础门电路和多路选择器来完成电路设计。 三、实验内容 1. 运用片74181构建一个8位运算单元,负责处理数据的高4位与低4位。 2. 设计并实现溢出检测电路,确保在有符号数值与无符号数值的加法运算中均能准确识别溢出状况。 3. 通过74LS373增加累加器功能,使运算结果得以保存。 4. 将所有设计整合,利用多路选择器来支持有符号数值与无符号数值的加法/减法运算。 四、实验电路 1. 8位运算单元由2片74181构成,通过控制...

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧