簡體   English   中英

讀/寫/ proc / <pid> Android平台上的java代碼/ mem

[英]Read/write /proc/<pid>/mem from java code on Android platform

我想在Android上從ptaced子進程(/ proc / pid / mem)讀取和寫入內存。 在讀/寫之前,我使用ptrace附加到進程(Status = 4991,WIFSTOPPED(Status)= true)。

int lSize = (int) (pAddressEnd - pAddressStart);
ByteBuffer lByteBuffer = ByteBuffer.allocate(lSize);
RandomAccessFile lRandomAccessFile = null;
try {
    lRandomAccessFile = new RandomAccessFile(mFileName, "r");
    lRandomAccessFile.getChannel().read(lByteBuffer, pAddressStart);

    lRandomAccessFile.close();
} catch (FileNotFoundException e) {
    throw new RuntimeException(e);
} catch (IOException e) {
    throw new RuntimeException(e);
}
...

有時內存訪問正確,但有時會拋出異常:

java.lang.RuntimeException: java.io.IOException: pread failed: EIO (I/O error)
        ...
        at java.lang.Thread.run(Thread.java:841)
Caused by: java.io.IOException: pread failed: EIO (I/O error)
        at java.nio.FileChannelImpl.readImpl(FileChannelImpl.java:315)
        at java.nio.FileChannelImpl.read(FileChannelImpl.java:283)
        at test.Process$Mem.readByteBuffer(Process.java:285)
        ... 33 more
Caused by: libcore.io.ErrnoException: pread failed: EIO (I/O error)
        at libcore.io.Posix.preadBytes(Native Method)
        at libcore.io.Posix.pread(Posix.java:99)
        at libcore.io.BlockGuardOs.pread(BlockGuardOs.java:124)
        at java.nio.FileChannelImpl.readImpl(FileChannelImpl.java:305)
        ... 35 more

嘗試寫內存總是拋出異常。

我可以使用RandomAccessFile.getChannel()。read()方法來讀取內存嗎? 和RandomAccessFile.getChannel()。write()用於寫入內存? 如何使用它是正確的?

當你嘗試從內存中讀取子進程沒有映射的內容時,你會得到EIO--例如,NULL周圍的任何東西。 那是完全正常的。 (有關更多信息,請參見mem手冊頁 。)因此,如果您在子地址空間中跟蹤破碎的指針,則需要能夠處理此問題。

如果您在期望子進程的內存實際存在時遇到IO錯誤,那就有點怪異了。 當子進程停止時, /dev/X/mem和ptrace之間可能會有一些奇怪的交互。 我建議調查PTRACE_PEEKDATA作為讀取子進程內存的替代方法。 它慢得多但可能更可靠---如果/dev/X/mem失敗,請嘗試PTRACE_PEEKDATA並查看其內容。 我假設你有ptrace的Java綁定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM