Java JNA读取进程内存Linux

时间:2016-01-10 01:04:11

标签: java linux jna

我试图创建一个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);
}

有谁可以告诉我为什么它无法读取该指针的值?

1 个答案:

答案 0 :(得分:1)

你需要"附上"正在运行的进程能够读/写并且当它不是您的进程时才是root用户(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 here

的更多信息

LastErrorException就是为了得到#errno"。 您可以使用̀Native.getLastError()代替Exception。

StackTace E.g:

  

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

shell:

  

$ errno 1
  EPERM 1不允许操作