Java JNA读取进程内存Linux

我试图让一个Java库来读/写内存值到Linux上的进程。

每次我读取一个值, ptrace返回-1,我每次读取一个不同的int。

这是我的主要类代码:

 public final class Main { public static void main(String... args) { // 10702 ? 00:00:00 idea.sh Memory buffer = new Memory(4); System.out.println(ptrace.ptrace(1, 10702, new Pointer(0x7f1f80e81fb8L), buffer)); System.out.println(buffer.getInt(0)); } } 

输出:

 -1 2014720320 

这是我的ptrace类:

 public class ptrace { static { Native.register(NativeLibrary.getInstance("c")); } public static native long ptrace(/*enum __ptrace_request*/ int request, /*pid_t*/ int pid, Pointer addr, Pointer data); } 

任何人都可以告诉我为什么它不能读取指针的值?

你需要“附加”正在运行的进程,以便能够读/写,并且当它不是你的进程时( PTRACE_TRACEME )。

例如:

主要:

 //@see http://linux.die.net/include/sys/ptrace.h private static final int PTRACE_PEEKDATA = 2; private static final int PTRACE_ATTACH = 16; private static final int PTRACE_DETACH = 17; public static void main(String[] args) { int pid = 1015; try { ptrace.ptrace(PTRACE_ATTACH, pid, null, null); Memory buffer = new Memory(4); ptrace.ptrace(PTRACE_PEEKDATA, pid, new Pointer(0x7f27d6575000L), buffer); System.out.println(buffer.getChar(0)); } catch (LastErrorException ex) { ex.printStackTrace(); } finally { ptrace.ptrace(PTRACE_DETACH, pid, null, null); } 

ptrace.java:

 public class ptrace { static { Native.register(NativeLibrary.getInstance("c")); } public static native long ptrace(/*enum __ptrace_request*/int request, /*pid_t*/ int pid, Pointer addr, Pointer data) throws LastErrorException; } 

你可以在这里找到更多关于如何使用ptrace的信息

LastErrorException只是为了得到“errno”。 您可以使用̀Native.getLastError()而不是Exception。

StackTace例如:

com.sun.jna.LastErrorException:[1](
在cg.ptrace.ptrace(Native方法)
在cg.Cg.main(Cg.java:123)

贝壳 :

$ errno 1
EPERM 1操作不允许