gpt4 book ai didi

java - JNA - CreateToolhelp32Snapshot 未返回所有 DLL

转载 作者:太空宇宙 更新时间:2023-11-04 09:18:47 28 4
gpt4 key购买 nike

我正在尝试从我有句柄的进程中获取模块的基地址。我已经使用 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 相同的结果

最佳答案

感谢 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);

关于java - JNA - CreateToolhelp32Snapshot 未返回所有 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58612128/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com