通过 C 语言编写一个简单的外挂,通过 API 函数修改游戏数据,从而实现作弊功能。
● 对象分析
● 要用的 API 函数简单介绍
● 编写测试效果
● 总体评价
对象分析
![](https://upload-images.jianshu.io/upload_images/24563956-69ec81db0966b8d3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
本次游戏对象为 Super Mario XP
没有更新所以可用任意版本 试玩发现人物血量最大为 10,心最大为 99,命最大为 99
要用的 API 函数简单介绍
HWND FindWindow(LPCTSTR IpClassName,LPCTSTR IpWindowName);
// 通过类名或窗口名查找,返回窗口句柄
DWORD GetWindowThreadProcessId(HWND hWnd,LPDWORD lpdwProcessId);
// 得到窗口句柄后通过 GetWindowThreadProcessId 这个函数来获得窗口所属进程 ID 和线程 ID
HANDLE OpenProcess(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwProcessId)
// 打开一个已存在的进程对象,并返回进程的句柄
bool WriteProcessMemory(HANDLE hProcess,LPVOID lpBaseAddress,LPVOID lpBuffer,DWORD nSize,LPDWORD lpNumberOfBytesWritten);
// 能写入某一进程的内存区域。入口区必须可以访问,否则操作将失败
编写测试效果
![](https://upload-images.jianshu.io/upload_images/24563956-9ec0a2685be77eef.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
打开游戏
![](https://upload-images.jianshu.io/upload_images/24563956-2b06389e2bcedada.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
运行外挂
![](https://upload-images.jianshu.io/upload_images/24563956-1d1e854c72075f78.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/24563956-14a186e770b8f849.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
成功执行
// 01一个简单的内存外挂.cpp
// C/C++
#include <windows.h>
#include <stdio.h>
int main() {
HWND h = ::FindWindow(NULL, "Super Mario XP"); // 寻找并打开进程
DWORD processid;
GetWindowThreadProcessId(h, &processid);
HANDLE hprocess = 0;
hprocess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processid);
if (hprocess == 0) { // 对应处理
printf("打开进程失败!
"
);
return 1;
} else {
printf("打开进程成功!
"
);
DWORD hp = 10; // 要修改的游戏数据最大值
DWORD heart = 99;
DWORD life = 99;
DWORD addr = 0x00428282; // 通过CE找到的游戏数据地址
DWORD addr2 = 0x00428292;
DWORD addr3 = 0x004282a2;
DWORD res = WriteProcessMemory(hprocess, (LPVOID)addr, &hp, 4, 0); // 写入内存修改游戏数据
DWORD res2 = WriteProcessMemory(hprocess, (LPVOID)addr2, &heart, 4, 0);
DWORD res3 = WriteProcessMemory(hprocess, (LPVOID)addr3, &life, 4, 0);
return 0;
}
总体评价
由于是简单外挂,没有 GDI 界面和失败对应处理,仅供入门学习交流!
文章来源:https://cloud.tencent.com/developer/article/1443763
![](https://upload-images.jianshu.io/upload_images/24563956-9bd052ad0b8f7df3.gif?imageMogr2/auto-orient/strip)
如果你想更好的提升你的编程能力,学好C语言C++编程!弯道超车,快人一步!
【C语言C++学习企鹅圈子】,分享(源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!
编程学习书籍:
![](https://upload-images.jianshu.io/upload_images/24563956-c134d3a8fcde8553.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
编程学习视频:
![](https://upload-images.jianshu.io/upload_images/24563956-884a3bf8b90c7e6b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)