我有一个类似的链接列表:
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开始,但我想我需要真正的偏移量。但是如何获得下一个偏移量(基于之前的大小)?
希望很清楚,但如果需要,我可以澄清谢谢
答案 0 :(得分:0)
您无法从ptrace()
获取此信息;但是,您可以从/proc/PID/maps
获取子进程。请注意,地址0
通常不会映射,以便捕获NULL
指针引用,并且可能对PTRACE_PEEKDATA
没有意义(这些天通常不使用单独的I和D,并且在它缺席的地址0通常是文本,而不是数据;内核是否难以区分,我不知道我的头脑。)