从这里http://www.pcdog.com/p/html/2004129/91220042893_1.htm看到了APIHook的方法。
其中注册钩子的语句是
hHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)GetMsgProc,hmodDll,dwThreadId);
该示例仅能Hook它自己这个进程。一般来说,当hmodDll是Dll的句柄、dwThreadId是0时,应该是全局钩子;当hmodDll是0,dwThreadId是待钩的线程ID,是线程句柄。结果两者都无效,无论参数怎么设,只会钩自己本身。怎么设置全局ApiHook或Hook其他进程呢?网上找了很多说可以的,尝试了结果都不行。最好能有源码分享

解决方案 »

  1.   

    说到底还是把dll注入别人的进程。
      

  2.   

    要怎么做才可以把dll注入别人的进程呢?
    以前做消息钩子,根本不用那么麻烦的阿。
    如果有示例请发到[email protected],谢谢
      

  3.   

    一个简单采用钩子函数对MessageBoxA进行拦截例子:
    其中Dll文件为:
    //---------------------------------------------------------------------------#include <windows.h>HHOOK     g_hHook;
    HINSTANCE g_hinstDll;
    FARPROC   fpMessageBoxA;HMODULE hModule ;
    BYTE    OldMessageBoxACode[5], NewMessageBoxACode[5];
    DWORD   dwIdOld, dwIdNew;
    BOOL   bHook = false;void HookOn();
    void HookOff();
    BOOL Init();
    int WINAPI  MyMessageBoxA(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);
    //---------------------------------------------------------------------------
    // 空的钩子函数
    LRESULT WINAPI Hook(int nCode, WPARAM wParam, LPARAM lParam)
    {
        return(CallNextHookEx(g_hHook, nCode, wParam, lParam));
    }
    //---------------------------------------------------------------------------
    // 输出,安装空的钩子函数
    extern "C" __declspec(dllexport) __stdcall
    BOOL InstallHook()
    {
        g_hinstDll = LoadLibrary("test.dll"); // 这里的文件名为Dll本身的文件名
        g_hHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)Hook, g_hinstDll, 0);
        if (!g_hHook)
        {
            MessageBoxA(NULL, "SET ERROR", "ERROR", MB_OK);
            return(false);
        }
        return(true);
    }
    //---------------------------------------------------------------------------
    // 输出,Uninstall钩子函数
    extern "C" __declspec(dllexport) __stdcall
    BOOL UninstallHook()
    {
        return(UnhookWindowsHookEx(g_hHook));
    }
    //---------------------------------------------------------------------------
    // 初始化得到MessageBoxA的地址,并生成Jmp XXX(MyMessageBoxA)的跳转指令
    BOOL Init()
    {
        hModule = LoadLibrary("user32.dll");
        fpMessageBoxA = GetProcAddress(hModule, "MessageBoxA");
        if(fpMessageBoxA == NULL)
            return false;
        _asm
        {
            pushad
            lea edi, OldMessageBoxACode
            mov esi, fpMessageBoxA
            cld
            movsd
            movsb
            popad
        }
        NewMessageBoxACode[0] = 0xe9; // jmp MyMessageBoxA的相对地址的指令
        _asm
        {
            lea eax, MyMessageBoxA
            mov ebx, fpMessageBoxA
            sub eax, ebx
            sub eax, 5
            mov dword ptr [NewMessageBoxACode + 1], eax
        }
        dwIdNew = GetCurrentProcessId(); // 得到所属进程的ID
        dwIdOld = dwIdNew;
        HookOn(); // 开始拦截
        return(true);
    }
    //---------------------------------------------------------------------------
    // 首先关闭拦截,然后才能调用被拦截的Api 函数
    int WINAPI MyMessageBoxA(HWND hWnd, LPCTSTR lpText,LPCTSTR lpCaption, UINT uType)
    {
        int nReturn;
        HookOff();
        nReturn = MessageBoxA(hWnd, "来自钩子中的内容", lpCaption, MB_OK | MB_ICONINFORMATION);
        HookOn();
        return(nReturn);
    }
    void HookOn()
    {
        HANDLE hProc;
        dwIdOld = dwIdNew;
        // 得到所属进程的句柄
        hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, dwIdOld);
        // 修改所属进程中MessageBoxA的前5个字节的属性为可写
        VirtualProtectEx(hProc, fpMessageBoxA, 5, PAGE_READWRITE,&dwIdOld);
        // 将所属进程中MessageBoxA的前5个字节改为JMP 到MyMessageBoxA
        WriteProcessMemory(hProc, fpMessageBoxA, NewMessageBoxACode, 5, 0);
        // 修改所属进程中MessageBoxA的前5个字节的属性为原来的属性
        VirtualProtectEx(hProc, fpMessageBoxA, 5, dwIdOld, &dwIdOld);
        bHook=true;
    }
    //---------------------------------------------------------------------------
    // 将所属进程中JMP MyMessageBoxA的代码改为Jmp MessageBoxA
    void HookOff()
    {
        HANDLE hProc;
        dwIdOld = dwIdNew;
        hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, dwIdOld);
        VirtualProtectEx(hProc, fpMessageBoxA,5, PAGE_READWRITE, &dwIdOld);
        WriteProcessMemory(hProc, fpMessageBoxA, OldMessageBoxACode, 5, 0);
        VirtualProtectEx(hProc, fpMessageBoxA, 5, dwIdOld, &dwIdOld);
        bHook = false;
    }
    //---------------------------------------------------------------------------
    int WINAPI DllMain(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
        switch (reason)
        {
            case DLL_PROCESS_ATTACH:
                if(!Init())
                {
                    MessageBoxA(NULL,"Init","ERROR",MB_OK);
                    return(false);
                }
            case DLL_THREAD_ATTACH:
            case DLL_THREAD_DETACH:
            case DLL_PROCESS_DETACH:
                if(bHook)
                    UninstallHook();
                break;
          }
        return TRUE;
    }
      

  4.   

    LS高人,辛苦了。可惜我汇编太菜,即便上面hook MessageBoxA成功,我也不知道hook别的要怎么改阿。
      

  5.   

    网上找的代码是vckbase的hookyou例子,有需要的去那里找吧