2011-04-26 11 views
5

que estaba leyendo un artículo de la revista descifradores de código auto-modificable y había un fragmento de código:mismo código de modificación [C++]

void Demo(int (*_printf) (const char *,...)) 
{ 
     _printf("Hello, OSIX!n"); 
     return; 
} 
int main(int argc, char* argv[]) 
{ 
    char buff[1000]; 
    int (*_printf) (const char *,...); 
    int (*_main) (int, char **); 
    void (*_Demo) (int (*) (const char *,...)); 
    _printf=printf; 
    int func_len = (unsigned int) _main ­- (unsigned int) _Demo; 
    for (int a=0; a<func_len; a++) 
    buff[a] = ((char *) _Demo)[a]; 
    _Demo = (void (*) (int (*) (const char *,...))) &buff[0]; 
    _Demo(_printf); 
    return 0; 
} 

Este código supuestamente ejecutados Demo() en la pila. Entiendo la mayor parte del código, pero la parte donde asignan 'func_len' me confunde. Por lo que puedo decir, están restando una dirección de puntero aleatorio de otra dirección de puntero aleatorio.

¿Alguien quiere explicarlo?

+1

¿Podría vincular al artículo? –

+3

El código tal como está publicado está lleno de errores. La idea parece ser copiar el código máquina de Demo en buff y luego ejecutarlo desde allí, pero eso supone que los códigos de operación son reubicables (una suposición peligrosa, puede requerir un indicador de compilación para el código de posición independiente). 'fun_len' probablemente significaba' _main - _Demo', como máximo para el tamaño de la función 'Demo'. Aún así, copia de _Demo antes de que se lo asigne a la demo de la dirección, por lo que no tiene ninguna esperanza. También arriesga problemas de alineación ya que el buffer puede no estar alineado según la función. –

+1

No tengo un enlace al artículo, es un archivo PDF en mi computadora. Lo subiré a mediafire: http://www.mediafire.com/?8zslfj6fjsgcsxd – Gogeta70

Respuesta

7

El código se basa en el conocimiento del diseño de las funciones del compilador, que puede no ser confiable con otros compiladores.

La línea func_len, una vez corregido para incluir el - que fue originalmente falta, determina la longitud de la función Demo restando la dirección en _Demo (que se se supone que contiene la dirección de inicio de Demo()) a partir de la dirección en _main (que se supone que contiene la dirección de inicio main()). Se supone que esta es la longitud de la función Demo, que luego se copia byte en el buffer buff. La dirección de buff se fuerza en un puntero de función y luego se llama a la función. Sin embargo, dado que ni _Demo ni _main están realmente inicializados, el código tiene errores extremos. Además, no está claro que un unsigned int sea lo suficientemente grande como para contener punteros con precisión; el reparto debería ser probablemente a uintptr_t desde <stdint.h> o <inttypes.h>.

Esto funciona si los errores son correctos, si las suposiciones sobre el diseño del código son correctas, si el código es código independiente de posición, y si no hay protecciones contra la ejecución de espacio de datos. No es confiable, no es portátil y no se recomienda. Pero ilustra, si funciona, ese código y datos son muy similares.

Recuerdo hacer un truco similar entre dos procesos, copiar una función de un programa en memoria compartida y luego hacer que el otro programa ejecute esa función desde la memoria compartida. Fue hace aproximadamente un cuarto de siglo, pero la técnica era similar y "funcionaba" para la máquina en la que se probó. Nunca necesité usar la técnica, ¡gracias a Dios!

+0

Derecha. Entiendo cómo funciona el código. Lo que no entendí es por qué el autor original del código estaba restando un puntero no inicializado de otro puntero no inicializado.Aún así, el concepto del código me llevó a donde yo quería. Ahora tengo un ejemplo de trabajo que escribí yo mismo. Para aquellos que estén interesados, aquí está: http://friendpaste.com/2B2NA1UyI8TDn0wXXCXEGH – Gogeta70

5

Este código utiliza variables no inicializadas _main y _Demo, por lo que no puede funcionar en general. Incluso si significaran algo diferente, probablemente asumieron algún orden específico de funciones en la memoria.

Mi opinión: no confíe en este artículo.

Cuestiones relacionadas