当前位置:  开发笔记 > IOS > 正文

在OS X中读取其他进程的内存?

如何解决《在OSX中读取其他进程的内存?》经验,为你挑选了4个好方法。

我一直在努力了解如何阅读Mac OS X上其他进程的内存,但我没有太多运气.我见过很多例子在线使用ptracePEEKDATA和这样的,但它不会对BSD该选项[ man ptrace].

int pid = fork();
if (pid > 0) {
    // mess around with child-process's memory
}

如何在Mac OS X上读取和写入另一个进程的内存?



1> 小智..:

使用task_for_pid()或其他方法获取目标进程的任务端口.此后,您可以使用直接操纵进程的地址空间vm_read(),vm_write()和其他人.



2> Derek Park..:

Matasano Chargen在将一些调试代码移植到OS X时有一段很好的发布,其中包括学习如何在另一个进程中读取和写入内存(以及其他内容).

它必须工作,否则GDB不会:

事实证明,苹果凭借其无限的智慧,已经毁灭了ptrace().OS X手册页列出了以下请求代码:

PT_ATTACH - 选择要调试的进程

PT_DENY_ATTACH- 所以流程可以阻止自己被调试
[...]

没有提到读或写内存或寄存器.这将是令人沮丧,如果手册页没有还提到PT_GETREGS,PT_SETREGS,PT_GETFPREGS,和PT_SETFPREGS在错误代码部分.所以,我查了一下ptrace.h.在那里我发现:

PT_READ_I - 阅读说明文字

PT_READ_D - 阅读数据字

PT_READ_U- 如果你的年龄足够大,可以记住U区数据,那就是读取U区数据
[...]

有一个问题解决了.我可以为断点读写内存.但我仍然无法访问寄存器,我需要能够搞乱EIP.



3> 小智..:

你希望能够在进程之间共享内存块,你应该看看shm_open(2)和mmap(2).在一个进程中分配一块内存并将路径(对于shm_open)传递给另一个进程非常容易,然后两者都可以一起疯狂.正如Chris Hanson所提到的,这比在另一个进程的地址空间中探索要安全得多.当然,如果你无法控制这两个过程,这对你没有多大帮助.

(请注意,shm_open的最大路径长度似乎是26个字节,尽管这似乎没有在任何地方记录.)

// Create shared memory block
void* sharedMemory = NULL;
size_t shmemSize = 123456;
const char* shmName = "mySharedMemPath";        
int shFD = shm_open(shmName, (O_CREAT | O_EXCL | O_RDWR), 0600);
if (shFD >= 0) {
    if (ftruncate(shFD, shmemSize) == 0) {
        sharedMemory = mmap(NULL, shmemSize, (PROT_READ | PROT_WRITE), MAP_SHARED, shFD, 0);
        if (sharedMemory != MAP_FAILED) {
            // Initialize shared memory if needed
            // Send 'shmemSize' & 'shmemSize' to other process(es)
        } else handle error
    } else handle error
    close(shFD);        // Note: sharedMemory still valid until munmap() called
} else handle error

...
Do stuff with shared memory
...

// Tear down shared memory
if (sharedMemory != NULL) munmap(sharedMemory, shmemSize);
if (shFD >= 0) shm_unlink(shmName);





// Get the shared memory block from another process
void* sharedMemory = NULL;
size_t shmemSize = 123456;              // Or fetched via some other form of IPC
const char* shmName = "mySharedMemPath";// Or fetched via some other form of IPC
int shFD = shm_open(shmName, (O_RDONLY), 0600); // Can be R/W if you want
if (shFD >= 0) {
    data = mmap(NULL, shmemSize, PROT_READ, MAP_SHARED, shFD, 0);
    if (data != MAP_FAILED) {
        // Check shared memory for validity
    } else handle error
    close(shFD);        // Note: sharedMemory still valid until munmap() called
} else handle error


...
Do stuff with shared memory
...

// Tear down shared memory
if (sharedMemory != NULL) munmap(sharedMemory, shmemSize);
// Only the creator should shm_unlink()


shm_open的使用有几个限制; 除了提到的路径长度问题之外,MacOSX还附带了一个内核状态设置,可以将进程共享内存的大小限制为4MB.您可以通过在命令行上执行`sysctl -A`并搜索'kern.sysv.shmmax'来查看此设置.

4> Jona..:

我知道这个帖子已有100年的历史,但是对于那些从搜索引擎来到这里的人来说:

xnumem完全符合您的要求,操作和读取进程间内存.

// Create new xnu_proc instance
xnu_proc *Process = new xnu_proc();

// Attach to pid (or process name)
Process->Attach(getpid());

// Manipulate memory
int i = 1337, i2 = 0;
i2 = process->memory().Read((uintptr_t)&i);

// Detach from process
Process->Detach();

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有