如何禁止读写某一个文件或文件夹?

SunGrazer 2003-10-15 05:03:32
在进入RING0后,要如何禁止读写某一个文件或文件夹?是不是用HOOK检测?发现后如何禁止读写某一个文件或文件夹?(我用的是VC)
...全文
277 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
SunGrazer 2003-10-18
  • 打赏
  • 举报
回复
过滤驱动,FILEMON,是什么?可不可以介绍一下?给点资料
wowocock 2003-10-15
  • 打赏
  • 举报
回复
写个过滤驱动,参考FILEMON
紫郢剑侠 2003-10-15
  • 打赏
  • 举报
回复
//杀毒软件的奥秘
//市面上所有号称"虚拟机","防火墙"的实时监控杀毒软件无一不是使用的IFSHOOK技术.但是同时
//也有一些朋友不断写MAIL给我打听如何实现读写的监控.下面给出用VTOOLSD写的代码.也就是所
//有实时杀毒软件的奥秘.同时,很多拦截文件操作的软件,例如对目录加密,文件加密等,也采用了
//雷同的技术. 由于代码十分简单,不分析了.

//作者:陆麟
//=============================================================================
//
//By Lu Lin 2000.5.10
// Apply with VtoolsD 3.01
// DDK version is available if requested.
//Abstract:
// Install a IFS hook, monitoring any read and write access
//
//=============================================================================
// IFSHOOK.c - main module for IFSHOOK

#define DEVICE_MAIN
#include "ifshook.h"
#undef DEVICE_MAIN

//typedef EventHdl(pevent pev,pioreq pir);

typedef struct _Monitored_Files{
struct _Monitored_Files *pNext_Monitored_Files;//pointer to next struct
struct _Monitored_Files *pPre_Monitored_Files;//pointer to previous struct
int sfn;//system file number
int open_count;
char path[260]; //ansi path name
}_Monitored_Files,*pMonitored_Files;

//
//Declare virtual device
//
Declare_Virtual_Device(IFSHOOK)

_Monitored_Files Monitored_Files;
ppIFSFileHookFunc PrevHook;

DefineControlHandler(SYS_VM_INIT, OnSysVMInit);
DefineControlHandler(SYS_DYNAMIC_DEVICE_INIT, OnSysDynamicDeviceInit);
DefineControlHandler(SYS_DYNAMIC_DEVICE_EXIT, OnSysDynamicDeviceExit);
DefineControlHandler(SYS_VM_TERMINATE, OnSysVMTerminate);

PCHAR ConvertPath( int drive, path_t ppath, PCHAR fullpathname )
{
int i = 0;
_QWORD result;

//
// Stick on the drive letter if we know it.
//
if( drive != 0xFF ) {

fullpathname[0] = drive+'A'-1;
fullpathname[1] = ':';
i = 2;
}
UniToBCSPath( &fullpathname[i], ppath->pp_elements, 260 , BCS_WANSI, &result );
return( fullpathname );
}

pMonitored_Files IsFileOpened(int i){
pMonitored_Files p=&Monitored_Files;

while (p){
if (i==p->sfn){
return p;
}
p=p->pNext_Monitored_Files;
}
return 0;
}

BOOL ControlDispatcher(
DWORD dwControlMessage,
DWORD EBX,
DWORD EDX,
DWORD ESI,
DWORD EDI,
DWORD ECX)
{
START_CONTROL_DISPATCH

ON_SYS_VM_INIT(OnSysVMInit);
ON_SYS_DYNAMIC_DEVICE_INIT(OnSysDynamicDeviceInit);
ON_SYS_DYNAMIC_DEVICE_EXIT(OnSysDynamicDeviceExit);

END_CONTROL_DISPATCH

return TRUE;
}

