为了账号安全,请及时绑定邮箱和手机立即绑定

JNA - CreateToolhelp32Snapshot 未返回所有 DLL

JNA - CreateToolhelp32Snapshot 未返回所有 DLL

交互式爱情 2024-01-05 16:22:55
我正在尝试从我可以处理的进程中获取模块的基地址。我已经使用 CreateToolhelp32Snapshot 和 EnumProcessModules 方法尝试过此操作。问题是这两种方法都只返回这 5 个 DLL:underrail.exe ndll.dll wow64.dll wow64win.dll wow64cpu.dll我知道应该有更多模块,并且尝试在其他游戏中使用它会返回相同的 5 个模块。我找到了同一问题的一些答案,但它们都不适合我:https://www.unknowncheats.me/forum/counterstrike-global-offensive/169030-modules.htmlJNA - EnumProcessModules() 未返回所有 DLL?第一个不起作用,因为我无法使用 TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32 作为方法中的标志。第二个不起作用,因为当我尝试调用 Psapi.INSTANCE.EnumProcessModulesEx(...) 时,我无法调用方法 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 相同的结果
查看完整描述

1 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

目前,方法 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);



查看完整回答
反对 回复 2024-01-05
  • 1 回答
  • 0 关注
  • 98 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信