【发布时间】:2021-09-13 17:43:51
【问题描述】:
已更新:在问题的机器人处查看更新
我想得到game.dll 的基地址,它位于war3.exe 进程中。
我正在尝试通过 JNA 库版本 5.9.0 来实现,但没有成功。
我遇到的问题:我无法从 war3.exe 进程中获取 game.dll 模块。 我尝试使用它:
int pid = getProcessId("Warcraft III");
openProcess(PROCESS_ALL_ACCESS, pid);
WinDef.HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle("game.dll")
但是hMod 的结果是null。
我还尝试获取 war3.exe 进程拥有的所有模块。如您所见,它仅包含 5 个模块,并且不包含 game.dll。但是当我通过 Process Explorer 打开 war3.exe 时,我看到的肯定不止 5 个。
请分享您的意见和想法,为什么我只能从 IDE 获得 5 个模块。
任何关于如何通过 JNA 获取 game.dll 模块及其基地址的建议将不胜感激。
更新:
根据雷米的回答,我再次尝试使用EnumProcessModules()。
这是我的代码 sn-p:
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.Psapi;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef.HMODULE;
import com.sun.jna.platform.win32.WinNT.HANDLE;
import com.sun.jna.ptr.IntByReference;
import java.util.Arrays;
import java.util.List;
import static com.sun.jna.platform.win32.WinNT.PROCESS_ALL_ACCESS;
import static handler.memory.MemoryHandler.openProcess;
public class MemoryHandler {
static final User32 user32 = User32.INSTANCE;
static final Psapi psapi = Psapi.INSTANCE;
public static void main(String[] args) {
int pid = getProcessId("Warcraft III");
HANDLE process = openProcess(PROCESS_ALL_ACCESS, pid);
HMODULE[] hMods = new HMODULE[1024];
psapi.EnumProcessModules(process, hMods, hMods.length, new IntByReference(1024));
List<HMODULE> hModList = Arrays.asList(hMods);
hModList.forEach(hMod ->
System.out.println(Pointer.nativeValue(hMod.getPointer())));
}
public static int getProcessId(String window) {
IntByReference pid = new IntByReference(0);
user32.GetWindowThreadProcessId(user32.FindWindow(null, window), pid);
return pid.getValue();
}
}
据我所知,我得到了一些指示。但是我应该如何理解他们中的哪一个与game.dll有关?我假设我应该以某种方式获得模块列表,在那里我可以看到它们的名称和基地址。
此外,如果我将 System.out.println(Pointer.nativeValue(hMod.getPointer()))); 更改为 hModList.forEach(System.out::println);,我会看到以下指针和大量空值(大约 1000 个)。
这些地址是否包含game.dll的地址?
【问题讨论】:
-
你没有发现它很了不起吗,你不必将进程句柄(同样值得注意的是,你找不到保留它的理由)传递给
GetModuleHandle()的调用?
标签: java c++ winapi java-native-interface jna