1

这是我仅适用于 Xcode(4.5 版)的代码:

#include <stdio.h>
#include <mach/mach_init.h>
#include <mach/mach_vm.h>
#include <sys/types.h>
#include <mach/mach.h>
#include <sys/ptrace.h>
#include <sys/wait.h>
#include <Security/Authorization.h>

int main(int argc, const char * argv[]) {

    char test[14]   = "Hello World! "; //0x7fff5fbff82a

    char value[14]  = "Hello Hacker!";

    char test1[14];

    pointer_t buf;
    uint32_t sz;

    task_t task;

    task_for_pid(current_task(), getpid(), &task);

    if (vm_write(current_task(), 0x7fff5fbff82a, (pointer_t)value, 14) == KERN_SUCCESS) {

        printf("%s\n", test);
        //getchar();
    }

    if (vm_read(task, 0x7fff5fbff82a, sizeof(char) * 14, &buf, &sz) == KERN_SUCCESS) {

        memcpy(test1, (const void *)buf, sz);
        printf("%s", test1);
    }

    return 0;
}

我也在尝试 ptrace 和其他东西,这就是为什么我也包含其他库。

第一个问题是这仅适用于 Xcode,我可以使用调试器找到变量的位置(内存地址)(在这种情况testvaluetesttest1

我实际上不明白 vm_write 是如何工作的(不完全)task_for_pid(),对于 2° 的问题是我需要在另一个进程上读写,这只是测试函数是否在同一个进程上工作,它可以工作(仅在 Xcode 上)。

我如何在其他进程上做到这一点?我需要读取一个位置(如何找到“某物”的地址?),这是第一个目标。

4

2 回答 2

4

对于您的问题,有解决方案:

  • 第一个问题:OS X 有地址空间布局随机化。如果你想让你的内存图像固定和可预测,你必须用 NOPIE 设置编译你的代码。此设置(PIE = Position Independent Executable)负责允许 ASLR,它通过某个随机值“滑动”内存,每个实例都会更改。

  • 我实际上不明白 vm_write 是如何工作的(不完全),对于 task_for_pid() 也是如此:

    Mach API 在“task”和“Thread”的较低级别抽象上运行,它们大致对应于 BSD“process”和“(u)thread”的抽象(有一些例外,例如 kernel_task,它没有 PID ,但让我们暂时忽略它)。task_for_pid 获得任务端口(将其视为“句柄”),如果您获得了端口 - 您可以自由地做任何您想做的事情。基本上,vm_* 函数在任何任务端口上运行——您可以在自己的进程(即 mach_task_self())或从 task_for_pid 获得的端口上使用它。

    PID 的任务实际上并不一定需要root(即“sudo”)。它需要通过 OSX 上的 taskgated,传统上验证 procmod 或 procview 组的成员身份。您可以配置 taskgated ( /System/Library/LaunchDaemons/com.apple.taskgated.plist) 以进行调试。最终,顺便说一句,获取任务端口将需要一个权利(就像现在在 iOS 上所做的一样)。也就是说,最简单的方法是简单地成为root,而不是使用系统授权等。

于 2013-01-02T21:50:13.700 回答
0

您是否尝试使用“sudo”运行您的应用程序?如果没有 sudo,您将无法读取/写入其他应用程序的内存。

于 2012-10-26T08:04:36.493 回答