Tuesday 28 November 2017

Objdump isär arm binära alternativ


Jag försöker demontera ett objekt byggt för ARM med gcc. Tyvärr försöker objdump att gissa om koden är ARM och Thumb, och blir fel: den tycker att min kod är Thumb när den faktiskt är ARM. Jag ser att objdump har ett alternativ att tvinga det att tolka alla instruktioner som Thumb (-Mforce-thumb), men det har inte en för att tvinga ARM-läget. Det verkar som ett riktigt konstigt underlåtande för mig, och det hindrar min förmåga att få arbete gjort (jag är på en inbäddad enhet och mitt enda sätt att felsöka är att titta på demonteringen). Ive försökte olika tillvägagångssätt, inklusive att försöka berätta för objdump att använda en ARM-arkitektur som inte stöder Thumb, men ingenting verkar fungera. Eventuella idéer (Och ja, jag vet att instruktionerna verkligen är ARM.) Frågade aug 25 11 kl 16:43 Det låter som en bugg i antingen compilerlinker eller objdump. Symbolerna ska normalt märkas ordentligt om de är Thumb eller ARM och demonteras i enlighet därmed. Det sagt, det finns några saker du kan försöka: tolka filen som vanlig binär (-b binär - D) - detta kommer att inaktivera symbolkontroll och kommer att demontera hela filen som ARM. Nackdelen: mycket skräp i utmatningen, inga fina adresser. använd IDA Pro. Även om det gissar felaktigt, kan du alltid åsidosätta sitt beslut. Det är också en mycket trevligare demonteringsmiljö :) svarat 25 aug 11 kl 16:56 Jag behöver symbolinformationen så jag vet vad jag ser på, så med hjälp av rå binär klipps det inte, jag är rädd. Den aktuella filen har felsökningsinformation så att markeringsinformationen borde finnas där. Min byggprocess är fördubblad men involverar gcc i alla idéer vad som kan riva ut symbolmarkeringen ndash David Givet aug 26 11 på 10:42 Det är svårt att säga vad som är exakt är frågan. Skriv ut innehållet i symboltabellen och kolla på printinsn (arm) i arm-dis. c. Kanske kommer det att ge dig några idéer. ndash Igor Skochinsky Aug 26 11 på 13:30 Linux Objdump Command Exempel (Demontera en binär fil) Objdump kommando i Linux används för att ge noggrann information om objektfiler. Det här kommandot används huvudsakligen av programmerare som arbetar med kompilatorer, men det är fortfarande ett mycket användbart verktyg för vanliga programmerare även när det gäller felsökning. I denna artikel kommer vi att förstå hur man använder objdump-kommandot genom några exempel. Grundsyntaxen för objdump är: Det finns ett brett utbud av alternativ för detta kommando. Vi kommer att försöka täcka en bra mängd av dem i denna handledning. Den binära filen ELF i följande C-program används i alla exemplen som nämns i denna artikel. Obs! Ovanstående är bara en testkod som användes för något annat ändamål, men jag fann det enkelt att använda för den här artikeln. 1. Visa innehållet i den övergripande filhuvudet med - f alternativ Tänk på följande exempel: Så vi ser att informationen relaterad till den övergripande filhuvudet visades i utmatningen. OBS: Det körbara formatet som används i exemplen är ELF. För mer information om det, se vår artikel om ELF-filformat. 2.Display objektformat specifikt filhuvudinnehåll med - p-alternativ Följande exempel skriver ut specifik filinformation för objektfilformatet. 3. Visa innehållet i sektionsrubrikerna med - h-alternativet Det kan finnas olika sektioner i en objektfil. Information relaterad till dem kan skrivas ut med - h alternativ. Följande exempel visar olika sektioner. Som ni ser finns det totalt 26 (endast delvis produktion visas här). Så vi ser att informationen relaterad till alla sektionsrubriker skrivs ut i utmatningen. I utmatningen ovan är storleken storleken på den laddade sektionen, VMA representerar den virtuella minnesadressen, LMA representerar den logiska minnesadressen, Fil off är denna section8217s förskjutna från början av filen, Algn representerar inriktning, INNEHÅLL, ALLOK, LOAD , READONLY, DATA är flaggor som representerar att en viss sektion ska laddas eller är READONLY. 4. Visa innehållet i alla rubriker med - x-alternativ Information som är relaterad till alla rubriker i objektfilen kan hämtas med - x alternativ. Följande exempel visar alla sektioner (endast delvis utmatning visas här): 5. Visa samlarens innehåll av körbara sektioner med - d alternativ Tänk på följande exempel. Assembler-innehållet i körbara sektioner (i objektfilen) visas i denna utmatning (delutmatning som visas nedan): 6. Displaymonteringsinnehållet i alla sektioner med - D-alternativ Om aggregatinnehållet i alla sektioner krävs i utgången, Alternativet - D kan användas. Tänk på följande produktion: Så vi ser att den relevanta produktionen visades. Eftersom produktionen var väldigt lång så klippte jag den. Observera att jag använde personsökarkommandot för att styra utmatningen. 7. Visa hela innehållet i alla sektioner med hjälp av - s alternativ Tänk på följande exempel: Så vi ser att hela innehållet för alla sektioner visas i utmatningen. 8. Visa felsökningsinformation med - g-alternativ Tänk på följande exempel: Så vi ser att all tillgänglig felsökningsinformation har skrivits ut i produktionen. 9. Visa innehållet i symboltabellen (eller tabellerna) med alternativet - t Överväga följande exempel: Så vi ser att innehållet i symboltabellen visas i utmatningen. 10. Visa innehållet i dynamisk symboltabell med - T-alternativ Dynamiska symboler är de som löses under körtiden. Informationen om dessa symboler kan hämtas med alternativet - D. Tänk på följande exempel: Så vi ser att information relaterad till dynamiska symboler visas i produktionen. 11. Visa de dynamiska omlokaliseringarna i filen med hjälp av - R-alternativet Överväga följande exempel: Så vi ser att alla de dynamiska omlokaliseringarna visades i utmatningen. 12. Visa intresse av intresse med hjälp av - j-alternativet Det här är mycket användbart när du känner till det avsnitt som är relaterat till vilket informationen är nödvändig. Alternativet - j används i det här fallet. Tänk på följande exempel: Så vi ser att information relaterad till rodata avsnitt visas ovan. 13. Använd det äldre demonteringsformatet med alternativet 8211prefix-adresser Det äldre formatet skriver ut hela adressen på varje rad. Tänk på följande exempel: Så vi ser att fullständig adress har skrivits ut i utmatningen. 14. Acceptera inmatningsalternativ från en fil med alternativ Om du vill kan alternativen till objdump läsas från en fil. Detta kan göras med 82168217 alternativ. Tänk på följande exempel: I det här exemplet ovan har jag använt - v och - i alternativen. Medan - v används för att skriva ut versionsinformationen, - i används för att tillhandahålla stödda objektformat och arkitekturer. Nu skapade jag en fil och lägger till dessa två alternativ där. Utför objdump genom att ringa options. txt filen som visas nedan. Detta visar samma utgång som ovan, eftersom det läser alternativen från options. txt file. objdump (1) - Linux man page Description objdump visar information om en eller flera objektfiler. Alternativen styr vilken viss information som ska visas. Denna information är mest användbar för programmörer som arbetar med kompileringsverktygen, i motsats till programmerare som bara vill ha sitt program att kompilera och arbeta. objfile. är objektfilerna att undersökas. När du anger arkiv, visar objdump information om varje medlemsobjektfiler. De långa och korta alternativen, som visas här som alternativ, är likvärdiga. Åtminstone ett alternativ från listan - a, - d, - D, - e, - f, - g, - G, - h, - H, - p, - r, - R, - s, - S, - t, - T, - V, - x måste ges. - a - archive-header Om någon av objfile-filerna är arkiv, visa arkivhuvudinformationen (i ett format som liknar ls - l). Förutom informationen kan du lista med ar tv. objdump - a visar objektfilformatet för varje arkivmedlem. --justera-vma-offset När du dumpar information lägger du först till förskjutning till alla avsnittadresser. Detta är användbart om sektionsadresserna inte motsvarar symboltabellen, vilket kan hända när man lägger sektioner vid specifika adresser när man använder ett format som inte kan representera avsnittadresser, t. ex. a. out. - b bfdname --target bfdname Ange att objektkodformatet för objektfilerna är bfdname. Det här alternativet kanske inte är nödvändigt Objdump kan automatiskt identifiera många format. Exempelvis visar sammanfattande information från delhuvudena (-h) av fu. o. som explicit identifieras (-m) som en VAX-objektfil i formatet som produceras av Oasys-kompilatörer. Du kan lista de format som är tillgängliga med alternativet - i. - C - Demontera stil Avkoda (demangle) lågnivåns symbolnamn i användarnivånamn. Förutom att ta bort eventuella initiala understreck som upptas av systemet, gör detta att C-funktionsnamn är läsbara. Olika kompilatörer har olika manglingstilar. Det valfria demangling stil argumentet kan användas för att välja en lämplig demangling stil för din kompilator. - g --debugging Information om felsökning. Detta försöker analysera STABS - och IEEE-felsökningsformatinformation som är lagrad i filen och skriva ut den med en C-liknande syntax. Om inget av dessa format hittas faller detta alternativ tillbaka på alternativet - W för att skriva ut eventuell DWARF-information i filen. - e - debugging-taggar som - g. men informationen genereras i ett format som är kompatibelt med ctags-verktyget. - d - disassemble Visa monteringsmonteringen för maskininstruktionerna från objfile. Det här alternativet demonterar endast de avsnitt som förväntas innehålla instruktioner. - D - disassemble-all Like - d. men demontera innehållet i alla sektioner, inte bara de som förväntas innehålla instruktioner. Om målet är en ARM-arkitektur har denna omkopplare också att tvinga demonteraren att avkoda bitar av data som finns i kodavsnitt som om de var instruktioner. --prefix-adresser När du demonterar skriver du ut den fullständiga adressen på varje rad. Det här är det äldre demonteringsformatet. - EB - EL - endian Ange objektivets endianhet. Detta påverkar endast demontering. Detta kan vara användbart när du demonterar ett filformat som inte beskriver information om endian, såsom S-poster. - f - filhuvuden Visa sammanfattningsinformation från den övergripande rubriken för varje objfile-fil. - F - file-offsets Vid demontering av sektioner, visas också filförskjutningen i den region av data som ska dumpas närhelst en symbol visas. Om nollar hoppas över, då när demontering återupptas berättar användaren hur många nollor som hoppades över och filen offset av den plats från vilken demonteringen återupptas. Vid dumpning av sektioner, visa filförskjutningen för den plats där dumpningen startar. --file-start-context Ange att när du visar interlisted source codecassembly (antar - S) från en fil som ännu inte har visats, förlänga sammanhanget till början av filen. - h - sektionhuvud - headers Visa sammanfattningsinformation från rubrikrubrikerna i objektfilen. Filsegment kan flyttas till icke-standardadresser, till exempel genom att använda - texten. - Tdata. eller - Tbss alternativ till ld. Vissa objektfilformat, t. ex. a. out, lagrar inte startadressen för filsegmenten. I de situationerna, även om ld flyttar sektionerna korrekt, använder objdump - h för att lista filens rubrikhuvuden kan inte visa rätt adresser. I stället visar den vanliga adresserna, vilka är implicita för målet. - H --hjälp Skriv ut en sammanfattning av alternativen till objdump och exit. - i - info Visa en lista som visar alla arkitekturer och objektformat som är tillgängliga för specifikation med - b eller - m. - j namn - sektionsnamn Visa information endast för sektionsnamn. - l - line-numbers Märk displayen (med felsökningsinformation) med filnamn och källnummer som motsvarar objektkoden eller relokalen som visas. Endast användbart med - d. - D eller - r. - m maskin - arkitektur maskin Ange arkitekturen som ska användas vid demontering av objektfiler. Detta kan vara användbart när du demonterar objektfiler som inte beskriver arkitekturinformation, till exempel S-poster. Du kan lista de tillgängliga arkitekturerna med alternativet - i. Om målet är en ARM-arkitektur så har denna omkopplare en ytterligare effekt. Det begränsar demonteringen till endast de instruktioner som stöds av den arkitektur som anges av maskinen. Om det är nödvändigt att använda den här omkopplaren eftersom inmatningsfilen inte innehåller någon arkitekturinformation, men det är också önskvärt att demontera alla instruktioner använda - marm. - M alternativ - alternativ för disassembler-alternativ Passera inriktad specifik information till disassembleraren. Endast stöds på vissa mål. Om det är nödvändigt att ange mer än ett demonteringsalternativ kan flera - M alternativ användas eller kan placeras i en kommaseparerad lista. Om målet är en ARM-arkitektur kan den här väljaren användas för att välja vilket registernamn som ska användas under demonteringen. Specificerar - M reg-names-std (standard) väljer registernamnen som används i ARMs instruktionsuppsättning, men med register 13 kallas sp, register 14 kallas lr och register 15 kallas pc. Specificerar - M reg-names-apcs väljer namnet som används av ARM Procedure Call Standard, medan specificering - M reg-names-raw kommer bara att användas r följt av registret nummer. Det finns också två varianter på APCS-registernamnssystemet som aktiveras av - M reg-names-atpcs och - M reg-names-special-atpcs som använder ARMThumb Procedure Call Standard namngivningskonventioner. (Endera med de vanliga registreringsnamnen eller specialregistreringsnamnen). Detta alternativ kan också användas för ARM-arkitekturer för att tvinga demonteraren att tolka alla instruktioner som Thumb-instruktioner genom att använda switchen --disassembler-optionsforce-thumb. Detta kan vara användbart när du försöker demontera tumkod som producerats av andra kompilatorer. För x86 kan några av alternativen duplicera funktionerna i - m-omkopplaren, men tillåter finare kornad kontroll. Flera val från följande kan anges som en kommaseparerad sträng. x86-64. i386 och i8086 väljer demontering för den givna arkitekturen. intel och att välja mellan intel syntax läge och ATampT syntax läge. intel-mnemonic och att-mnemonic välj mellan intel mnemonic-läge och ATampT mnemonic-läge. intel-mnemonic innebär intel och att-mnemonic innebär att. addr64. addr32. addr16. data32 och data16 anger standardadressstorlek och operandstorlek. Dessa fyra alternativ kommer att överskridas om x86-64. i386 eller i8086 visas senare i alternativsträngen. Slutligen, suffix. när i ATampT-läget instruerar demonteraren att skriva ut ett mnemonalt suffix även när suffixet kan härledas av operandorna. För PowerPC kontrollerar boken demonteringen av BookE-instruktionerna. 32 och 64 väljer PowerPC respektive PowerPC64-demontering. e300 väljer demontering för e300-familjen. 440 väljer demontering för PowerPC 440. ppcps väljer demontering för PPC750CLs parna enskilda instruktioner. För MIPS. Detta alternativ styr utskrift av instruktionsnamn och registreringsnamn i demonterade instruktioner. Flera val från följande kan anges som en kommaseparerad sträng, och ogiltiga alternativ ignoreras: nej-aliaser Skriv ut den rådande instruktionen mnemonic istället för någon pseudo-instruktion mnemonic. Dvs. skriv ut daddu eller eller istället för att flytta, sll istället för nop osv. gpr-namn ABI Print GPR (generellt register) namn som är lämpligt för den angivna ABI. Som standard väljs GPR-namn i enlighet med ABI för binäret som är demonterat. fpr-namn ABI Print FPR (floating-point register) namn som lämpligt för den angivna ABI. Som standard skrivs FPR-nummer i stället för namn. cp0-namn ARCH Print CP0 (systemkontroll coprocessor coprocessor 0) registrera namn som lämpligt för CPU eller arkitektur specificerad av ARCH. Som standard väljs CP0-registernamn enligt arkitekturen och CPU för binäret är demonterat. hwr-namn ARCH Skriv ut HWR (hårdvararegister, som används av rdhwr-instruktionen) namn som lämpligt för CPU eller arkitektur specificerad av ARCH. Som standard väljs HWR-namn i enlighet med arkitekturen och CPU för binäret som demonteras. reg-namn ABI Print GPR och FPR namn som lämpligt för den valda ABI. reg-namn ARCH Skriv ut CPU-specifika registernamn (CP0-register och HWR-namn) som är lämpligt för den valda CPU eller arkitektur. För något av alternativen som anges ovan kan ABI eller ARCH anges som numeriskt för att få utskrivna nummer i stället för namn, för de valda typerna av register. Du kan lista de tillgängliga värdena för ABI och ARCH med hjälp av --help-alternativet. För VAX. Du kan ange funktionsadressadresser med - M-post: 0xf00ba. Du kan använda detta flera gånger för att korrekt demontera binära binärer i VAX som inte innehåller symboltabeller (som ROM-dumpar). I dessa fall skulle funktionskortet annars avkodas som VAX-instruktioner, vilket förmodligen skulle leda till att resten av funktionen är felaktigt demonterad. - p --private-headers Skriv ut information som är specifik för objektfilformatet. Den exakta informationen som skrivs ut beror på objektfilformatet. För vissa objektfilformat skrivs ingen ytterligare information. - r --reloc Skriv ut flyttningsuppgifterna i filen. Om den används med - d eller - D. omlokaliseringarna skrivs ut med avskiljningen. - R - dynamisk-reloc Skriv ut de dynamiska omlokaliseringarna i filen. Detta är endast meningsfullt för dynamiska objekt, till exempel vissa typer av delade bibliotek. När det gäller - r. om den används med - d eller - D. omlokaliseringarna skrivs ut med avskiljningen. - s - fullständigt innehåll Visa hela innehållet i alla begärda sektioner. Som standard visas alla icke tomma avsnitt. - S - källkod Displaykodkod blandad med demontering, om möjligt. Innehåller - d. --prefix prefix Ange prefix för att lägga till de absoluta banorna när de används med - S. - prefix-strip nivå Ange hur många initiala katalognamn som ska avlägsnas av de hårdlösa absoluta banorna. Det har ingen effekt utan prefixet prefix. - show-raw-insn När du demonterar instruktionerna, skriv ut instruktionerna i hex såväl som i symbolisk form. Detta är standard utom när --prefix-adresser används. --no-show-raw-insn När du demonterar instruktionerna, skriv inte ut instruktionsbitarna. Detta är standard när --prefix-adresser används. - bredd bredd Visa breddbyte på en enda linje vid demontering av instruktioner. - WlLiaprmfFsoR --dwarfrawline, avkodad linje, info, förkortning, pubnamn, aranges, makro, ramar, ramar-interp, str, loc, Ranges Visar innehållet i debug-sektionerna i filen, om någon är närvarande. Om en av de valfria bokstäverna eller orden följer växeln dumpas endast data som finns i de specifika sektionerna. - G - stabs Visa hela innehållet i alla begärda sektioner. Visa innehållet i. stab och. stab. index och. stab. excl avsnitten från en ELF-fil. Det här är bara användbart på system (som Solaris 2.0) där. stab-debugging-symbol-tabellposter förses i en ELF-sektion. I de flesta andra filformat interfolieras debugging-symbol-tabellposter med kopplingssymboler och är synliga i - symprodukten. - startadressadress Börja visa data vid angiven adress. Detta påverkar utsignalen från - d. - r och - s alternativ. - Stoppadressadress Stoppa visning av data vid angiven adress. Detta påverkar utsignalen från - d. - r och - s alternativ. - t - yper Skriv ut symboltabellposterna i filen. Detta liknar informationen från nm-programmet, även om visningsformatet är annorlunda. Formatet för utgången beror på formatet på filen som dumpas, men det finns två huvudtyper. Man ser så här ut: där siffran inuti torghakarna är numret på posten i symboltabellen är sek-numret sektionsnumret, fl-värdet är symbolerna flaggbitar, ty-numret är symboltypen, scl Numret är symbollagringsklassen och nx-värdet är antalet hjälpämnen som är associerade med symbolen. De två sista fälten är symbolvärdet och dess namn. Det andra gemensamma utmatningsformatet, vanligtvis sett med ELF-baserade filer, ser så här ut: Här är det första numret symbolvärdet (kallas ibland som dess adress). Nästa fält är faktiskt en uppsättning tecken och mellanslag som anger flaggbitarna som är inställda på symbolen. Dessa tecken beskrivs nedan. Nästa är den sektion som symbolen är associerad med eller ABS om sektionen är absolut (dvs inte kopplad till någon sektion) eller UND om sektionen refereras i filen som dumpas men inte definierad där. Efter sektionsnamnet kommer ett annat fält, ett tal, som för vanliga symboler är inriktningen och för annan symbol är storleken. Slutligen visas symbolnamnet. Flaggtecken är indelade i 7 grupper enligt följande: l Symbolen är en lokal (l), global (g), unik global (u), varken global eller lokal (ett mellanslag) eller både globalt och lokalt (). En symbol kan varken vara lokal eller global av olika skäl, t. ex. eftersom det används för debugging, men det är förmodligen en indikation på ett fel om det någonsin är både lokalt och globalt. Unika globala symboler är en GNU-förlängning till standarduppsättningen av ELF-symbolbindningar. För en sådan symbol kommer den dynamiska länken att se till att i hela processen finns det bara en symbol med detta namn och typ som används. Symbolen är svag (w) eller stark (ett mellanslag). Symbolen betecknar en konstruktör (C) eller en vanlig symbol (ett mellanslag). Symbolen är en varning (W) eller en normal symbol (ett mellanslag). Ett varningssymbols namn är ett meddelande som ska visas om symbolen som följer varningssymbolen någonsin refereras.

No comments:

Post a Comment