钩子注入
C#不能注入,还是很遗憾的,不能不多学门语言C++了。于delphi语法不熟,VB搞起来还要用另外的工具编译注入DLL,还是很麻烦的。C++注入则简单多了。以下是VC MFC代码注入。
DLL代码
在DLL类里有头文件和代码文件,两个文件都要加代码
.h文件添加以下代码
.cpp代码
注入就这么简单了
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 }
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();
};
//
#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();
}
//
#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();
}
注入就这么简单了