zoukankan      html  css  js  c++  java
  • 钩子注入

    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();
    }


    注入就这么简单了
  • 相关阅读:
    kettle参数、变量详细讲解[转]
    C# 异步
    〖Python〗-- 模块与包
    〖Python〗-- 异常处理
    〖Python〗-- 面向对象进阶
    〖Python〗-- 反射、内置attr、包装
    〖Python〗-- property、静态方法、类方法
    〖Python〗-- 面向对象编程的继承、多态与多态性、封装
    〖Python〗-- 面向对象编程、继承、组合、接口和抽象类
    〖Python〗-- 递归、面向对象初识及编程思想
  • 原文地址:https://www.cnblogs.com/birdshover/p/929113.html
Copyright © 2011-2022 走看看