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?
¿Podría vincular al artículo? –
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. –
No tengo un enlace al artículo, es un archivo PDF en mi computadora. Lo subiré a mediafire: http://www.mediafire.com/?8zslfj6fjsgcsxd – Gogeta70