在NT/XP/2000下可以考虑使用服务程序的办法比用HOOK要安全得多。

解决方案 »

  1.   

    你所说的服务程序即为filemon.vxd/filemon.sys方式吧?
    也觉得Hook容易导致问题。
    我有一段调用filemon.vxd/filemon.sys的代码
    不能得到跟踪结果,为什么?
    代码如下:
    SC_HANDLE schService=NULL;
    SC_HANDLE schSCManager=NULL;
    char ErrorString[256];
    try
    {
    unsigned long NTVersion = GetVersion();
    IsNT = FALSE;
    if( NTVersion < 0x80000000 ) 
    {
    IsNT = TRUE;
    }
    char *DeviceName=_T("\\\\.\\FILEMON");
    char *DriverName=_T("FILEMON");
    char *DriverBin=IsNT?_T("C:\\WINNT\\FILEMON.SYS"):_T("C:\\WINNT\\FILEMON.VXD");
    schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); schService = OpenService( schSCManager,
      DriverName,
      SERVICE_ALL_ACCESS
      );
    if (schService == NULL )
    {
    schService = CreateService( schSCManager,          // SCManager database
    DriverName,           // name of service
    DriverName,           // name to display
    SERVICE_ALL_ACCESS,   // desired access
    SERVICE_KERNEL_DRIVER,// service type
    SERVICE_DEMAND_START, // start type
    SERVICE_ERROR_NORMAL, // error control type
    DriverBin,            // service's binary
    NULL,                 // no load ordering group
    NULL,                 // no tag identifier
    NULL,                 // no dependencies
    NULL,                 // LocalSystem account
    NULL);                // no password
    }
    if(schService==NULL)
    {
    ErrorCode=GetLastError();
    wsprintf(ErrorString,_T("Failed 1 Code %xl"),ErrorCode);
    throw(-1);
    }
    StartService(schService,0,NULL);
    Sleep(10);
    HANDLE SysHandle=CreateFile(DeviceName,
    STANDARD_RIGHTS_ALL, FILE_SHARE_READ, NULL,OPEN_EXISTING, FILE_FLAG_OVERLAPPED|FILE_FLAG_DELETE_ON_CLOSE,NULL );
    if(SysHandle==INVALID_HANDLE_VALUE)
    {
    ErrorCode=GetLastError();
    wsprintf(ErrorString,_T("Failed 2  Code %xl"),ErrorCode);
    throw(-1);
    }
    DeviceIoControl(SysHandle, FILEMON_zerostats,
    NULL, 0, NULL, 0, &WaitResult, NULL );
    //==================================================================
    sprintf( FilterDefinition.processfilter, "*" );
    sprintf( FilterDefinition.excludeprocess, "" );
    sprintf( FilterDefinition.pathfilter, "*" );
    sprintf( FilterDefinition.excludefilter, "");
    FilterDefinition.logreads = TRUE;
    FilterDefinition.logwrites = TRUE;
    //==================================================================
    bool TimeIsDuration=true;
    unsigned long StatsLen;
    unsigned long CurDriveSet=0xfffffffel;
    DeviceIoControl(SysHandle, FILEMON_setdrives,
    &CurDriveSet, sizeof CurDriveSet,
    &CurDriveSet, sizeof CurDriveSet,
    &WaitResult, NULL );
    StatsLen=DeviceIoControl(SysHandle, FILEMON_setfilter,
    &FilterDefinition, sizeof(FILTER), NULL, 
    0, &WaitResult, NULL );
    StatsLen=DeviceIoControl(SysHandle, FILEMON_timetype,
    (PVOID) &TimeIsDuration, sizeof(bool), 
    NULL, 0, &WaitResult, NULL );
    StatsLen=DeviceIoControl(SysHandle, FILEMON_startfilter,
    NULL, 0, NULL, 0, &WaitResult, NULL );
    StatsLen=0;
    DeviceIoControl(SysHandle, FILEMON_getstats,
    NULL, 0, BufferPtr, BufferSize,
    &StatsLen, NULL ) ;
    VARIANT var;
    unsigned short Value=1;
    var.vt=VT_I2;
    var.uiVal=1111;
    if(StatsLen!=0)
    PostThreadMessage(ThreadID,ME_EVENT,MonitorID,StatsLen);
    CloseHandle(SysHandle);
      

  2.   

    各位老大,有没有对FILEMON有所研究的
    帮忙看看上面的代码啊!!!!
      

  3.   

    hook api只能拦截一般的文件操作
    如果是程序直接调用低层的文件操作
    hook api就没有办法了filemon sys程序也有问题
    在有文件操作时
    不能停止操作系统
    所以有可能不会同步最好的办法是拦截系统服务
    如ZwCreateFile等
    这样就能保证有文件操作时
    是同步的上面代码你要什么结果?