int _cdecl MyIfsHook(pIFSFunc pfn, int fn, int Drive, int ResType,
int CodePage, pioreq pir)
{
int retvar,i;
char fullpathname[260];
_Monitored_Files *FileEntry;
switch(fn){
case IFSFN_OPEN:{
retvar=(*PrevHook)(pfn, fn, Drive, ResType, CodePage, pir);
ConvertPath( Drive, pir->ir_ppath, fullpathname );
FileEntry=IsFileOpened(pir->ir_sfn);
if (FileEntry){
FileEntry->open_count++;
}else{
FileEntry=&Monitored_Files;
while(1){
if (FileEntry->pNext_Monitored_Files){
FileEntry=FileEntry->pNext_Monitored_Files;
}
else{
break;
}
}
FileEntry->pNext_Monitored_Files=\
HeapAllocate( sizeof(_Monitored_Files),HEAPZEROINIT);
FileEntry->pNext_Monitored_Files->pPre_Monitored_Files=FileEntry;
FileEntry=FileEntry->pNext_Monitored_Files;
FileEntry->sfn=pir->ir_sfn;
FileEntry->open_count=1;
memcpy(FileEntry->path,fullpathname,260);
}
return retvar;
}

case IFSFN_READ:{
//Do something here,
//eg. Decrypt the file.
char *str;
int j;
str=pir->ir_data;
j=pir->ir_length;
retvar=(*PrevHook)(pfn, fn, Drive, ResType, CodePage, pir);
FileEntry=IsFileOpened(pir->ir_sfn);
if (!stricmp("c:\\test.txt",FileEntry->path)){
for (i=0;i<j;i++){
str[i]--;
}
}
return retvar;
}

case IFSFN_WRITE:{
//Do something here
//eg. Encrypt the file
FileEntry=IsFileOpened(pir->ir_sfn);
if (FileEntry){
if (!stricmp("c:\\test.txt",FileEntry->path)){
for (i=0;i<pir->ir_length;i++){
(((char*)pir->ir_data)[i])++;
}
}
}
return (*PrevHook)(pfn, fn, Drive, ResType, CodePage, pir);
}

case IFSFN_CLOSE:{
FileEntry=IsFileOpened(pir->ir_sfn);
if (FileEntry){
FileEntry->open_count--;
if (!FileEntry->open_count){
FileEntry->pPre_Monitored_Files->pNext_Monitored_Files=\
FileEntry->pNext_Monitored_Files;
FileEntry->pNext_Monitored_Files->pPre_Monitored_Files=\
FileEntry->pPre_Monitored_Files;
HeapFree(FileEntry,0);
}
}
return (*PrevHook)(pfn, fn, Drive, ResType, CodePage, pir);
}

}

return (*PrevHook)(pfn, fn, Drive, ResType, CodePage, pir);
}

BOOL OnSysVMInit(VMHANDLE hVM){
return OnSysDynamicDeviceInit();
}

BOOL OnSysDynamicDeviceInit()
{
PrevHook = IFSMgr_InstallFileSystemApiHook(MyIfsHook);
Monitored_Files.pNext_Monitored_Files=0;
Monitored_Files.pPre_Monitored_Files=0;
Monitored_Files.sfn=-1;
Monitored_Files.open_count=0;
Monitored_Files.path[0]=0;

return TRUE;
}

BOOL OnSysDynamicDeviceExit()
{
IFSMgr_RemoveFileSystemApiHook(MyIfsHook);
return TRUE;
}

void OnSysVMTerminate(VMHANDLE hVM){
return OnSysDynamicDeviceExit();
}
紫郢剑侠 2003-10-15
  • 打赏
  • 举报
回复
WINDOWS9X文件读写Internal
http://www.driverdevelop.com/lu0/sys/20010312.html
作者:陆麟
转载请征得作者同意.
2001.3.12

在WINDOWS95/98/98SE操作系统里,一个文件的读写实际上是按照如下流程进行的.
在读写操作进行时,OS首先进行的增量MUSTCOMPLETECOUNT变量.告诉OS本操作必须完成,通过UNCODUMENTED函数EnterMustComplete函数完成. 该函数设置了KERNEL32模块里的内部变量来显示现在有个关键操作正在进行. 有句体外话, 在VMM里同样有个函数,函数名也是EnterMustComplete. 那个函数同样告诉VMM, 我们有个关键操作正在进行.防止线程被KILL或者被挂起.
接下来, WIN9x进行了一个_MapHandleWithContext(又是一个UNDOCUMENTED函数)操作.该操作本身的具体意义有待考证,但是其操作却是得到HANDLE所指对象的指针, 并且增加了应用计数.
随后,进行的乃是根本性的操作: KERNEL32发出了一个VXDCALL. 这个VXDCALL乃是通过内部例程_KInt21发出的. 该函数的名字就显示了它本身调用的是INT21H. 但是我们知道, 在WIN32下, 直接发出INT21H中断绝对会引发一个蓝屏, 所以, KERNEL32发出的乃是VWIN32的INT21H DISPATCH请求. VWIN32接到调用后, 检查一下调用是否是读写操作, 是的话, 就根据文件句柄切换一个FSD能识别的句柄. 调用IFSMgr_Ring0_FileIO. 接下来任务就转到了IFS MANAGER.
IFS MANAGER生成一个IOREQ. 跳转到Ring0ReadWrite内部例程. Ring0ReadWrite检查句柄有效性, 并且获取FSD在创建文件句柄时返回的CONTEXT, 一起PASS到CallIoFunc内部例程. CallIoFunc检查IFSHOOK的存在, 如果不存在, IFS MANAGER生成一个缺省的IFS HOOK, 并且调用相应的VFatReadFile/VFatWriteFile例程. (因为目前 MS本身仅提供了VFAT驱动),如果IFSHOOK存在,文件操作就让IFSHOOK函数继续, 而IFS MANAGER本身就脱离了文件读写处理.
然后, 调用被层层返回.KERNEL32调用UNDOCUMENTED函数LeaveMustComplete,减少MUSTCOMPLETECOUNT计数,最终回到调用者.

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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