Это правильно. Вы должны подключить функцию CreateFileA / W в kernel32.dll для отслеживания доступа. Вы хотите подключить эти 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 (например, 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;).
person
David
schedule
24.05.2011