JNA-CreateToolhelp32Snapshot不会返回所有DLL

问题描述 投票:1回答:1

我正在尝试从我要处理的进程中获取模块的基地址。我已经使用CreateToolhelp32Snapshot和EnumProcessModules方法进行了尝试。


问题在于,这两个方法仅返回这5个DLL:

underrail.exe
ndll.dll
wow64.dll
wow64win.dll
wow64cpu.dll

我知道应该有更多的模块,尝试在其他游戏中使用此模块会返回相同的5个模块。

我已经找到了相同问题的一些答案,但它们都不适合我:

  1. https://www.unknowncheats.me/forum/counterstrike-global-offensive/169030-modules.html
  2. JNA - EnumProcessModules() not returning all DLLs?

第一个无效,因为我无法使用TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32作为方法中的标志。

第二个无效,因为我无法调用方法EnumProcessModulesEx()当我尝试调用Psapi.INSTANCE.EnumProcessModulesEx(...)

这是我的代码段:

public static int getModuleBaseAddress(int process_id) {

    DWORD pid = new DWORD(process_id);
    HANDLE snapshot = null;

    snapshot = kernel32.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPMODULE, pid);
    MODULEENTRY32W module = new MODULEENTRY32W();


    while(Kernel32.INSTANCE.Module32NextW(snapshot, module)) {

        String s = Native.toString(module.szModule);
        Pointer x = module.modBaseAddr;
        System.out.println(s);
        System.out.println(x);
        System.out.println("---");

    }

    return 0;


}

请注意,使用Tlhelp32.TH32CS_SNAPMODULE32不返回任何内容,而Tlhelp32.TH32CS_SNAPALL返回的内容与lhelp32.TH32CS_SNAPMODULE相同

java jna
1个回答
0
投票

感谢Daniel Widdis,我得到了答案。

当前,方法EnumProcessModulesEx尚未映射到JNA,因此您必须制作自己的自定义版本的Psapi,在我的情况下,它看起来像这样:

import com.sun.jna.Native;
import com.sun.jna.platform.win32.Psapi;
import com.sun.jna.platform.win32.WinDef.HMODULE;
import com.sun.jna.platform.win32.WinNT.HANDLE;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.win32.W32APIOptions;

public interface CustomPsapi extends Psapi{

    Psapi INSTANCE = Native.load("psapi", Psapi.class, 
    W32APIOptions.DEFAULT_OPTIONS);

    public void EnumProcessModulesEx(HANDLE hProcess, HMODULE[] lphModule, int cb, 
    IntByReference lpcbNeeded, int dwFilterFlag);


}

然后,您可以加载自定义类并使用映射的方法。

public static CustomPsapi c_psapi = Native.load("psapi", CustomPsapi.class);

为了正确显示所有DLL,您需要使用现在映射的EnumProcessModulesEx方法,并将所有模块的标志用作最后一个参数(0x03)因此该方法应如下所示:

c_psapi.EnumProcessModulesEx(process, modules, 1024, new IntByReference(1024), 0x03);
© www.soinside.com 2019 - 2024. All rights reserved.