Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JNA读取进程内存Linux_Java_Linux_Jna - Fatal编程技术网

Java JNA读取进程内存Linux

Java JNA读取进程内存Linux,java,linux,jna,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(ptr

我正在尝试创建一个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);
}
有人能告诉我为什么它无法读取该指针上的值吗?

您需要“附加”正在运行的进程,以便在它不是您的进程时也能够读/写并成为root(
PTRACE\u TRACEME

例如:

main:

//@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);
    }
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.java:

//@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);
    }
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例如:

//@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);
    }
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;
}
com.sun.jna.LastErrorException:[1](
在cg.ptrace.ptrace(本机方法)
位于cg.cg.main(cg.java:123)

外壳:

//@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);
    }
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;
}
$errno 1
不允许EPERM 1操作


请尝试
Native.getLastError()
查看发生了什么。我猜您将出现“errno”错误。打印错误代码3。他们是否有关于错误代码的联机文档?
ESRCH 3至少在我的系统上没有这样的过程。shell命令
errno 3