gpt4 book ai didi

java - Kernel32.INSTANCE.ReadProcessMemory 在 JNA 中真的很慢

转载 作者:行者123 更新时间:2023-11-30 08:10:19 25 4
gpt4 key购买 nike

我正在编写一个游戏 hack,它使用内存操作来工作,并决定在 FUD 方面用 Java 编写它(几乎可以立即检测到 native hack)。

我有这个方法,它从 Windows 调用 ReadProcessMemory

中读取一个内存对象
public static Memory readMemory(Pointer process, long address, int bytesToRead) {
Memory output = new Memory(bytesToRead);
KERNEL32.ReadProcessMemory(process, address, output, bytesToRead, 0);
return output;
}

内存输出 = new Memory(bytesToRead);有时需要大约 0-5+ms 来执行

KERNEL32.ReadProcessMemory(process, address, output, bytesToRead, 0);也需要大约 0-5+ms 来执行。

读取这个的程序每个周期调用这些方法大约 1k 次(16ms 周期)。

编辑:我写了一个基本的测试类来测试 5000 次调用需要多长时间

public final class Test {
public static final int AMOUNT_OF_CALLS = 5000;

public static void main(String[] args) throws InterruptedException {
long start = System.currentTimeMillis();
for (int i = 0; i < AMOUNT_OF_CALLS; i++) {
Memory m = readMemory(new Pointer(1), 0xFFFFFFF, ThreadLocalRandom.current().nextInt(1, 8)); //Random between a byte read, or long
m.dispose();
}
System.out.println("Took " + (System.currentTimeMillis() - start) + "ms todo " + AMOUNT_OF_CALLS + " readMemory calls.");
}

public static Memory readMemory(Pointer process, long address, int bytesToRead) {
Memory output = new Memory(bytesToRead);
Kernel32.INSTANCE.ReadProcessMemory(process, address, output, bytesToRead, 0);
return output;
}

是否有任何其他方法可以执行 readMemory 方法,以便执行所有 5000 次调用所需的时间少于 32 毫秒?

最佳答案

您想在 32 毫秒内执行 5000 次调用。每次调用大约需要 6us。你能用纯 C 代码(不涉及 Java)做到这一点吗?你能在原始 JNI 中做到这一点吗?如果不是,那么尝试让它与 JNA 一起工作就没有多大意义。您不仅需要进行数据传输,还需要一些时间来处理该数据。

Memory 只是在 GC 上释放的 malloc 内存块的 Java 表示。预分配您需要的不同 block 的数量,或创建一个直接的 NIO 缓冲区(这可能允许更有效地调整 native 后备内存)。

预分配后,确保您使用的是直接映射,然后再次分析以查看您将时间花在哪里。

public class MyKernel32 {
static { Native.register(NativeLibrary.getInstance("kernel32", W32APIOptions.DEFAULT_OPTIONS)); }
public static native long ReadProcessMemory(HANDLE process, long address, Pointer buffer, int size, IntByReference numRead);
}

可能通过使用 long 代替 Pointer 获得一些 yield ,但是 YMMV,并且始终衡量增加的复杂性的影响。

关于java - Kernel32.INSTANCE.ReadProcessMemory 在 JNA 中真的很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31776620/

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