Java JNA 读取进程内存 Linux
Java JNA Read Process Memory Linux
我正在尝试制作一个 Java 库以 read/write 内存值到 linux 上的进程。
每次读取一个值,ptrace
returns -1,每次读取的int都不一样
这是我的主要 class 代码:
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 class:
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);
}
谁能告诉我为什么它无法读取该指针的值?
您需要 "attach" 运行 进程才能 read/write 并且当它不是您的进程 (PTRACE_TRACEME
) 时也能成为 root。
例如:
主要内容:
//@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 的更多信息here
LastErrorException
来这里就是为了得到"errno"。
您可以使用 ̀Native.getLastError()
而不是 Exception。
StackTace 例如:
com.sun.jna.LastErrorException: [1] (
at cg.ptrace.ptrace(Native Method)
at cg.Cg.main(Cg.java:123)
shell :
$ errno 1
EPERM 1 Operation not permitted
我正在尝试制作一个 Java 库以 read/write 内存值到 linux 上的进程。
每次读取一个值,ptrace
returns -1,每次读取的int都不一样
这是我的主要 class 代码:
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 class:
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);
}
谁能告诉我为什么它无法读取该指针的值?
您需要 "attach" 运行 进程才能 read/write 并且当它不是您的进程 (PTRACE_TRACEME
) 时也能成为 root。
例如:
主要内容:
//@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 的更多信息here
LastErrorException
来这里就是为了得到"errno"。
您可以使用 ̀Native.getLastError()
而不是 Exception。
StackTace 例如:
com.sun.jna.LastErrorException: [1] (
at cg.ptrace.ptrace(Native Method)
at cg.Cg.main(Cg.java:123)
shell :
$ errno 1
EPERM 1 Operation not permitted