2011-12-12 4 views
10

소스가없는 바이너리 실행 파일로 리버스 엔지니어링을하고 있습니다. Windows에서 할 수있는 일은 DLL 파일과 마찬가지로 LoadLibrary로 실행 파일 (EXE)을로드하는 것입니다. 로드 된 파일을 재배치 할 수없는 경우 단순히 로더 코드를 다른 모듈의 "공간 확보"위치로 재배치 할 수 있습니다. 내가로드 된 바이너리를 가질 때, 나는 함수라고 부를 수있다. (물론 그들이 어디 있는지를 가정하고) 다른 것들을 할 수있다.Mac 바이너리를 동적 라이브러리로로드하십시오.

Mac에서 동일하거나 유사한 작업을 수행 할 수있는 방법이 있습니까? 나는 mach-o 실행 파일을 가지고 있으며 동적 라이브러리 (DYLIB)이므로로드하려고합니다. 아니면 실행 파일을 DYLIB로 변환 할 수있는 방법이 있습니까? 실행 파일과 DYLIB의 차이점은 무엇입니까?

답변

5

좋아요, 그래서 몇 가지 실험을 해보았습니다. 파일은 "bin1.c는"이 포함되어

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

:

내 맥에
#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. 

확실하지과 : 나는 다른 바이너리의 주요 함수를 호출 할 수 있습니다. 그러나이 예는 적어도 어떤 경우에는 가능하다는 것을 보여줍니다.