VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 1056|回复: 2

[经验心得体会] EasyHook的使用教程

[复制链接]
87_avatar_middle
在线会员 xiaotao701 发表于 2018-3-14 23:01:55 | 显示全部楼层 |阅读模式
本帖最后由 xiaotao701 于 2018-3-14 23:03 编辑

EasyHook的使用教程网上几乎没有,找了好久最后只好自己爬官网了,本教程包含两部份示例源码,收集来源官方网站。
1-安装本地钩子使用   
2 -安装一个远程钩子使用
使用前将DLL放入工程目录,包含库文件
#include <easyhook.h>
#if _WIN64
#pragma comment(lib, "EasyHook64.lib")
#else
#pragma comment(lib, "EasyHook32.lib")
#endif


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
EasyHook -安装本地钩子使用

#include <string>
#include <iostream>
#include <Windows.h>
#include <easyhook.h>

using namespace std;

BOOL WINAPI myBeepHook(DWORD dwFreq, DWORD dwDuration);

BOOL WINAPI myBeepHook(DWORD dwFreq, DWORD dwDuration)
{
    cout << "\n****All your beeps belong to us!\n\n";
    return Beep(dwFreq + 800, dwDuration);
}

int _tmain(int argc, _TCHAR* argv[])
{
    HOOK_TRACE_INFO hHook = { NULL }; // keep track of our hook
    cout << "\n";
    cout << GetProcAddress(GetModuleHandle(TEXT("kernel32")), "Beep");
   
    // Install the hook
    NTSTATUS result = LhInstallHook(
        GetProcAddress(GetModuleHandle(TEXT("kernel32")), "Beep"),
        myBeepHook,
        NULL,
        &hHook);
    if (FAILED(result))
    {
        wstring s(RtlGetLastErrorString());
        wcout << "Failed to install hook: ";
        wcout << s;
        cout << "\n\nPress any key to exit.";
        cin.get();
        return -1;
    }
   
    cout << "Beep after hook installed but not enabled.\n";
    Beep(500, 500);

    cout << "Activating hook for current thread only.\n";
    // If the threadId in the ACL is set to 0,
    // then internally EasyHook uses GetCurrentThreadId()
    ULONG ACLEntries[1] = { 0 };
    LhSetInclusiveACL(ACLEntries, 1, &hHook);

    cout << "Beep after hook enabled.\n";
    Beep(500, 500);

    cout << "Uninstall hook\n";
    LhUninstallHook(&hHook);

    cout << "Beep after hook uninstalled\n";
    Beep(500, 500);

    cout << "\n\nRestore ALL entry points of pending removals issued by LhUninstallHook()\n";
    LhWaitForPendingRemovals();

    cout << "Press any key to exit.";
    cin.get();

    return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
EasyHook -安装一个远程钩子使用

//目标应用程序代码
#include <iostream>
#include <string>
#include <Windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
        std::string value;
        while (true)
        {
                // Output the current process Id
        HANDLE currentThread = GetCurrentThread();
                std::cout << "Target.exe process id: ";
                std::cout << GetProcessIdOfThread(currentThread);
                std::cout << "\n";
                CloseHandle(currentThread);
        
        std::cout << "Press <enter> to Beep (Ctrl-C to exit): ";
                std::getline(std::cin, value);
                Beep(500, 500);
        }
        return 0;
}


//注入程序代码
#include <iostream>
#include <string>
#include <cstring>

#include <easyhook.h>

int _tmain(int argc, _TCHAR* argv[])
{
        DWORD processId;
        std::wcout << "Enter the target process Id: ";
        std::cin >> processId;

        DWORD freqOffset = 0;
        std::cout << "Enter a frequency offset in hertz (e.g. 800): ";
        std::cin >> freqOffset;

        WCHAR* dllToInject = L"..\\Debug\\BeepHook.dll";
        wprintf(L"Attempting to inject: %s\n\n", dllToInject);

        // Inject dllToInject into the target process Id, passing
        // freqOffset as the pass through data.
        NTSTATUS nt = RhInjectLibrary(
                processId,   // The process to inject into
                0,           // ThreadId to wake up upon injection
                EASYHOOK_INJECT_DEFAULT,
                dllToInject, // 32-bit
                NULL,                 // 64-bit not provided
                &freqOffset, // data to send to injected DLL entry point
                sizeof(DWORD)// size of data to send
        );

        if (nt != 0)
        {
                printf("RhInjectLibrary failed with error code = %d\n", nt);
                PWCHAR err = RtlGetLastErrorString();
                std::wcout << err << "\n";
        }
        else
        {
                std::wcout << L"Library injected successfully.\n";
        }

        std::wcout << "Press Enter to exit";
        std::wstring input;
        std::getline(std::wcin, input);
        std::getline(std::wcin, input);
        return 0;
}


