免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
上一个内容:39.右键弹出菜单管理游戏列表
以 39.右键弹出菜单管理游戏列表 它的代码为基础进行修改
效果图:
实现步骤:
首先在Dlls项目中窗口ID位IDD_WNDMAIN里面添加下图中两个控件
然后添加给按钮点击时触发的函数中如下图中的实现:
void CWndMain::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
int* hp = (int*)0x4CEF18;
wInfo.Format(L"HP: %d/%d", hp[0], hp[1]);
UpdateData(FALSE);
unsigned decx = 0x4CEF08;
unsigned dcall = 0x41FD40;
_asm {
push 0x02
push 0x9999
mov ecx, decx
call dcall
}
}
然后给输入框添加一个变量如下图:
Dlls.cpp文件中钩子函数做出了修改,KeyCallBack函数
// Dlls.cpp: 定义 DLL 的初始化例程。
//
#include "pch.h"
#include "framework.h"
#include "Dlls.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
//
//TODO: 如果此 DLL 相对于 MFC DLL 是动态链接的,
// 则从此 DLL 导出的任何调入
// MFC 的函数必须将 AFX_MANAGE_STATE 宏添加到
// 该函数的最前面。
//
// 例如:
//
// extern "C" BOOL PASCAL EXPORT ExportedFunction()
// {
// AFX_MANAGE_STATE(AfxGetStaticModuleState());
// // 此处为普通函数体
// }
//
// 此宏先于任何 MFC 调用
// 出现在每个函数中十分重要。 这意味着
// 它必须作为以下项中的第一个语句:
// 出现,甚至先于所有对象变量声明,
// 这是因为它们的构造函数可能生成 MFC
// DLL 调用。
//
// 有关其他详细信息,
// 请参阅 MFC 技术说明 33 和 58。
//
// CDllsApp
BEGIN_MESSAGE_MAP(CDllsApp, CWinApp)
END_MESSAGE_MAP()
// CDllsApp 构造
CDllsApp::CDllsApp()
{
// TODO: 在此处添加构造代码,
// 将所有重要的初始化放置在 InitInstance 中
isShowWindow = TRUE;
}
// 唯一的 CDllsApp 对象
CDllsApp theApp;
CDllsApp* PtheApp;
// CDllsApp 初始化
HHOOK keyHook;
LRESULT CALLBACK KeyCallBack(int nCode, WPARAM w, LPARAM l);
BOOL CDllsApp::InitInstance()
{
CWinApp::InitInstance();
PtheApp = this;
keyHook = SetWindowsHook(WH_KEYBOARD, KeyCallBack);
return TRUE;
}
LRESULT CALLBACK KeyCallBack(int nCode, WPARAM w, LPARAM l) {
if (nCode == HC_ACTION) {
if (l & (1 << 31)) {
switch (w)
{
case VK_HOME: {
if (PtheApp->wndMain == NULL) {
PtheApp->wndMain = new CWndMain();
PtheApp->wndMain->Create(IDD_WNDMAIN);
}
PtheApp->wndMain->ShowWindow(PtheApp->isShowWindow);
PtheApp->isShowWindow = !PtheApp->isShowWindow;
break;
}
default:
break;
}
}
}
return CallNextHookEx(keyHook, nCode, w, l);
}
OnBnClickedButton1函数中实现的自杀与读取游戏数据功能就非常简单方便直接把游戏进程中真正存在的地址拿来用,hook引擎带来的好处就是可以当做得到了游戏源码来进行编程