前两篇文章分别讲了JNI和CE查找游戏基址, 这一篇就到了真正的主题。
注意: 开发这个项目,需要将项目的jdk修改为1.6版本,高于1.6会有问题。 右键你的项目→Build Path→Configure Build Path→Libraried→选中JRE→点击右边的Edit按钮→选择1.6的JDK版本, 当然你电脑上必须有1.6版本的JDK。
那么用java编写游戏修改器,需要以下几步:
获取进程令牌
GiveProcessPrivilege give = new GiveProcessPrivilege();
give.give(Kernel32_DLL.INSTANCE.GetCurrentProcess(),
LookupPrivilegeValue.SeDebugPrivilege);
创建GUI界面
获取游戏窗口信息
String windowName = "Plants vs. Zombies GOTY ";
HWND hwnd = User32.INSTANCE.FindWindow(null,windowName);
获取游戏PID
IntByReference dwPID = new IntByReference(); //dwPID 进程标识
int pid = User32.INSTANCE.GetWindowThreadProcessId(hwnd,dwPID);
通过OpenProcess打开游戏进程
Kernel32.INSTANCE.OpenProcess(OpenProcess.PROCESS_ALL_ACCESS, false, dwPID.getValue());
读取游戏内存信息
Kernel32_DLL.INSTANCE.VirtualQueryEx(hProcess, istartAddress, memoryInfo, size);
读取或者修改内存信息
//读取内存信息
Kernel32.INSTANCE.ReadProcessMemory(handle, firstAddress, firstBuffer, 4, intByReference)
//修改内存信息
Kernel32.INSTANCE.WriteProcessMemory(handle, sunAddress, update, 4, intByReference)
释放资源
//释放内存
ReferenceFree.free(buffer);
//释放资源
Kernel32.INSTANCE.CloseHandle(handle);
演示: