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 函数 | 读取进程内存数据 )

使用PTrace转储进程打开的文件

Android 逆向代码调试器开发 ( ptrace 函数 | 向进程内存写出数据 )

ptrace PTRACE_ATTACH 失败 - 用户拥有的进程的 Linux 权限

linux 中 kill() 与 signal() 函数

Linux环境编程之共享内存区:共享内存区简单介绍