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

时间:2015-04-17 03:44:14

标签: java pixel ram

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

2 个答案:

答案 0 :(得分:8)

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

如果您确定要为此使用Java,可以使用JNA Library访问本机方法ReadProcessMemory,并使用CheatEngine之类的工具查找内存地址

要加载Kernel32ReadProcessMemory方法所在的位置),您必须按照以下方式执行操作:

Kernel32 kernel32 = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);

然后,您需要知道完成所需操作所需的访问权限,可以在Microsoft's website找到。在这种情况下,我们只想阅读,因此我们需要的访问权限是PROCESS_VM_READ (0x0010)。然后我们可以将这个值存储在const:

public static final int PROCESS_VM_READ = 0x0010;

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

BOOL WINAPI ReadProcessMemory(
  _In_   HANDLE hProcess,
  _In_   LPCVOID lpBaseAddress,
  _Out_  LPVOID lpBuffer,
  _In_   SIZE_T nSize,
  _Out_  SIZE_T *lpNumberOfBytesRead
);

ReadProcessMemory接受一个进程句柄(JNA中为Pointer),要读取的内存地址(假设我们要从静态值0x10101AAA82读取),要读取的缓冲区,值的大小和输出我们将设置为null的字节数的最后一个值,因为我们并不关心。

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

Pointer process = kernel32.OpenProcess(PROCESS_VM_READ, pid);

现在我们有了进程的句柄(即ReadProcessMemory

的第一个参数

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

Memory memory = new Memory(2);

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

kernel32.ReadProcessMemory(process, 0x10101AAA82, memory, 2, null);

这意味着我们希望从进程2 bytes的内存地址0x10101AAA82中读取processmemory内存。

现在我们可以获得我们刚刚阅读的内容的价值!如果我的值是整数,我们可以在getInt(offset)上调用memory,因为我们想从头开始读取,我们将传递0作为偏移量。您还可以运行getStringgetCharjavadoc上列出的任何内容。现在你有了自己的价值!

答案 1 :(得分:0)

您实际上正在尝试或多或少地编写机器人。 我建议尝试找出负责此信息传递的文件和/或端口(可能很难)。 而且我不确定Java是最好的方法。 (Visual Basic可能吗?)