2011-12-12 12 views
10

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

Macでも同じようにする方法はありますか?私はmach-o実行可能ファイルを持っていて、ダイナミックライブラリ(DYLIB)のようにロードしたいと思います。あるいは、実行可能ファイルをDYLIBに変換する方法がありますか? 実行ファイルとDYLIBの違いは何ですか?

答えて

5

私はいくつかの実験を行いました。これを見てください。 「bin1.cの」ファイルは含まれています

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

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

#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; 
} 

、すべては、罰金コンパイルし、実際にそれがロード可能なライブラリだったように、他の実行可能ファイルをロードしますこれは非再配置可能なバイナリで行うことができる場合は、この上の制限があるかどうか、しかし

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. 

わからないと:と私は他のバイナリで、main関数を呼び出すことができます。しかし、この例は、少なくともいくつかのケースでは可能であることを示しています。

関連する問題