//钩子 DLL代码
新建一个WIN32 DLL选项如图:
EasyHook的使用教程

#include <easyhook.h>
#include <string>
#include <iostream>
#include <Windows.h>

DWORD gFreqOffset = 0;
BOOL WINAPI myBeepHook(DWORD dwFreq, DWORD dwDuration)
{
        std::cout << "\n    BeepHook: ****All your beeps belong to us!\n\n";
        return Beep(dwFreq + gFreqOffset, dwDuration);
}

// EasyHook will be looking for this export to support DLL injection. If not found then
// DLL injection will fail.
extern "C" void __declspec(dllexport) __stdcall NativeInjectionEntryPoint(REMOTE_ENTRY_INFO* inRemoteInfo);

void __stdcall NativeInjectionEntryPoint(REMOTE_ENTRY_INFO* inRemoteInfo)
{
        std::cout << "\n\nNativeInjectionEntryPointt(REMOTE_ENTRY_INFO* inRemoteInfo)\n\n" <<
                "IIIII           jjj               tt                dd !!! \n"
                " III  nn nnn          eee    cccc tt      eee       dd !!! \n"
                " III  nnn  nn   jjj ee   e cc     tttt  ee   e  dddddd !!! \n"
                " III  nn   nn   jjj eeeee  cc     tt    eeeee  dd   dd     \n"
                "IIIII nn   nn   jjj  eeeee  ccccc  tttt  eeeee  dddddd !!! \n"
                "              jjjj                                         \n\n";

        std::cout << "Injected by process Id: " << inRemoteInfo->HostPID << "\n";
        std::cout << "Passed in data size: " << inRemoteInfo->UserDataSize << "\n";
        if (inRemoteInfo->UserDataSize == sizeof(DWORD))
        {
                gFreqOffset = *reinterpret_cast<DWORD *>(inRemoteInfo->UserData);
                std::cout << "Adjusting Beep frequency by: " << gFreqOffset << "\n";
        }

        // Perform hooking
        HOOK_TRACE_INFO hHook = { NULL }; // keep track of our hook

        std::cout << "\n";
        std::cout << "Win32 Beep found at address: " << GetProcAddress(GetModuleHandle(TEXT("kernel32")), "Beep") << "\n";

        // Install the hook
        NTSTATUS result = LhInstallHook(
                GetProcAddress(GetModuleHandle(TEXT("kernel32")), "Beep"),
                myBeepHook,
                NULL,
                &hHook);
        if (FAILED(result))
        {
                std::wstring s(RtlGetLastErrorString());
                std::wcout << "Failed to install hook: ";
                std::wcout << s;
        }
        else
        {
                std::cout << "Hook 'myBeepHook installed successfully.";
        }

        // If the threadId in the ACL is set to 0,
        // then internally EasyHook uses GetCurrentThreadId()
        ULONG ACLEntries[1] = { 0 };

        // Disable the hook for the provided threadIds, enable for all others
        LhSetExclusiveACL(ACLEntries, 1, &hHook);

        return;
}
运行结果:
EasyHook的使用教程




本文全由VC驿站ID:xiaotao701整理
EasyHook的使用教程

EasyHook-2.7.6270.0-Binaries.zip

573.55 KB, 下载次数: 7, 下载积分: 驿站币 -2

评分

参与人数 1威望 +2 驿站币 +2 激情 +2 收起 理由
51_avatar_small Syc + 2 + 2 + 2 感谢分享!

查看全部评分





上一篇:驿站首发:Vc++传奇私服辅助开发教程 持续更新...
下一篇:基于VLC+DUILIB +MFC 的视频播放器

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

51_avatar_middle
online_admins Syc 发表于 2018-3-15 00:27:35 | 显示全部楼层
非常不错,前段时间用 EasyHook 做了个第三方程序的窗口隐藏的Api Hook,将 ShowWindow 给 Hook 了,赞一个!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

16_avatar_middle
online_vip12 firefox 发表于 2018-3-15 09:47:22 | 显示全部楼层
easyhook 这东西不错,开源,免费用,还算比较稳定了

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-10-22 14:49

Powered by Discuz! X3.4

© 2009-2018 cctry.com

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