Fråga:
Verktyg eller data för analys av binär kod för att upptäcka CPU-arkitektur
n3vermind
2013-10-08 16:41:42 UTC
view on stackexchange narkive permalink

Om jag antar att jag har en binär fil med kod för att avkänna CPU kan jag på något sätt upptäcka CPU-arkitektur? Jag vet att det beror mest på kompilatorn men jag tycker att det för de flesta CPU-arkitekturer borde vara många CALL / RETN / JMP / PUSH / POP opcodes (statistiskt mer än andra). Eller kanske ska jag söka efter några mönster i kodspecifika för CPU (istället för opcodes-förekomst)?

Om du har en binär fil men inte vet för vilken processor, hur kan du se * opkoder *? Om du vet hur du översätter från binär till opcode, vet du redan vilken processor du har. (Eller åtminstone vilken familj - t.ex. Z80, Intel, ARM, Motorola MC-680XX.)
Läs magiken och sedan filformatet.
1) (Stolas) I inbäddning har du ofta ingen magi eller det magiska är något de uppfann.2) (Jongware) Du kan se opkoder (vanliga bytesmönster) utan att verkligen veta vad som är dem på ungefär samma sätt som du kan avgöra om en fil är komprimerad eller krypterad utan att kunna dekryptera eller dekomprimera den.
@jongware Jag tror att du förväxlar _opcode_ med _assemblerinstruktion_.
@n3vermind: .. om du inte känner till CPU, hur kan du vara säker på att du tittar på 'opcodes'? ARM skulle till exempel vara enkelt (alla opkoder är 4 byte och de flesta börjar med 0xE0), förutom att du har tummen-lägen att tänka på. Ett statistiskt tillvägagångssätt * kan * fungera - men du har alltid koden / datadikotomin som gör det svårt att ta isär även när du känner till CPU-typen.
@Jongware du har helt rätt, men det är ett ganska annorlunda problem än ämnets. Hur som helst är det första, enligt min mening, att undersöka entropin för binäret.
Fem svar:
woliveirajr
2013-10-08 21:24:59 UTC
view on stackexchange narkive permalink

När du har en hammare ser alla problem ut som naglar ...

Jag har studerat något som heter Normalised Compression Distance - NCD - för en tid sedan, och jag skulle prova om jag hade ett liknande problem som ditt.

  1. Jag skulle skapa en databas med exempel. Skulle ta 20 program för varje arkitektur du vill veta, med variabla storlekar, och spara dem.

  2. När jag konfronteras med ett program som jag ville veta vilken arkitektur det är, jag Skulle beräkna det är NCD mot alla mina exempel.

  3. Jag skulle välja den bästa (mindre) NCD och skulle sedan verifiera det om det var en riktig match (låt oss säger, försöker köra den på den upptäckta arkitekturen).

Uppdatera

Jag har alltid gjort i för hand när det gäller NCD. Hur jag gjorde det:

  • du har 20 filer för SPARC och du kallar dem A01, A02, A03 och så vidare. Dina x86-filer: B01, B02 osv.

  • Du får den okända filen och kallar den XX.

  • Välj din föredraget komprimeringsverktyg (jag använde Gzip, men se kommentarer i slutet av detta svar).

  • Beräkna NCD för det första paret:

