![](/img/trans.png)
[英]How to parse ip address from /proc/PID/net/tcp and /proc/PID/net/tcp6 files in Java?
[英]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.