飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 8507|回复: 12

[C/C++] 传统APIHOOK--JMP XXXXXXXX -- 简单类封装-- By 飘云

[复制链接]
  • TA的每日心情
    难过
    4 天前
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2014-2-5 00:41:18 | 显示全部楼层 |阅读模式
    传统APIHOOK--JMP XXXXXXXX -- 简单类封装-- By 飘云

    老手飘过,直接使用 detour

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

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

    4. #if !defined(AFX_HOOKAPI_H__4F261417_7D80_4241_B093_40CA4B099FF7__INCLUDED_)
    5. #define AFX_HOOKAPI_H__4F261417_7D80_4241_B093_40CA4B099FF7__INCLUDED_

    6. #if _MSC_VER > 1000
    7. #pragma once
    8. #endif // _MSC_VER > 1000


    9. #include <windows.h>

    10. class PY_HOOKAPI  
    11. {
    12. public:
    13.         BYTE FunTop5Code[5]; // 原函数头5字节
    14.         BYTE JmpAsmCode[5];  // Jmp *****
    15.         LPVOID lpOldFunAddr; // 原始函数入口地址
    16.         LPVOID lpNewFunAddr; // 新函数入口地址

    17.         VOID Init(PSTR szModuleName, PSTR szFunName, FARPROC lpFun);
    18.         VOID Hook();
    19.         VOID UnHook();

    20.         PY_HOOKAPI();
    21.         virtual ~PY_HOOKAPI();
    22.         
    23. };

    24. #endif // !defined(AFX_HOOKAPI_H__4F261417_7D80_4241_B093_40CA4B099FF7__INCLUDED_)
    复制代码
    1. // HookApi.cpp: implementation of the PY_HOOKAPI class.
    2. // Code By PiaoYun/P.Y.G www.chinapyg.com
    3. //////////////////////////////////////////////////////////////////////

    4. #include "HookApi.h"

    5. //////////////////////////////////////////////////////////////////////
    6. // Construction/Destruction
    7. //////////////////////////////////////////////////////////////////////

    8. PY_HOOKAPI::PY_HOOKAPI()
    9. {
    10.         //ZeroMemory(FunTop5Code,5);
    11.         //ZeroMemory(JmpAsmCode,5);
    12.         //JmpAsmCode[0]  = 0xE9; // Jmp *****
    13. }

    14. PY_HOOKAPI::~PY_HOOKAPI()
    15. {
    16.         UnHook();
    17. }

    18. VOID PY_HOOKAPI::Init(PSTR szModuleName, PSTR szFunName, FARPROC lpFun)
    19. {
    20.         HMODULE hMod = ::LoadLibrary(szModuleName);
    21.         if (hMod)
    22.         {
    23.                 lpNewFunAddr = lpFun;
    24.                 lpOldFunAddr = ::GetProcAddress(hMod, szFunName);
    25.                 JmpAsmCode[0]  = 0xE9; // Jmp *****
    26.                 *(PDWORD)&(JmpAsmCode[1]) = (DWORD)lpNewFunAddr - (DWORD)lpOldFunAddr - 5;
    27.                
    28.                 DWORD dwOldProtect;
    29.                 ::VirtualProtect(lpOldFunAddr, 5, PAGE_READWRITE, &dwOldProtect);
    30.                 ::ReadProcessMemory(GetCurrentProcess(), lpOldFunAddr, FunTop5Code, 5, NULL);
    31.                 ::VirtualProtect(lpOldFunAddr, 5, dwOldProtect, &dwOldProtect);
    32.         }
    33. }

    34. VOID PY_HOOKAPI::Hook()
    35. {
    36.         DWORD dwOldProtect;
    37.         ::VirtualProtect(lpOldFunAddr, 5, PAGE_READWRITE, &dwOldProtect);
    38.         ::WriteProcessMemory(GetCurrentProcess(), lpOldFunAddr, JmpAsmCode, 5, NULL);
    39.         ::VirtualProtect(lpOldFunAddr, 5, dwOldProtect, &dwOldProtect);
    40. }

    41. VOID PY_HOOKAPI::UnHook()
    42. {
    43.         DWORD dwOldProtect;
    44.         ::VirtualProtect(lpOldFunAddr, 5, PAGE_READWRITE, &dwOldProtect);
    45.         ::WriteProcessMemory(GetCurrentProcess(), lpOldFunAddr, FunTop5Code, 5, NULL);
    46.         ::VirtualProtect(lpOldFunAddr, 5, dwOldProtect, &dwOldProtect);
    47. }
    复制代码

    测试代码:

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

    3. PY_HOOKAPI MyHookApi;

    4. int WINAPI MyMessageBoxA(
    5.                                                  IN HWND hWnd,
    6.                                                  IN LPCSTR lpText,
    7.                                                  IN LPCSTR lpCaption,
    8.                                                  IN UINT uType)
    9. {
    10.         MyHookApi.UnHook();
    11.         DWORD ret = MessageBoxA(NULL, "函数被Hook了!", lpCaption, MB_OK);
    12.         MyHookApi.Hook();
    13.         return ret;
    14. }

    15. VOID main()
    16. {
    17.         MessageBoxA(NULL, "函数没被Hook", "飘云", MB_OK);
    18.         MyHookApi.Init("USER32.DLL", "MessageBoxA", (FARPROC)MyMessageBoxA);
    19.         MyHookApi.Hook();
    20.         MessageBoxA(NULL, "还能看到我么?", "飘云", MB_OK);
    21.         MyHookApi.UnHook();
    22.         MessageBoxA(NULL, "UnHook成功!", "飘云", MB_OK);
    23. }
    复制代码



    评分

    参与人数 2威望 +44 飘云币 +40 收起 理由
    wonderzdh + 4 detour:http://www.360doc.com/content/10.
    MOV + 40 + 40 很给力!

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2017-10-25 13:07
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2014-2-23 23:13:09 | 显示全部楼层
    以往如旧的支持呵呵
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2017-5-31 13:17
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2014-4-21 21:31:36 | 显示全部楼层
    差距太远了
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2019-2-27 15:18
  • 签到天数: 205 天

    [LV.7]常住居民III

    发表于 2014-4-30 16:38:16 | 显示全部楼层
    很给力 ,呵呵,支持多发这类文章。。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    17 小时前
  • 签到天数: 5580 天

    [LV.Master]伴坛终老

    发表于 2014-5-8 19:21:58 | 显示全部楼层
    很好的学习材料!谢谢。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-2-11 20:08
  • 签到天数: 774 天

    [LV.10]以坛为家III

    发表于 2014-6-25 10:22:12 | 显示全部楼层
    虽然看不懂,呵呵,太厉害了
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-1-24 21:32
  • 签到天数: 41 天

    [LV.5]常住居民I

    发表于 2014-8-29 20:54:56 | 显示全部楼层
    真心看的头昏眼花 估计用处很大 要是看懂了 估计谁都能用都是涉及到系统底层的东西 飘大太给力
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2014-9-9 19:22:16 | 显示全部楼层
    我只是新手 太深奥
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2019-3-17 22:44
  • 签到天数: 132 天

    [LV.7]常住居民III

    发表于 2014-9-15 21:24:45 来自手机 | 显示全部楼层
    多谢提供源码,很有帮助
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表