C 语言游戏外挂 (二):从基址读取数据

  • A+
所属分类:逆向工程

声明:本系列文章由网络转载,

          转载来源未知,

          版权属于原作者,特此声明。

C 语言游戏外挂 (二):从基址读取数据

通过 C 语言编写一个外挂,通过 API 函数获取游戏数据,从而实现作弊功能

  • 对象分析

  • 要用的 API 函数简单介绍

  • 编写测试效果

  • 总体评价

对象分析

C 语言游戏外挂 (二):从基址读取数据

本次游戏对象为 Plants vs. Zombies1.0.0.1051 汉化第一版

试玩发现主要数据有阳光、金钱,其中金钱最小以 10 为单位,因此数据应以 “显示钱数 / 10” 保存

通过 CE 确定阳光和金钱的基址计算公式

[[[006A9EC0]+768]+5560] = sun 

[[[006A9F38]+82C]+28] = money 

故所求基址为 006A9EC0 和 006A9F38,利用偏移即可得出数据

要用的 API 函数简单介绍

HWND ReadProcessMemory(HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead); 根据进程句柄读入该进程的某个内存空间 lpBaseAddress 的 nSize 字节,并写入缓冲区 lpBuffer,多次计算基址和偏移即可

编写测试效果

C 语言游戏外挂 (二):从基址读取数据

打开游戏

C 语言游戏外挂 (二):从基址读取数据

运行外挂 (截图前修改过钱数值) 成功读取出阳光和金钱的数据,如再使用写入内存将所想要的值写入即达到修改功能

C 语言游戏外挂 (二):从基址读取数据

修改成功

  1. //

  2. //  02从基址读取数据.cpp

  3. //  C/C++

  4. //

  5. #include <stdio.h>

  6. #include <windows.h>

  7. int main() {

  8.    HWND h = ::FindWindow(NULL, "植物大战僵尸中文版");   //      寻找并打开进程

  9.    DWORD processid;

  10.    GetWindowThreadProcessId(h, &processid);

  11.    HANDLE processh = 0;

  12.    processh = OpenProcess(PROCESS_ALL_ACCESS,FALSE,processid);

  13.    if (processh == 0) {    //    对应处理

  14.        printf("打开进程失败!n");

  15.        return 1;

  16.    } else {

  17.        printf("打开进程成功!n");

  18.        int sun;    //    用于存放阳光数据

  19.        LPCVOID mbase = (LPCVOID)0x006A9EC0;    //    [[[006A9EC0]+768]+5560] = sun

  20.        LPVOID mbuffer = (LPVOID)&sun;

  21.        ::ReadProcessMemory(processh, mbase, mbuffer, 4,  0);

  22.        mbase = (LPCVOID)(sun + 0x768);

  23.        ::ReadProcessMemory(processh, mbase, mbuffer, 4,  0);

  24.        mbase = (LPCVOID)(sun + 0x5560);

  25.        ::ReadProcessMemory(processh, mbase, mbuffer, 4,  0);

  26.        printf("您有阳光:%dn", sun);

  27.        int money;     //    用于存放钱数据

  28.        LPCVOID mbase2 = (LPCVOID)0x006A9F38;      //    [[[006A9F38]+82C]+28] = money

  29.        LPVOID mbuffer2 = (LPVOID)&money;

  30.        ::ReadProcessMemory(processh, mbase2, mbuffer2, 4,  0);

  31.        mbase2 = (LPCVOID)(money + 0x82C);

  32.        ::ReadProcessMemory(processh, mbase2, mbuffer2, 4,  0);

  33.        mbase2 = (LPCVOID)(money + 0x28);

  34.        ::ReadProcessMemory(processh, mbase2, mbuffer2, 4,  0);

  35.        printf("您有钱:%d0n", sun);

  36.        /*

  37.        DWORD maxsun = 99999;     //  写入内存修改游戏数据

  38.        DWORD maxmoney = 99999;

  39.        WriteProcessMemory(processh, (LPVOID)mbase, &maxsun, 4, 0);

  40.        WriteProcessMemory(processh, (LPVOID)mbase2, &maxmoney, 4, 0);

  41.        */

  42.    }

  43.    return 0;

  44. }

总体评价

简单读取游戏中的内存数据并显示修改

C 语言游戏外挂 (二):从基址读取数据

inn0team是一个正在成长的安全团队
微信号:inn0team
C 语言游戏外挂 (二):从基址读取数据
长按可关注我们


本文始发于微信公众号(inn0team):C 语言游戏外挂 (二):从基址读取数据

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: