Java - 阅读有关另一个程序的信息?

Stu*_*ons 2 java ram pixel

所以我想创建一个可以从另一个程序读取数据的Java程序.它来自一个游戏,我不能(据我所知)从文件中获取信息(它运行在服务器端).我该怎么做?目前我正在从屏幕上读取像素,但我认为这不是正确的方法.我可以以某种方式访问​​RAM吗?信息将存储在那里.读取像素的问题是它应该在更多的计算机上运行,​​并且它们不一定具有相同的窗口分辨率/位置(可以是窗口模式).有任何想法吗?

Jor*_*yle 8

Java不一定是最好的语言.实现您想要做的事情的一种方法是创建一个可注入的DLL,它使用指针从内存ReadProcessMemory中读取或用于从外部进程读取内存.

如果您确定要使用Java,可以使用JNA库访问本机方法,ReadProcessMemory并使用CheatEngine等工具查找内存地址.

要加载Kernel32(ReadProcessMemory方法所在的位置),您必须执行以下操作:

Kernel32 kernel32 = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
Run Code Online (Sandbox Code Playgroud)

然后,您需要知道完成所需操作所需的访问权限,可以在Microsoft的网站上找到.在这种情况下,我们只想读取所以我们需要的访问权限PROCESS_VM_READ (0x0010).然后我们可以将这个值存储在const中:

public static final int PROCESS_VM_READ = 0x0010;
Run Code Online (Sandbox Code Playgroud)

然后,如果我们查找ReadProcessMemory的语法,我们发现语法是这样的:

BOOL WINAPI ReadProcessMemory(
  _In_   HANDLE hProcess,
  _In_   LPCVOID lpBaseAddress,
  _Out_  LPVOID lpBuffer,
  _In_   SIZE_T nSize,
  _Out_  SIZE_T *lpNumberOfBytesRead
);
Run Code Online (Sandbox Code Playgroud)

ReadProcessMemory采用进程句柄(Pointer在JNA中),要读取的内存地址(假设我们要从静态值读取0x10101AAA82),要读取的缓冲区,值的大小以及输出读取的字节数的最后一个值null因为我们并不在乎,所以我们会这样做.

首先,我们想要打开一个指向我们想要读取的进程的指针,假设您知道进程的PID:

Pointer process = kernel32.OpenProcess(PROCESS_VM_READ, pid);
Run Code Online (Sandbox Code Playgroud)

现在我们掌握了这个过程(即第一个参数) ReadProcessMemory

我们要读取的缓冲区将是一个Memory实例,我们可以通过传入我们想要读取的值的大小来实例化,假设我想在这种情况下读取2个字节.

Memory memory = new Memory(2);
Run Code Online (Sandbox Code Playgroud)

我们现在已经获得了读取内存值所需的所有参数:

kernel32.ReadProcessMemory(process, 0x10101AAA82, memory, 2, null);
Run Code Online (Sandbox Code Playgroud)

这意味着我们希望从进程中读取2 bytes内存地址到内存中.0x10101AAA82processmemory

现在我们可以获得我们刚刚阅读的内容的价值!如果我的价值是一个整数,我们可以调用getInt(offset)memory因为我们希望从一开始阅读,我们将通过在0作为偏移.您还可以运行getString,getChar或任何对上市的javadoc.现在你有了自己的价值!