前两篇文章分别讲了JNI和CE查找游戏基址,
这一篇就到了真正的主题。

注意:
开发这个项目,需要将项目的jdk修改为1.6版本,高于1.6会有问题。
右键你的项目→Build Path→Configure Build Path→Libraried→选中JRE→点击右边的Edit按钮→选择1.6的JDK版本,
当然你电脑上必须有1.6版本的JDK。

那么用java编写游戏修改器,需要以下几步:

  1. 获取进程令牌

    GiveProcessPrivilege give = new GiveProcessPrivilege();
    give.give(Kernel32_DLL.INSTANCE.GetCurrentProcess(),                 
    LookupPrivilegeValue.SeDebugPrivilege);
    
    
  2. 创建GUI界面
  3. 获取游戏窗口信息

    String windowName = "Plants vs. Zombies GOTY ";
    HWND hwnd = User32.INSTANCE.FindWindow(null,windowName);
    
  4. 获取游戏PID

    IntByReference dwPID = new IntByReference();  //dwPID 进程标识
    int pid = User32.INSTANCE.GetWindowThreadProcessId(hwnd,dwPID);
    
  5. 通过OpenProcess打开游戏进程

    Kernel32.INSTANCE.OpenProcess(OpenProcess.PROCESS_ALL_ACCESS, false, dwPID.getValue());
    
  6. 读取游戏内存信息

    Kernel32_DLL.INSTANCE.VirtualQueryEx(hProcess, istartAddress, memoryInfo, size);
    
  7. 读取或者修改内存信息

    //读取内存信息
    Kernel32.INSTANCE.ReadProcessMemory(handle, firstAddress, firstBuffer, 4, intByReference) 
    //修改内存信息
    Kernel32.INSTANCE.WriteProcessMemory(handle, sunAddress, update, 4, intByReference)
    
  8. 释放资源

    //释放内存
    ReferenceFree.free(buffer);
    //释放资源
    Kernel32.INSTANCE.CloseHandle(handle);
    

演示:
1.gif

最后修改:2023 年 03 月 24 日
如果觉得我的文章对你有用,请随意赞赏