代码之家  ›  专栏  ›  技术社区  ›  ralphtheninja

如何捕获文件创建和负责的调用者

  •  0
  • ralphtheninja  · 技术社区  · 16 年前

    FindFirstChangeNotifications()

    欢迎提出任何建议。

    2 回复  |  直到 16 年前
        1
  •  3
  •   Idan K    16 年前

    1. 使用以下工具 FileMon Process Explorer ,他们可能足以追踪到它。
    2. Detours
        2
  •  2
  •   nhaa123    16 年前

    /** We'll create a custom version of the CreateFile (WinAPI).
      *
      *
      */
    HANDLE WINAPI __CreateFile(LPCWSTR fileName,
                               DWORD desiredAccess,
                               DWORD shareMode,
                               LPSECURITY_ATTRIBUTES securityAttributes,
                               DWORD createDisp,
                               DWORD flags,
                               HANDLE tmp)
    {
            // At very first, we shall call the original CreateFile.
    
            HANDLE file = Real_CreateFile(fileName,
                                          desiredAccess,
                                          shareMode,
                                          securityAttributes,
                                          createDisp,
                                          flags,
                                          tmp);
    
            /** Here, you can do whatever you wish with fileName and the handle, file.
              *
              * ...
              */
    
            return file;
    }

    然而,这还不够。您还需要从排毒中受益:

    BOOL APIENTRY DllMain(HANDLE module, DWORD reasonForCall, LPVOID reserved)
    {
            switch (reasonForCall) {
                    case DLL_PROCESS_ATTACH: {
                            if (::GetModuleHandle(L"blablabla.exe") == NULL) {
                                    DetourTransactionBegin();
                                    DetourUpdateThread(GetCurrentThread());
                                    DetourAttach(&(PVOID &)Real_CreateFile, __CreateFile);
                                    DetourTransactionCommit();
                    }
    
                    break;
    
                    case DLL_THREAD_ATTACH: {
                    }
    
                    break;
    
                    case DLL_THREAD_DETACH: {
                    }
    
                    break;
    
                    case DLL_PROCESS_DETACH: {
                            if (::GetModuleHandle(L"blablabla.exe") == NULL) {
                                    DetourTransactionBegin();
                                    DetourUpdateThread(GetCurrentThread());
                                    DetourDetach(&(PVOID&)Real_CreateFile, __CreateFile);
                                    DetourTransactionCommit();
                            }
                    }
        }
    
        return TRUE;
    }