Ring3 Api Hook (1) 古老的 inline Hook

Ring3 Api Hook (1) 古老的 inline Hook

最古老的 Hook ,非常不稳定。
 1 #pragma pack(push, 1 )
 2 typedef  struct   
 3 {
 4  BYTE op;
 5  DWORD dwOffset;
 6}
HookCode;
 7 #pragma pack(pop)
 8
 9 HookCode oldCode, newCode;
10 LPBYTE pOrgAddress  =  NULL;
11
12 HANDLE WINAPI fakeCreateFileW(DWORD dwReturnAddress, __in LPCWSTR lpFileName, __in DWORD dwDesiredAccess, __in DWORD dwShareMode, 
13                 __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, __in DWORD dwCreationDisposition, 
14                 __in DWORD dwFlagsAndAttributes, __in_opt HANDLE hTemplateFile )
15 {
16  DWORD dwOldProtect;
17  VirtualProtect(pOrgAddress, sizeof(HookCode), PAGE_EXECUTE_READWRITE, &dwOldProtect);
18  CopyMemory(pOrgAddress, &oldCode, sizeof(HookCode));
19  VirtualProtect(pOrgAddress, sizeof(HookCode), dwOldProtect, &dwOldProtect);
20
21  MessageBoxW(NULL, lpFileName, NULL, MB_OK);
22
23  return   CreateFileW(lpFileName, dwDesiredAccess, dwShareMode,
24    lpSecurityAttributes, dwCreationDisposition,
25    dwFlagsAndAttributes, hTemplateFile);
26}

27
28 DWORD GetRealAddress(LPVOID pFunc)
29 {
30  // 计算函数真实地址
31  LPBYTE funaddr= (LPBYTE)pFunc;
32  if(funaddr[0]==0xE9)// 判断是否为虚拟函数地址,E9为jmp指令
33  {
34    DWORD realaddr=(DWORD)pFunc;
35    realaddr += funaddr[2]*0x100 +funaddr[1+5;
36    return realaddr;
37  }
 
38
39  return (DWORD)pFunc;
40}

41
42 int  _tmain( int  argc, _TCHAR *  argv[])
43 {
44
45  pOrgAddress = (LPBYTE)GetProcAddress(LoadLibrary(_T("kernel32.dll")), "CreateFileW");
46
47  DWORD dwOldProtect;
48  VirtualProtect(pOrgAddress, sizeof(HookCode), PAGE_EXECUTE_READWRITE, &dwOldProtect);
49  CopyMemory(&oldCode, pOrgAddress, sizeof(HookCode));
50
51  newCode.op = 0xE8;
52  DWORD dwPatch = GetRealAddress(fakeCreateFileW);
53  newCode.dwOffset = dwPatch - (DWORD)pOrgAddress - 5;
54  CopyMemory(pOrgAddress, &newCode, sizeof(HookCode));
55  VirtualProtect(pOrgAddress, sizeof(HookCode), dwOldProtect, &dwOldProtect);
56
57  CreateFileW(L"C:\\a.txt", GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
58
59    return 0;
60}

61
62

你可能感兴趣的:(Ring3 Api Hook (1) 古老的 inline Hook)