1

我想知道进程打开/访问的文件是什么。我可以知道该怎么做吗?我尝试使用 Deviare,一个免费的 hooking api 来帮助我,但无法从他们的 AIP 库或论坛中找到任何有用的信息。

我只知道我必须连接到 kernel32.dll 和 createFileW,但我不确定如何继续。

请帮助我。提前致谢。

4

1 回答 1

1

这是正确的。您必须在 kernel32.dll 中挂钩函数 CreateFileA/W 以监控访问。您想将这些 API 挂接到您自己的进程中还是其他进程中?如果你想在你自己的进程中挂钩函数,你可以使用

void *DetourFunc(BYTE *src, const BYTE *dst, const int len)
{
    BYTE *jmp = (BYTE*)malloc(5+len);
    DWORD dwback;
    VirtualProtect(src,len,PAGE_READWRITE,&dwback);   
    memcpy(jmp,src,len);
    jmp += len;   
    jmp[0] = 0xE9;
    *(DWORD*)(jmp+1) = (DWORD)(src+len - jmp) - 5;
    src[0] = 0xE9;
    *(DWORD*)(src+1) = (DWORD)(dst - src) - 5;
    VirtualProtect(src,len,dwback,&dwback);
    return (jmp-len);
} 

为了它。这些函数绕过函数 src (fe MessageBoxA()) 到函数 dst。作为 len 你可以使用 5。它返回一个指向原始函数的函数指针。一个示例调用:

typedef int (WINAPI *__MessageBox)(
  __in_opt  HWND hWnd,
  __in_opt  LPCTSTR lpText,
  __in_opt  LPCTSTR lpCaption,
  __in      UINT uType
);
__MessageBox _MessageBox;

int cMessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)
{
//here you can change anything you want
return _MessageBox(hWnd,lpText,lpCaption,uType);
}

int main(void)
{
BYTE *hookfunc = (BYTE*)GetProcAddress(LoadLibrary("user32.dll"),"MessageBoxA");
_MessageBox = (__MessageBox)DetourFunc(hookfunc,(BYTE*)cMessageBox,5);
return 0;
}

那是一个用户模式钩子。如果您想在系统范围内执行此操作,我将使用设备驱动程序。这是一个关于这个的教程。http://www.codeproject.com/KB/system/driverdev.aspx

如果你使用 VC++ 编译多字节模式;)。如果您想挂接其他进程,只需 google DLL-Injection ;)。

于 2011-05-24T16:25:31.730 回答