Zero Code

零度代码

Ring3 Api Hook (1) 古老的 inline Hook

最古老的 Hook ,非常不稳定。
 1#pragma pack(push,1)
 2typedef struct  
 3{
 4  BYTE op;
 5  DWORD dwOffset;
 6}
HookCode;
 7#pragma pack(pop)
 8
 9HookCode oldCode, newCode;
10LPBYTE pOrgAddress = NULL;
11
12HANDLE 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
28DWORD 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
42int _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

posted on 2011-05-10 23:23 cntrump 阅读(358) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


My Links

Blog Stats

常用链接

留言簿

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