Usando msvcrt!_initterm para ofuscar código
Lunes, 8. febrero 2010
Una manera trivial y al mismo tiempo eficaz de ofuscar código es introducir cambios en aquella funcionalidad que el reverser pueda considerar segura, por ejemplo el startup de un programa en alto nivel. Estamos acostumbrados a que allí no suceda nada importante así que muchas veces lo pasamos por alto saltando directamente al procedimiento principal. A veces recordamos que alguna vez alguien nos la lió con código en un TLS y verificamos que el fichero no utilice ese truco, pero pocas más precauciones tomamos.
Hoy presento un caso de una sencillez extrema y muy fácil de identificar pero que me ha resultado gracioso por su concepción.
Se trata de utilizar el API _initterm del MSVCRT para ejecutar código en un bloque de código con apariencia de startup. No encontré documentación oficial para esta función (si alguien sabe que postee un comentario) aunque aplicando un poco de ingeniería inversa sobre la librería msvcrt se puede intuir su funcionamiento:

Es decir, ejecuta todas las funciones de la lista delimitada por (fStart, fEnd).
En mi caso el binario simplemente inicializa variables pero perfectamente se podría usar para ejecutar cualquier otro código arbitrario, las posibilidades son amplias.
Si esta función se incluye dentro de un bloque de código con apariencia de startup fijo que más de uno cae por despiste, a mí me la lió…
Manolo Q. Says:
Muy interesante gracias por el dato.