Pregunta

Tengo cero conocimiento de cómo funciona el formato ELF o cómo acceder a sus encabezados y datos a través del código, sin embargo, necesito verificar si un binario ELF ha sido comprimido (¿empacado?) Con UPX para Linux.

Revisando el binario con strings Vi la cuerda UPX! Así que supongo que puedo usar eso. Hexediting El binario muestra la cadena y para la posición en el binario puedo suponer que es parte de uno de los encabezados de ELF (por favor, corrígeme si me equivoco). Este es un vertedero de eso:

00000000    .ELF........................4...
00000020    ........4. ...(.................
00000040    ........................@...@...
00000060    @.....................[.UPX!....
00000080    ............T............?d..ELF

No sé si esto se ve bien, lo siento.

¿Alguien sabe cómo detectar UPX en Linux? Si no, cómo acceder a los encabezados y obtener eso UPX! Cadena (¿Nombre del encabezado?)?

Busqué el código fuente de UPX, pero todo es C ++, estoy buscando codificar esto en C, y es realmente difícil de seguir.

Gracias, cualquier ayuda es bienvenida.

Editar: sobre la generosidad. Responden debe dar un ejemplo sólido que funcione ya que he probado diferentes enfoques y no siempre funcionan, como la muestra a continuación.
Gracias

¿Fue útil?

Solución

Estas son las pruebas para detectar un archivo comprimido de UPX:

>>>>(0x3c.l+0xf8)   string      UPX0 \b, UPX compressed
>>>>(0x3c.l+0xf8)   search/0x140    UPX2
>>>(&0x7c.l+0x26)   string      UPX \b, UPX compressed
>>>&0x26    string      UPX \b, UPX compressed
>>85    string      UPX     \b, UPX compressed

usar

man 5 magic

Para ver cómo se especifican los compensaciones dentro del archivo.

Por ejemplo, en su programa debe:

  1. Abra el archivo en prueba de lectura
  2. Salta a una de estas compensaciones
  3. Compruebe si la cadena esperada está ahí
  4. Repita hasta que no hay más compensaciones

Curiosamente, en mi Ubuntu 64bit, no se detectan archivos comprimidos de UPX porque esta prueba falta en /usr/share/misc/magic:

>>180   string      UPX!        UPX compressed (64-bit)

Otros consejos

En el código fuente a UPX, hay una función int PackW32Pe::canUnpack() que primero se ejecuta como prueba justo cuando haces un upx -d <file> (Desempaquete el ejecutable). Muestra qué compensaciones deben probarse para detectar si un archivo estaba lleno de UPX. Encontré el código claro y fácil de seguir. Recomiendo un editor con resaltado de sintaxis.

Puede descargar el código fuente para UPX en el Sitio del proyecto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top