Verifica se un elfo è pieno di UPX in Linux
Domanda
Non ho conoscenza di come funziona il formato ELF o di come accedere alle sue intestazioni e dati tramite codice, tuttavia devo verificare se un binario ELF è stato compresso (imballato?) Con UPX per Linux.
Controllando il binario con strings
Ho visto la stringa UPX!
Quindi immagino di poterlo usare. L'esodio del binario mostra la corda e per la posizione nel binario posso supporre che faccia parte di una delle intestazioni di Elf (per favore correggimi se sbaglio). Questa è una discarica di questo:
00000000 .ELF........................4...
00000020 ........4. ...(.................
00000040 ........................@...@...
00000060 @.....................[.UPX!....
00000080 ............T............?d..ELF
Non so se sembra buono, scusa.
Qualcuno sa come rilevare UPX su Linux? In caso contrario, come accedere alle intestazioni e ottenerlo UPX!
String (nome dell'intestazione?)?
Ho esaminato il codice sorgente UPX ma tutto è C ++, sto cercando di codificare questo in C ed è davvero difficile da seguire.
Grazie, qualsiasi aiuto è accolto.
EDIT: Informazioni sulla taglie. Le rispondono devono dare un solido esempio che funziona da quando ho provato approcci diversi e non sempre funzionano, come il campione di seguito.
Grazie
Soluzione
Questi sono i test per rilevare un file compresso 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
uso
man 5 magic
Per vedere come vengono specificati gli offset all'interno del file.
Ad esempio nel tuo programma dovresti:
- Apri il file in test per la lettura
- Passa a uno di questi offset
- Controlla se la stringa prevista è lì
- Ripeti fino a non essere più compensati
È interessante notare che non vengono rilevati i file compressi UBuntu 64 bit, non vengono rilevati perché questo test manca da /usr/share/misc/magic
:
>>180 string UPX! UPX compressed (64-bit)
Altri suggerimenti
Nel codice sorgente su UPX, c'è una funzione int PackW32Pe::canUnpack()
che viene eseguito per la prima volta come test proprio quando fai un upx -d <file>
(Unpack eseguibile). Mostra quali offset devono essere testati per rilevare se un file era pieno di UPX. Ho trovato il codice chiaro e facile da seguire. Consiglio un editor con un'evidenziazione della sintassi.
Puoi scaricare il codice sorgente per UPX su sito del progetto.