Я пытаюсь прочитать часть из памяти экземпляра Блокнота, но всегда получаю системную ошибку 299 при вызове ReadProcessMemory()
ядра kernel32.
Это код, который у меня есть до сих пор:
package memreadtest;
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinNT.HANDLE;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.win32.W32APIOptions;
public class MemReader {
private final static Kernel32 kernel32 = Native.load("kernel32", Kernel32.class, W32APIOptions.DEFAULT_OPTIONS);
private final static User32 user32 = Native.load("user32", User32.class, W32APIOptions.DEFAULT_OPTIONS);
private final static int PROCESS_VM_READ = 0x0010;
public static void main(String[] args) {
int bytesToRead = 1024;
Memory notepadDump = readProcessMemory("*Untitled - Notepad", bytesToRead);
Memory.disposeAll();
}
private static Memory readProcessMemory(String winTitle, int bytesToRead) {
Memory output = new Memory(bytesToRead);
IntByReference pid = new IntByReference(0);
user32.GetWindowThreadProcessId(user32.FindWindow(null, winTitle), pid);
HANDLE handle = kernel32.OpenProcess(PROCESS_VM_READ, true, pid.getValue());
if (!kernel32.ReadProcessMemory(handle, handle.getPointer(), output, bytesToRead, null)) {
System.err.println("Failed to read memory of process " + pid.getValue() + ". System Error Code: " + kernel32.GetLastError());
return null;
}
return output;
}
}
Что я делаю не так?
handle.getPointer()
в качестве второго аргументаReadProcessMemory
конечно неправильно. Я пытаюсь прочитать часть из памяти - какая конкретная часть? что вы пытаетесь прочитать? - person RbMm   schedule 26.12.2019handle.getPointer()
- что это? - person RbMm   schedule 26.12.2019VirtualQueryEx
для получения действительных диапазонов памяти в процессе (с его типом, размером) и только после этого что-то читать. - person RbMm   schedule 26.12.2019VirtualQueryEx
не имеют смысла, если целевой процесс не приостановлен. - person IInspectable   schedule 26.12.2019VirtualQueryEx
для процесса, который не приостановлен. - person IInspectable   schedule 26.12.2019ReadProcessMemory
для процесса, который не приостановлен - person RbMm   schedule 26.12.2019