1

プロセスによって開かれた/アクセスされたファイルが何であるかを知りたいです。その方法を教えてください。無料のフック API である Deviare を使用して助けようとしましたが、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 に答える