在Java中使用 JNA API ,我一直在搜索游戏的内存,试图撤回指向某个地址的多级指针,以绕过所使用的DMA。当我成功时,指针地址基于“gamename.exe”+ 0000025C 和几个级别的偏移。
有了这个,并且在重新启动客户端时动态重置了gamename.exe的基地址,我将需要计算基址。
我正在使用Java并且发现这个StackOverflow帖子对于设置方法JNA - Getting Base address
非常有帮助我写了一个类似的方法,下面的代码段:
public int getBaseAddress() {
try {
Pointer hProcess = main.Kernel32.INSTANCE.GetCurrentProcess();
System.out.println(hProcess);
List<Module> hModules = PsapiTools.getInstance().EnumProcessModules(hProcess);
System.out.println(hModules);
for(Module m: hModules){
System.out.println(m.getFileName());
if(m.getFileName().contains("NexusTK.exe")){
m.log(m.getFileName() + ": 0x" + Long.toHexString(Pointer.nativeValue(m.getEntryPoint())));
System.out.println(m);
return Integer.valueOf("" + Pointer.nativeValue(m.getLpBaseOfDll()));
}
}
} catch (Exception e) { e.printStackTrace(); }
return -1;
}
全班找到here
This是我的控制台显示的内容。很多DLL但我的游戏没有.exe。
问题:
如何通过Module集合找到游戏客户端的进程?我是否正在为正确的指针提供功能?我是否需要重构代码以计算基址?
答案 0 :(得分:0)
您正在枚举当前流程的所有模块,即:您的流程,即:javaw.exe
。这是因为您使用EnumProcessModules
GetCurrentProcess()
API
如果您想枚举其他流程的模块,则需要OpenProcess
使用PID
。
您可以通过两种方法获得PID: