13

ソースのないバイナリ実行可能ファイルを使用してリバース エンジニアリングを行っています。Windows では、DLL ファイルと同じように、LoadLibrary を使用して実行可能ファイル (EXE) をロードすることができます。ロードされたファイルが再配置可能でない場合は、ローダー コードを再配置して、他のモジュール用の「スペースを作る」ことができます。バイナリをロードしたら、その関数を呼び出して (もちろん、それらがどこにあると仮定して)、他のことを行うことができます。

Macで同じまたは類似のことを行う方法はありますか? mach-o 実行可能ファイルがあり、それを動的ライブラリ (DYLIB) としてロードしたいと考えています。または、実行可能ファイルを DYLIB に変換する方法はありますか? 実行可能ファイルと DYLIB の実際の違いは何ですか?

4

1 に答える 1

10

OK、いくつか実験を行ったので、これを見てください。ファイル「bin1.c」には以下が含まれます。

#include <stdio.h>
int main() {
    printf("I am bin1.\n");
    return 0;
}

「bin2.c」は次のとおりです。

#include <stdio.h>
#include <dlfcn.h>
int main() {
    printf("I am bin2.\n");

    void *l = dlopen("bin1", RTLD_NOW);
    if (l == NULL) {
        printf("dlopen failed: %s\n", dlerror());
        return -1;
    }

    void *f = dlsym(l, "main");
    if (f == NULL) {
        printf("dlsym failed: %s\n", dlerror());
        return -1;
    }

    int (*main)() = f;
    main();

    return 0;
}

私のMacでは、すべてが正常にコンパイルされ、実際に他の実行可能ファイルがロード可能なライブラリであるためロードされ、他のバイナリでメイン関数を呼び出すことができます:

Johanka:Desktop newacc$ uname -a
Darwin Johanka.local 11.3.0 Darwin Kernel Version 11.3.0: Thu Jan 12 18:47:41 PST 2012; root:xnu-1699.24.23~1/RELEASE_X86_64 x86_64
Johanka:Desktop newacc$ gcc bin1.c -o bin1 && ./bin1
I am bin1.
Johanka:Desktop newacc$ gcc bin2.c -o bin2 && ./bin2
I am bin2.
I am bin1.

ただし、これに制限があるかどうか、および再配置不可能なバイナリでこれを実行できるかどうかはわかりません。しかし、この例は、少なくとも場合によっては可能であることを示しています。

于 2012-04-27T10:59:10.397 に答える