Fråga:
Blandad 16/32-bitars kodvändning med IDA
user1797
2013-07-10 01:36:51 UTC
view on stackexchange narkive permalink

Jag försöker omvandla en binär blob som jag förväntar mig att övergå från 16-bitars realläge till 32-bitars skyddat läge (det är starttidskod), så jag förväntar mig att koden innehåller kod av båda typerna.

När jag startar IDA får jag alternativet 16 eller 32-bitars kod, men inte blandat.

Hur instruerar jag IDA att försöka ta isär data på en given adress som 32 -bit-läge?

Jag kan använda 16-bitarsanalysatorn härleda det ursprungliga hoppet (ursprungligen) och IDA analyserar gärna koden därifrån. Jag kan se var 32-bitars koden hoppar till (fjärrhopp, så IDA försöker inte analysera den), men IDA behandlar detta som 16-bitar när jag slår C .

Kan jag göra det i en, förutom att starta en 16 och en 32-bitars dissasmbly-session?

Armprocessormodulen kan göra exakt detta. Så jag antar att det är en funktion som kan implementeras i teorin.
Två svar:
PSS
2013-07-10 09:35:04 UTC
view on stackexchange narkive permalink

Du kan antingen göra det manuellt eller skapa en anpassad laddarmodul för din binära blob. Vad du behöver göra är att separera koden i två segment: 32-bitars segment och 16-bitars segment och ange lämpligt adresseringsläge. IDA stöder 16, 32, 64 bitars lägen. Om det behövs kan du manuellt skapa två olika kodsegment och ändra adressläge manuellt genom att trycka på Alt + S

För att införliva det i en lastare, du kan använda geteg och set_segm_addressing från segment.hpp ur IDA SDK:

  // Få pekare till segment efter linjär adress // ea - linjär adress som tillhör segmentet // returnerar: NULL eller pekare till segmentstrukturinline segment_t * getseg (ea_t ea) {return (segment_t *) (segs.get_area ( ea)); } 

  // Ändra segmentadresseringsläge (16, 32, 64 bitar) // Du måste använda den här funktionen för att ändra segmentadressering , ändra aldrig // fältet "bitness" direkt. // Denna funktion tar bort alla instruktioner, kommentarer och namn i segmentet // s - pekare till segment // bitness- nytt adresseringsläge för segment // 2: 64bit segment / / 1: 32bit segment // 0: 16bit segment // returnerar: 1-ok, 0-failureidaman bool ida_export set_segm_addressing (segment_t * s, size_t bitness);  

För det första behöver du för att få en pekare till en segmentstruktur med geteg . Därefter kan du ändra segmentadresseringsläge till 16 eller 32 bitar med set_segm_addressing .

blabb
2013-07-10 10:09:56 UTC
view on stackexchange narkive permalink

Ida Free 5

  Redigera ->-segment ->CreateSegment  

i dialogrutan

  segmentnamn = seg001 .... seg00nstart = <startadress dvs 0x0Aend = <end adress dvs 0x1ebase = 0x0 klass = lite text dvs 32one, 32two, 16threeradio-knapp = 32-bitars segment eller 16 bitars segment efter behov klicka ja till en kryptisk dialog 

exempel den binära strömmen innehåller 16-bitars dos rutinmässigt och 32-bitars slumpmässiga tryck blandade

  C: \ Documents and Settings \ Admin \ Desktop>xxd -g 1 1632blob.bin0000000: b4 01 cd 21 88 c2 b4 02 cd 21 68 78 56 34 12 68 ...! .....! HxV4.h0000010: 0d d0 37 13 68 be ba 37 13 68 00 0d db ba b4 01 ..7.h..7.h ...... 0000020: cd 21 88 c2 b4 02 cd 21 68 78 56 34 12 68 0d d0.! .....! HxV4.h..0000030: 37 13 68 be ba 37 13 68 00 0d db ba b4 01 cd 21 7.h..7.h .......! 0000040: 88 c2 b4 02 cd 21 68 78 56 34 12 68 0d d0 37 13. ....! hxV4.h..7.000 0050: 68 be ba 37 13 68 00 0d db ba h..7.h .... C: \ Documents and Settings \ Admin \ Desktop>  

laddar denna blob som binär fil flyttar till förskjutning 0 och tryck på c skulle ta isär alla byte som 16 bitar

nu kan du gå till förskjutning 0x0a och skapa ett 32-bitars segment med start som 0x0a slut som 0x1e bas som 0x0 klass som 32on använd 32bitsegment-knapp och tryck på c kod> igen för att skapa 32-bitars demontering

se nedan

  seg000: 0000; seg000: 0000; + ------------------------------------------------- ------------------------ + seg000: 0000; ¦ Den här filen genereras av The Interactive Disassembler (IDA) ¦seg000: 0000; ¦ Copyright (c) 2010 av Hex-Rays SA, <support@hex-rays.com> ¦
