Java获取程序的基址

Java获取程序的基址,java,memory,jna,Java,Memory,Jna,所以,我想得到一个程序的基址 我试图使用进程id和指针(jna)来获取它,但它总是返回0 这就是它看起来的样子 public static void main(String[] args) { enableDebugPrivilege(); int pID = getProcessId(gameWindowName); System.out.println("Pid = " + pID); int base = findBaseAddress(pID)

所以,我想得到一个程序的基址

我试图使用进程id和指针(jna)来获取它,但它总是返回0

这就是它看起来的样子

  public static void main(String[] args) {
    enableDebugPrivilege(); 

    int pID = getProcessId(gameWindowName);
    System.out.println("Pid = " + pID); 

    int base = findBaseAddress(pID); 

    System.out.println("Base Address: " + Integer.toHexString((int) base));
    HANDLE game = openProcess(WinNT.PROCESS_QUERY_INFORMATION | WinNT.PROCESS_VM_READ, pID);

}

private static int findBaseAddress(int pID) {
    try {
        HANDLE game = openProcess(WinNT.PROCESS_QUERY_INFORMATION | WinNT.PROCESS_VM_READ, pID);
        List<Module> modules = PsapiTools.getInstance().EnumProcessModulesEx(game, 0x01);
        for (Module module : modules) {

            if (module.getBaseName().equals(gameExe)) {
                if (module.getLpBaseOfDll() != null) {
                    int baseAddress = ((Long) Pointer.nativeValue(module.getLpBaseOfDll().getPointer())).intValue();
                    return baseAddress;
                }
            }
        }
    } catch (Exception e) {
        System.out.println("Error finding base address");
        return -1;
    }
    return 0;
}
publicstaticvoidmain(字符串[]args){
enableDebugPrivilege();
int pID=getProcessId(gameWindowName);
System.out.println(“Pid=“+Pid”);
int base=findBaseAddress(pID);
System.out.println(“基址:“+Integer.toHexString((int)Base));
HANDLE game=openProcess(WinNT.PROCESS_QUERY_INFORMATION | WinNT.PROCESS_VM_READ,pID);
}
私有静态int findBaseAddress(int pID){
试一试{
HANDLE game=openProcess(WinNT.PROCESS_QUERY_INFORMATION | WinNT.PROCESS_VM_READ,pID);
List modules=PsapiTools.getInstance().EnumProcessModulesEx(游戏,0x01);
用于(模块:模块){
if(module.getBaseName().equals(gameExe)){
if(module.getLpBaseOfDll()!=null){
int baseAddress=((长)Pointer.nativeValue(module.getLpBaseOfDll().getPointer()).intValue();
返回基地址;
}
}
}
}捕获(例外e){
System.out.println(“错误查找基址”);
返回-1;
}
返回0;
}

您是否以提升的权限运行程序(以管理员身份运行)?另请参见此问题:尽管这使用了
EnumProcessModules
,我相信您使用
EnumProcessModulesEx
是正确的。JNA有一个
Kernel32Util
类和一个
getModules()
方法,这可能会有帮助。您找到解决方案了吗?