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 でのみ機能することです。デバッガーで変数 (この場合は ) の位置 (メモリ アドレス) を見つけることができるためtest、文字列を変更しvalueて新しい値をコピーします。testオンtest1

私は実際に vm_write がどのように機能するか (完全ではありません) を理解していませんtask_for_pid().そしてそれは動作します(Xcodeのみ)。

他のプロセスでそれを行うにはどうすればよいですか? 位置を読み取る必要があります (「何か」のアドレスを見つけるにはどうすればよいですか?)、これが最初の目標です。

4

2 に答える 2

4

あなたの問題には、解決策があります:

  • 最初の問題: OS X にはアドレス空間レイアウトのランダム化があります。メモリ イメージを固定して予測可能にしたい場合は、NOPIE 設定でコードをコンパイルする必要があります。この設定 (PIE = Position Independent Executable) は、インスタンスごとに変化するランダムな値によってメモリを「スライド」させる ASLR を許可する役割を果たします。

  • 私は実際に vm_write がどのように機能するか (完全ではない) を理解していません。また、task_for_pid() についても同じです:

    Mach API は、BSD の「プロセス」と「(u)スレッド」の抽象化にほぼ対応する「タスク」と「スレッド」の下位レベルの抽象化で動作します (PID を持たない kernel_task など、いくつかの例外があります)。 、しかし今は無視しましょう)。task_for_pid はタスク ポート (「ハンドル」と考えてください) を取得します。ポートを取得すると、自由に好きなことを行うことができます。基本的に、vm_* 関数は任意のタスク ポートで動作します。独自のプロセス (mach_task_self()、つまり)、または task_for_pid から取得したポートで使用できます。

    PID のタスクは、実際には必ずしも root を必要としません (つまり、「sudo」)。従来は procmod または procview グループのメンバーシップを検証していた OSX でタスクゲートを通過する必要があります。デバッグ目的で 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 に答える