首页
社区
课程
招聘
[原创]外挂学习-植物大战僵尸-修改阳光
2022-1-8 12:03 1832

[原创]外挂学习-植物大战僵尸-修改阳光

2022-1-8 12:03
1832

前言

记录一下前段时间学习到的一些用CE确定游戏基址的简单技巧和用WriteProcessMemory/ReadProcessMemory编写相应的外挂。

过程

  1. 确定记录阳光值的第一层地址:0x2F330FD8

  2. “找出是什么访问了这个地址”:
  3. 两个都是 0x2732BA60+0x5578
  4. 找一下保存 0x2732BA60 的地址,多点几次再次扫描,发现了一个跟别的地址都不太相邻的应该就是它了:0x25AAB08
  5. 跟上一步一样,“找出是什么访问了这个地址”,继续找下去:0x25AA2A0+0x868
  6. 找到了4个绿色的基址(0x755E0C,0X755EAC,0X755F28,0X755F6C),应该都是可以用的,这里选择 0x755E0C:

    总结

    总体修改思路就是:从0x755E0C读取一个地址,记为addr1;再从addr1+0x868读取一个地址,记为addr2addr2保存的就是阳光值,修改这个地址的数据即可。

    脚本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    #include <windows.h>
    #include <stdio.h>
    #include <memoryapi.h>
    #include <tlhelp32.h>
     
    /*
    * @brief 根据进程名获取进程ID
    * @param lpProcessName进程名称
    * @from https://blog.csdn.net/zjx_cfbx/article/details/82390064
    */
    DWORD __getProcessHandle(LPCTSTR lpProcessName)//根据进程名查找进程PID
    {
        DWORD dwRet = 0;
        HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        if (hSnapShot == INVALID_HANDLE_VALUE)
        {
            printf("获得进程快照失败,GetLastError() = %d\n", GetLastError());
            return dwRet;
        }
     
        PROCESSENTRY32 pe32;//声明进程入口对象
        pe32.dwSize = sizeof(PROCESSENTRY32);//填充进程入口对象大小
        Process32First(hSnapShot, &pe32);//遍历进程列表
        do
        {
            if (!lstrcmp(pe32.szExeFile, lpProcessName))//查找指定进程名的PID
            {
                dwRet = pe32.th32ProcessID;
                break;
            }
        } while (Process32Next(hSnapShot, &pe32));
        CloseHandle(hSnapShot);
        return dwRet;//返回
    }
     
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){
        int i;
        DWORD ID = __getProcessHandle("PlantsVsZombies.exe");
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, ID);
        if(!hProcess){
            puts("打开进程失败。");
            exit(1);
        }
     
        char lpBuffer[10];
        LPVOID base = 0x755E0C;
        if(!ReadProcessMemory(hProcess, base, lpBuffer, 4, NULL)) {
            puts("读取内存失败。");
            exit(2);
        }
     
        long long addr1 = 0;
        for(i = strlen(lpBuffer) - 1; i >= 0; i--){
            addr1 = addr1*0x100 + (lpBuffer[i]&0xff);
        }
     
        if(!ReadProcessMemory(hProcess, (LPVOID)(addr1+0x868), lpBuffer, 4, NULL)) {
            puts("读取内存失败。");
            exit(2);
        }
     
        long long addr2 = 0;
        for(i = strlen(lpBuffer) - 1; i >= 0; i--)
            addr2 = addr2*0x100 + (lpBuffer[i]&0xff);
        addr2 += 0x5578;
     
        //将阳光值修改为 0x1020 = 4128
        char in_data[2] = {0x20, 0x10};
        SIZE_T nSize = 2;
        WriteProcessMemory(hProcess, (LPVOID)addr2, in_data, nSize, NULL);
     
        return 0;
    }

    效果


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞4
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回