2011-12-12 13 views
10

Estoy haciendo algo de ingeniería inversa con un ejecutable binario sin fuentes. En Windows, lo que puedo hacer es cargar un archivo ejecutable (EXE) con LoadLibrary, del mismo modo que era un archivo DLL. Si el archivo cargado no es reubicable, puedo simplemente reubicar el código de mi cargador para "hacer espacio" para el otro módulo. Cuando tengo cargado el binario, puedo llamarlo funciones (asumiendo que estoy donde están, por supuesto), y hacer otras cosas.Cargar un Mac binario como una biblioteca dinámica

¿Hay alguna manera de hacer lo mismo o similar en Mac? Tengo un ejecutable mach-o, y me gustaría cargarlo ya que era una biblioteca dinámica (DYLIB). ¿O hay alguna forma de convertir un ejecutable en un DYLIB? ¿Cuáles son las diferencias reales entre un ejecutable y un DYLIB?

Respuesta

5

OK, así que hice algunos experimentos y veo esto. Archivo "bin1.c" contiene:

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

y "bin2.c" es:

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

en mi Mac, todo compila bien y de hecho las cargas del otro ejecutable, ya que era una biblioteca cargable, y puedo llamar a la función principal en la otra binaria:

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. 
No

segura, sin embargo, si hay limitaciones en esto y si esto se puede hacer con los binarios inamovibles. Pero este ejemplo muestra que, al menos en algunos casos, es posible.

Cuestiones relacionadas