seg000: 0000; ¦ Licensierad till: Freeware version ¦seg000: 0000; + ------------------------------------------------- ------------------------ + seg000: 0000; seg000: 0000; Ingång MD5: AEB17B9F8C4FD00BF2C04A4B3399CED1seg000: 0000seg000: 0000; -------------------------------------------------- ------------------------- seg000: 0000seg000: 0000 .686pseg000: 0000 .mmxseg000: 0000 .modell flatseg000: 0000seg000: 0000; -------------------------------------------------- ------------------------- seg000: 0000seg000: 0000; Segmenttyp: Ren kodeg000: 0000 seg000 segmentbyte offentlig 'CODE' användning16seg000: 0000 antar cs: seg000seg000: 0000 antar es: seg005, ss: seg005, ds: seg005, fs: seg005, gs: seg005seg000: 0000 B4 01 mov ah, 1seg000: 0002 CD 21 int 21hseg000: 0004 88 C2 mov dl, alseg000: 0006 B4 02 mov ah, 2seg000: 0008 CD 21 int 21hseg000: 0008 seg000 endsseg000: 0008seg001: 0000000A; -------------------------------------------------- ------------------------- seg001: 0000000Aseg001: 0000000A; Segmenttyp: Regularseg001: 0000000A seg001 segment byte public '32one' use32seg001: 0000000A antar cs: seg001seg001: 0000000A; org 0Ahseg001: 0000000A antar es: ingenting, ss: ingenting, ds: ingenting, fs: ingenting, gs: nothingseg001: 00 78 56 34 12 tryck 12345678hseg001: 0000000F 68 0D D0 37 13 tryck 1337D00Dh
seg001: 00000014 68 BE BA 37 13 push 1337BABEhseg001: 00000019 68 00 0D DB BA push 0BADB0D00hseg001: 00000019 seg001 endsseg001: 00000019seg002: 001E; -------------------------------------------------- ------------------------- seg002: 001Eseg002: 001E; Segmenttyp: Ren kodeg002: 001E seg002 segment byte public 'CODE' use16seg002: 001E antar cs: seg002seg002: 001E; org 1Ehseg002: 001E antar es: seg005, ss: seg005, ds: seg005, fs: seg005, gs: seg005s B4 01 mov ah, 1seg002: 0020 CD 21 int 21hseg002: 0022 88 C2 mov dl, alseg002: 0024 B4 02 mov ah, 2seg002: 0026 CD 21 int 21hseg002: 0026 seg002 endsseg002: 0026seg003: 00000028; -------------------------------------------------- ------------------------- seg003: 00000028seg003: 00000028; Segmenttyp: Regularseg003: 00000028 seg003 segment byte offentlig '32two' use32seg003: 00000028 antar cs: seg003seg003: 00000028; org 28hseg003: 00000028 antar es: ingenting, ss: ingenting, ds: ingenting, fs: ingenting, gs: nothingseg003: 00000028 68 78 56 34 12 push 12345678hseg003: 0000002D 68 0D D0 37 13 push 1337D00Dhseg003: 00000032 68 BE BA 37 13 push 1337BABEhseg003: 00000037 68 00 0D DB BA push 0BADB0D00hseg003: 00000037 seg003 endsseg003: 00000037seg004: 003; -------------------------------------------------- ------------------------- seg004: 003Cseg004: 003C; Segmenttyp: ren kod
seg004: 003C seg004 segment byte offentlig 'CODE' användning16seg004: 003C antar cs: seg004seg004: 003C; org 3Chseg004: 003C antar es: seg005, ss: seg005, ds: seg005, fs: seg005, gs: seg005seg004: 003 , 1seg004: 003E CD 21 int 21hseg004: 0040 88 C2 mov dl, alseg004: 0042 B4 02 mov ah, 2seg004: 0044 CD 21 int 21hseg004: 0044 seg004 endsseg004: 0044seg005: 00000046; -------------------------------------------------- ------------------------- seg005: 00000046seg005: 00000046; Segmenttyp: Regularseg005: 00000046 seg005 segment byte offentlig '32three' use32seg005: 00000046 antar cs: seg005seg005: 00000046; org 46hseg005: 00000046 antar es: ingenting, ss: ingenting, ds: ingenting, fs: ingenting, gs: nothingseg005: 00000046 68 78 56 34 12 push 12345678hseg005: 0000004B 68 0D D0 37 13 push 1337D00Dhseg005: 00000050 68 BE BA 37 13 push 1337BABEhseg005: 00000055 68 00 0D DB BA push 0BADB0D00hseg005: 00000055 seg005 endsseg005: 00000055seg005: 00000055s: 00000055s före>


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...