NCD (XX, A01) = (Z (XX + A01) - min (Z (XX), Z (A01)) / max (Z (XX), Z (A01))

Z (något) -> betyder att du komprimerar något med Gzip och får filstorleken efter komprimering. Till exempel 8763 byte, så Z (något) = 8763.

XX + A01 -> betyder att du sammanfogar saker. Du lägger till A01-filen i slutet av XX-filen. I Linux kan du göra en ´cat XX A01> XXA01´.

min ( ) och max () -> du beräknar den komprimerade storleken på XX och A01 och använder det lägsta och högsta som du får.

Så du får ett NCD-värde: det ligger mellan 0 och 1 och använd så många decimaler som möjligt, för ibland är skillnaden i den 7: e eller 8: e siffran. Det blir som att jämföra 0.999999887 till 0.999999524.

Y du gör det för varje fil, så du får 20 NCD-resultat för SPARC, 20 för x86 ...

Skaffa den mindre NCD av alla. Låt oss säga att B07-filen gav dig den mindre NCD. Så förmodligen är unknown-filen en x86.

Tips:

  • din unknown och dina testfiler måste ha samma storlek. När du jämför en fil med större eller mindre, kommer NCD inte att göra det magiskt. Så om du testar filer på 5 till 10k skulle jag få testfiler på 2,5k, 5k, 7,5k, 10k, 12,5k ...

  • Under min magisterexamen fick jag bättre resultat och använde alltid det mindre NCD-värdet. Den näst bästa metoden var att rösta: få de 5 mindre NCD-resultaten och se vilken arkitektur som fick fler röster. Ex .: mindre NCD var A03, A05, B02, B06, B07 -> B go 3 röster, så jag skulle säga att det är en x86 ...

  • kompressorbaserade på Zip-konstruktionen har en begränsning på 32 kB: hur de komprimerar saker, överväger de bara 32 kB i taget. Om din XX + A01 är större än detta, kommer Gzip, Zip etc. inte att ge dig bra resultat. Så för filer som är större än 15 eller 16 kB skulle jag välja en annan kompressor: PPMD, Bzip ...

Utmärkt idé. Jag har haft bra resultat för andra klassificeringsproblem tidigare.
@woliveirajr har du något förslag om verktyg eller bibliotek för beräkning av NCD? Hittills har jag hittat [CompLearn] (http://www.complearn.org/) verktyg som ser ganska lovande ut.
@n3vermind Jag har uppdaterat mitt svar: Jag tror att du kan använda CompLearn, men eftersom jag ville ha mer kontroll (som vilken kompressor jag skulle använda) har jag gjort ett litet program som passar mitt behov. Jag förklarade hur det fungerar ...
@woliveirajr Har du en länk till din examensarbete? Jag skulle gärna vilja gå igenom det
@koukouviou ledsen, kunde inte hitta den nu (och det skulle vara på portugisiska, ändå). Men här är en artikel som vi skrev om den: http://www.inf.ufpr.br/lesoliveira/download/FSI2013.pdf - Låt mig veta om jag kan hjälpa dig eller ge mer information.
@woliveirajr exakt vad jag letade efter, tack så mycket för ditt svar.
devttys0
2013-10-08 18:05:07 UTC
view on stackexchange narkive permalink

Det finns några verktyg som kan skanna binära filer efter vanliga opkoder som finns i olika arkitekturer. Binwalk s -A-alternativet gör detta till exempel (det söker efter ARM / MIPS / x86 och flera andra arkitekturer).

joxeankoret
2013-10-08 18:12:29 UTC
view on stackexchange narkive permalink

Normalt försöker jag först de vanligaste processorerna (ARM, PPC, MIPS och AVR), försöker hitta om någon av de vanliga strängarna säger något om processorn osv ... Och när allt annat misslyckas ger jag ett försök till vad du ber om: statistisk analys av opkoder (om jag är säker på att den inte är krypterad eller komprimerad).

Jag rekommenderar att du läser Alexander Chernov och Katerina Troshina-presentationen "Omvänd teknik för binära program för anpassade virtuella maskiner". Att skriva ett verktyg som det de skrev måste vara väldigt svårt (antar jag) men att skriva ett verktyg för att försöka bestämma vilken CPU som verkar vara kompilerad för att använda teknikerna som beskrivs i den presentationen är inte så svårt (så länge du kan samla in tillräckligt prover för flera olika arkitekturer).

Igor Skochinsky
2013-10-09 01:37:09 UTC
view on stackexchange narkive permalink

Mitt lata hack: ett litet Python-skript som beräknar bigram- och trigramantal. Jag söker sedan efter ett par av de vanligaste sekvenserna på Google (citerad hex). Ganska ofta lyckas jag hitta några hex-dumpningar och kan räkna ut CPU: n ur sammanhanget. Det skulle fungera ännu bättre om Google kunde söka efter råa binära värden ...

Kan vara jag är sen till festen, men den här webbplatsen har Python API och kan säkert söka råa binära värden: http://www.binar.ly/search
@AntonKochkov tack, ser intersing ut! synd att det verkar bara indexera skadlig kod ...
julian
2020-08-19 04:27:14 UTC
view on stackexchange narkive permalink

Maskininlärning kan användas för att identifiera mål-CPU för maskinkod med hög noggrannhet. Exempelvis kan verktyget ISAdetect identifiera maskinkod inriktad på 23 olika arkitekturer med maskininlärning. Det finns ett webb-API som man kan använda för att ladda upp körbara binärer eller bitar av maskinkod som ska analyseras av detta verktyg.

Här är artikeln som diskuterar de tekniker som implementerats av ISAdetect:

Mot användbar automatiserad detektering av CPU-arkitektur och ändamålsenlighet för godtyckliga binära filer och objektkodssekvenser



Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...