Linux C++ ptrace——映射子进程内存的所有单元
Posted
技术标签:
【中文标题】Linux C++ ptrace——映射子进程内存的所有单元【英文标题】:Linux C++ ptrace -- Map all cells of a child processes memorys 【发布时间】:2012-04-14 22:07:22 【问题描述】:我有一个类似这样的链表:
class MemoryCell
protected:
unsigned char* _address; // the address offset (in another process)
unsigned int _size; // the size of this memory block
unsigned char* _buffer; // the data
MemoryCell* _next; // points to next memory cell to form linked list
;
然后我有一个 MemoryMapper
类,它将占据头部。我想把所有的记忆单元都放进去。
// void MemoryMapper::MapAllCells(unsigned int procId)//
unsigned int offset = 0x0;
while (true)
long memoryData = ptrace(PTRACE_PEEKDATA, procId, offset);
if (memoryData == -1) break; // need to check for errno(3) too
// add new MemoryCell w/ data to head of linked list
// how to get next offset based on what was returned?
它在地址 0 处立即中断。我认为该过程可能从 0x0 开始,但我想我需要真正的偏移量。但是我怎样才能获得下一个偏移量(基于上一个的大小)?
希望很清楚,但如果需要我可以澄清一下谢谢
【问题讨论】:
【参考方案1】:您无法从ptrace()
获取此信息;不过,您可以从 /proc/PID/maps
获取子进程。请注意,地址0
通常不映射,以便捕获NULL
指针引用,并且对于PTRACE_PEEKDATA
可能没有意义(现在通常不使用单独的 I 和 D,并且在没有地址 0 的情况下通常是文本,而不是数据;内核是否需要区分,我不知道)。
【讨论】:
有趣。你能帮助指出一些理解地图文件中包含的数据的方向吗? std:: 我尝试在一个进程上测试它。无符号长长偏移 = 0x7f64e21c3000;但是不读还是断了? 你得到什么错误?该进程是否归您的 uid 所有?您是否可以通过其他方式访问它(通过PTRACE_ATTACH
或作为孩子并调用PTRACE_TRACEME
)?
是的,归我的 uid 所有...事先尝试使用 PTRACE_ATTACH 但仍然无法正常工作。手册页不够了解如何判断我遇到了哪个错误。 pastebin.com/yF2rfSRw
嗯它在附加上也失败了.. errno 是 1. 然后读取内存 errno 是 3以上是关于Linux C++ ptrace——映射子进程内存的所有单元的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向代码调试器开发 ( ptrace 函数 | 读取进程内存数据 )
Android 逆向代码调试器开发 ( ptrace 函数 | 向进程内存写出数据 )