Java(JNA API) - 计算基址

时间:2014-02-20 21:35:03

标签: java memory jna

在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集合找到游戏客户端的进程?我是否正在为正确的指针提供功能?我是否需要重构代码以计算基址?

1 个答案:

答案 0 :(得分:0)

您正在枚举当前流程的所有模块,即:您的流程,即:javaw.exe。这是因为您使用EnumProcessModules

的结果提供GetCurrentProcess() API

如果您想枚举其他流程的模块,则需要OpenProcess使用PID

您可以通过两种方法获得PID:

  1. Enumerating the processes
  2. Finding some windowthen its PID