Pregunta:
¿Cómo distinguir diferentes códigos de compilador en ASM?
Lian
2017-01-12 20:47:59 UTC
view on stackexchange narkive permalink

Mientras se invierte un ejecutable con olly, hay código de compilador y código de usuario. Entonces, ¿cómo reconozco los códigos del compilador? Digamos que si el ejecutable es visual basic, tiene un jmp y una llamada en las primeras 2 instrucciones y el winmain viene después.

One responder:
yellowbyte
2017-01-13 16:27:21 UTC
view on stackexchange narkive permalink

Solo necesita identificar la función principal. Todo lo que se llama desde main es código de usuario. Si desea verificar si una función es parte del código de usuario, verifique de forma recursiva la referencia externa a partir de esa función y vea si termina en main. En cuanto a cómo identificar main, depende del sistema operativo para el que se compila el ejecutable y posiblemente también del compilador específico. Pero para los archivos ELF compilados por gcc para Linux, main es el último valor introducido antes de llamar a __libc_start_main al inicio.

sí, creo que se aplicaría en ida, rastreando con xref. ¿Alguna idea de cómo hacerlo manualmente?
Por supuesto. Encuentra todas las funciones llamadas desde main. Cada vez que encuentre una función, agréguela a una lista y luego busque todas las funciones llamadas desde esa función. Entonces, si existe una función en esa lista, eso significa que es parte del código de usuario.
"Todo lo que se llama desde main es código de usuario"? Esa es una declaración audaz. No solo puede poner llamadas de usuario en `main` (incluso si solo es un` printf humilde ("Por favor proporcione un argumento para este comando \ n"); `), sino que también puede haber llamadas de plantilla dentro de` main` para inicializar global datos, rutinas de mantenimiento del sistema de llamadas o prólogos y epílogos, etc.
Lo siento, estoy confundido en cuanto a lo que estás diciendo. Cuando dices llamadas de plantilla, ¿te refieres a plantilla de función? La plantilla de función puede ser declarada y definida por los usuarios. Los datos globales son parte del código de usuario. Se colocan en la sección .data o .bss pero se hace referencia en el código de usuario. Las rutinas de mantenimiento del sistema se denominan antes de main, ¿verdad? ¿En la función de inicio? Y cuando dices prólogos / epílogos, ¿te refieres a prólogos de funciones y epílogos de funciones? Eso solo define cómo la función se configura y se limpia a sí misma. El usuario no escribe explícitamente los prólogos y epílogos, pero es solo en qué se compilan las funciones.
Pido disculpas si entendí mal su respuesta @Rad_Lexus.


Esta pregunta y respuesta fue traducida automáticamente del idioma inglés.El contenido original está disponible en stackexchange, a quien agradecemos la licencia cc by-sa 3.0 bajo la que se distribuye.
Loading...