现在的位置: 首页 > 综合 > 正文

钩子注入

2011年10月24日 ⁄ 综合 ⁄ 共 4472字 ⁄ 字号 评论关闭
C#不能注入,还是很遗憾的,不能不多学门语言C++了。于delphi语法不熟,VB搞起来还要用另外的工具编译注入DLL,还是很麻烦的。C++注入则简单多了。以下是VC MFC代码注入。

 1 //方法外变量
 2 HINSTANCE hInstance;
 3 HWND hWnd;
 4 
 5 
 6 //响应按钮事件
 7  hWnd=::FindWindow(NULL,TEXT("窗口名"));   //也可以窗口与CLASS一起指定FindWindow(L"Class名",TEXT("窗口名"));   
 8  if(!hWnd)
 9     {
10         AfxMessageBox(L"请先启动游戏。");
11         return;
12     }
13 
14  DWORD pid;
15  DWORD tid = GetWindowThreadProcessId(hWnd,&pid);      //注意这个tid有用
16 
17 
18 //调用DLL
19 typedef BOOL (WINAPI * InstallHook)(DWORD dwThreadID);
20 
21 hInstance= LoadLibrary(L"dll名称");
22 
23  if(hInstance==NULL)
24  {
25   AfxMessageBox(L"载入DLL失败");
26  }
27  InstallHook enbleHook;
28  enbleHook = (InstallHook)GetProcAddress(hInstance,"_InstallHook@4");      //注意_InstallHook@4是DLL的函数名,是编译后的名称,和实际
29                                                                                                                   //名称不一样,可以用工具查看
30  if(enbleHook != NULL)
31   (*enbleHook)(tid);
32  else
33  {
34   AfxMessageBox(L"调用方法失败");
35  }
36 
37 释放DLL则是
38 
39 void Dlg::OnClose()
40 {
41  // TODO: 在此添加消息处理程序代码和/或调用默认值
42  typedef BOOL (WINAPI * UninstallHook)();
43  UninstallHook uHook;
44  uHook = (UninstallHook)GetProcAddress(hInstance,"_UninstallHook@0");
45  if(uHook != NULL)
46   (*uHook)();
47  CDialog::OnClose();
48 }

DLL代码

在DLL类里有头文件和代码文件,两个文件都要加代码

.h文件添加以下代码

// .h : DLL 的主头文件
//
#ifndef HOOKAPI                                                                           //以下3行要添加
#define HOOKAPI extern "C" __declspec(dllimport)
#endif
#pragma once

#ifndef __AFXWIN_H__
    #error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"
#endif

#include "resource.h"        // 主符号

HOOKAPI BOOL WINAPI InstallHook(DWORD dwProcessID);         //以下两行要添加,就是把InstallHook和UninstallHook设为导出函数
HOOKAPI BOOL WINAPI UninstallHook();
// CApp
// 有关此类实现的信息,请参阅 .cpp
//

class CApp : public CWinApp
{
public:
    CApp();

// 重写
public:
    
virtual BOOL InitInstance();

    DECLARE_MESSAGE_MAP()
public:
    
virtual int ExitInstance();
};

.cpp代码

// .cpp : 定义 DLL 的初始化例程。
//

#include 
"stdafx.h"
#define HOOKAPI extern "C" __declspec(dllexport)         //在头文件之前添加
#include 
".h"                           //引用头文件
#include 
"MyForm.h"           //这个是要激活的窗口头文件,下面代码按F12键,则打开这个窗口

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

HHOOK g_hhook;
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);

BEGIN_MESSAGE_MAP(CApp, CWinApp)
END_MESSAGE_MAP()

// CApp 构造

CZhuXieApp::CApp()
{
    
// TODO: 在此处添加构造代码,
    
// 将所有重要的初始化放置在 InitInstance 中
}

// 唯一的一个 CApp 对象

CApp theApp;

// CApp 初始化

MyForm 
* myForm;         //窗体
DWORD pid;

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    LPARAM bKeyUp 
= lParam & (1 << 31);
    //按F12事件
    
if (bKeyUp && wParam == VK_F12 && nCode == HC_ACTION) {
         //如果窗体没有初始化
        if(myForm == NULL)
        {
            //实例化窗体
            AFX_MANAGE_STATE(AfxGetStaticModuleState());
            CWnd 
*pCWnd = CWnd::GetForegroundWindow();
                DWORD pid = GetCurrentProcessId();
               //这里赋予DLL全局的当前进程ID,后面有用,要读写内存不用再去取了
                Gobal::hProcess 
= ::OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
                myForm 
= new MyForm();
                myForm
->Create(IDD_MainForm,pCWnd);
                myForm
->ShowWindow(SW_SHOW);
        }else
        {
            myForm
->ShowWindow(myForm->IsWindowVisible() ? SW_HIDE : SW_SHOW);
        }
    }
    
return ::CallNextHookEx(g_hhook, nCode, wParam ,lParam);
}

//装载钩子
HOOKAPI BOOL WINAPI InstallHook(DWORD dwProcessID)
{
    if (g_hhook == NULL) {
         //dwProcessID就是启动程序里的tid,保证这里注册的热键只对该程序有效,如果要全局注入,就设置为0
        g_hhook 
= ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, theApp.m_hInstance, dwProcessID);
        
if (g_hhook != NULL)
            
return TRUE;
    }
    
return FALSE;
}

//卸载钩子
ZhuXieHOOKAPI BOOL WINAPI UninstallHook()
{
    return ::UnhookWindowsHookEx(g_hhook);
}

BOOL CZhuXieApp::InitInstance() 
{
    // TODO: Add your specialized code here and/or call the base class
   //初始化室顺便把窗体初始化
    if(myForm == NULL)
    {
        AFX_MANAGE_STATE(AfxGetStaticModuleState());
        CWnd 
*pCWnd = CWnd::GetForegroundWindow();
            DWORD pid = GetCurrentProcessId();
            Gobal::hProcess 
= ::OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
            myForm 
= new MyForm();
            myForm
->Create(IDD_MainForm,pCWnd);
            myForm->ShowWindow(SW_HIDE);
    }
    
return CWinApp::InitInstance();
}

int CZhuXieApp::ExitInstance() 
{
    
// TODO: Add your specialized code here and/or call the base class
   //DLL退出则处理掉窗体
    if(myForm!=NULL)
        delete myForm;
    
return CWinApp::ExitInstance();
}

注入就这么简单了

抱歉!评论已关闭.