飘云 发表于 2014-2-5 00:41:18

传统APIHOOK--JMP XXXXXXXX -- 简单类封装-- By 飘云

传统APIHOOK--JMP XXXXXXXX -- 简单类封装-- By 飘云

老手飘过,直接使用 detour

该类为新手封装~~ 方便使用!

// HookApi.h: interface for the PY_HOOKAPI class.
// Code By PiaoYun/P.Y.G www.chinapyg.com
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_HOOKAPI_H__4F261417_7D80_4241_B093_40CA4B099FF7__INCLUDED_)
#define AFX_HOOKAPI_H__4F261417_7D80_4241_B093_40CA4B099FF7__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


#include <windows.h>

class PY_HOOKAPI
{
public:
      BYTE FunTop5Code; // 原函数头5字节
      BYTE JmpAsmCode;// Jmp *****
      LPVOID lpOldFunAddr; // 原始函数入口地址
      LPVOID lpNewFunAddr; // 新函数入口地址

      VOID Init(PSTR szModuleName, PSTR szFunName, FARPROC lpFun);
      VOID Hook();
      VOID UnHook();

      PY_HOOKAPI();
      virtual ~PY_HOOKAPI();
      
};

#endif // !defined(AFX_HOOKAPI_H__4F261417_7D80_4241_B093_40CA4B099FF7__INCLUDED_)

// HookApi.cpp: implementation of the PY_HOOKAPI class.
// Code By PiaoYun/P.Y.G www.chinapyg.com
//////////////////////////////////////////////////////////////////////

#include "HookApi.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

PY_HOOKAPI::PY_HOOKAPI()
{
      //ZeroMemory(FunTop5Code,5);
      //ZeroMemory(JmpAsmCode,5);
      //JmpAsmCode= 0xE9; // Jmp *****
}

PY_HOOKAPI::~PY_HOOKAPI()
{
      UnHook();
}

VOID PY_HOOKAPI::Init(PSTR szModuleName, PSTR szFunName, FARPROC lpFun)
{
      HMODULE hMod = ::LoadLibrary(szModuleName);
      if (hMod)
      {
                lpNewFunAddr = lpFun;
                lpOldFunAddr = ::GetProcAddress(hMod, szFunName);
                JmpAsmCode= 0xE9; // Jmp *****
                *(PDWORD)&(JmpAsmCode) = (DWORD)lpNewFunAddr - (DWORD)lpOldFunAddr - 5;
               
                DWORD dwOldProtect;
                ::VirtualProtect(lpOldFunAddr, 5, PAGE_READWRITE, &dwOldProtect);
                ::ReadProcessMemory(GetCurrentProcess(), lpOldFunAddr, FunTop5Code, 5, NULL);
                ::VirtualProtect(lpOldFunAddr, 5, dwOldProtect, &dwOldProtect);
      }
}

VOID PY_HOOKAPI::Hook()
{
      DWORD dwOldProtect;
      ::VirtualProtect(lpOldFunAddr, 5, PAGE_READWRITE, &dwOldProtect);
      ::WriteProcessMemory(GetCurrentProcess(), lpOldFunAddr, JmpAsmCode, 5, NULL);
      ::VirtualProtect(lpOldFunAddr, 5, dwOldProtect, &dwOldProtect);
}

VOID PY_HOOKAPI::UnHook()
{
      DWORD dwOldProtect;
      ::VirtualProtect(lpOldFunAddr, 5, PAGE_READWRITE, &dwOldProtect);
      ::WriteProcessMemory(GetCurrentProcess(), lpOldFunAddr, FunTop5Code, 5, NULL);
      ::VirtualProtect(lpOldFunAddr, 5, dwOldProtect, &dwOldProtect);
}

测试代码:

#include <windows.h>
#include "HookApi.h"

PY_HOOKAPI MyHookApi;

int WINAPI MyMessageBoxA(
                                                 IN HWND hWnd,
                                                 IN LPCSTR lpText,
                                                 IN LPCSTR lpCaption,
                                                 IN UINT uType)
{
      MyHookApi.UnHook();
      DWORD ret = MessageBoxA(NULL, "函数被Hook了!", lpCaption, MB_OK);
      MyHookApi.Hook();
      return ret;
}

VOID main()
{
      MessageBoxA(NULL, "函数没被Hook", "飘云", MB_OK);
      MyHookApi.Init("USER32.DLL", "MessageBoxA", (FARPROC)MyMessageBoxA);
      MyHookApi.Hook();
      MessageBoxA(NULL, "还能看到我么?", "飘云", MB_OK);
      MyHookApi.UnHook();
      MessageBoxA(NULL, "UnHook成功!", "飘云", MB_OK);
}



MOV 发表于 2014-2-23 23:13:09

以往如旧的支持呵呵

small-q 发表于 2014-3-2 20:43:30

支持。。学习

cjteam 发表于 2014-4-21 21:31:36

{:sweat:}差距太远了

yosen2001 发表于 2014-4-30 16:38:16

很给力 ,呵呵,支持多发这类文章。。

atompure 发表于 2014-5-8 19:21:58

很好的学习材料!谢谢。

LCC 发表于 2014-6-25 10:22:12

虽然看不懂,呵呵,太厉害了

wz2988 发表于 2014-8-29 20:54:56

真心看的头昏眼花 估计用处很大 要是看懂了 估计谁都能用都是涉及到系统底层的东西 飘大太给力

wereadas 发表于 2014-9-9 19:22:16

我只是新手 太深奥

tree_fly 发表于 2014-9-15 21:24:45

多谢提供源码,很有帮助
页: [1] 2
查看完整版本: 传统APIHOOK--JMP XXXXXXXX -- 简单类封装-- By 飘云