Ollydbg: Zum aktuellen Mnemonic springen



  • hallo,

    ich will grad ein bisschen mit reverse-engeneering anfangen.

    ich hab auch schon ein paar anwendungen.

    das problem ist: ich versteh nicht ganz, wie man ollydbg bedient?

    Wo kann ich die strings in der exe anzeigen? Andere Disassembler haben das auch.

    Wie springe ich zum aktuellen Offset? Ich starte das Programm mit Ollydbg, aber der cursor springt nicht synchron zum programmablauf mit!

    Gibt es sowas wie ollydbg eigenltich unter linux?



  • kafffeee schrieb:

    Wo kann ich die strings in der exe anzeigen? Andere Disassembler haben das auch.

    Mach einen Rechtsklick irgendwo in den ASM Code. Dann klick auf Search for->All referenced text string

    kafffeee schrieb:

    Wie springe ich zum aktuellen Offset?

    Rechts siehst du in Olly die Register. (EBP,ESP,EIP ...) mach einfach einen Doppelklick auf EIP.

    kafffeee schrieb:

    Ich starte das Programm mit Ollydbg, aber der cursor springt nicht synchron zum programmablauf mit!

    Run Program != Step
    Run Program = F9
    Step into = F7

    Geh halt mal mit dem Maus Cursor über die Buttons ... unten Links steht in Olly was welcher Button macht.

    kafffeee schrieb:

    Gibt es sowas wie ollydbg eigenltich unter linux?

    Ja, IDA Pro und noch irgendsowas kostenloses aber ich weiss nicht mehr wie es hiess, was ich aber noch weiss ist das dieses kostenlose Ding der letzte Müll war. 😃

    Google mal nach: reverse engineering lena

    Die hat ein paar gute Einsteiger Tutorials erstellt.



  • ok, eine frage noch: wie kann ich das tatsächliche offset eines mnemonics aus der liste herausfinden?

    also wo die opcodes tatsächlich in der datei stehen?



  • Ich hab da gerade noch was auf meinem PC gefunden:

    RVA(Relative virtual address) = Adresse die noch nicht in den Speicher gemappt wurde
    VA(Virtual addresse) = Adresse die in den Speicher gemappt wurde

    Hinweis:

    Zu jeder Section sind im PE-Header verschiedene Daten zu finden z.b.:

    00400178 2E 74 65 78 >ASCII ".text" ; SECTION
    00400180 5E000000 DD 0000005E ; VirtualSize = 5E (94.)
    00400184 00100000 DD 00001000 ; VirtualAddress = 1000
    00400188 00020000 DD 00000200 ; SizeOfRawData = 200 (512.)
    0040018C 00020000 DD 00000200 ; PointerToRawData = 200
    00400190 00000000 DD 00000000 ; PointerToRelocations = 0
    00400194 00000000 DD 00000000 ; PointerToLineNumbers = 0
    00400198 0000 DW 0000 ; NumberOfRelocations = 0
    0040019A 0000 DW 0000 ; NumberOfLineNumbers = 0
    0040019C 20000060 DD 60000020 ; Characteristics = CODE|EXECUTE|READ

    Die .text Section ist die Section in der der Ausführbare Code liegt.
    PointerToRawData sagt z.b. aus an welcher Adresse die ersten ausführbaren Opcodes stehen wenn die Datei nocht NICHT vom PE-Loader geladen wurde.

    Beispiel:

    RVA Adresse: 0x10A4
    VA Adresse: 0x4020A4
    String an RVA Adresse 0x10A4 = kernel32.dll
    String an VA Adresse 0x4020A4 = kernel32.dll

    PE-Header Daten:
    ( Diese Daten findet man im PE-Header die Daten können von Compiler zu Compiler anders sein )

    ImageBase: 0x00400000

    Data Section:
    VirtualAddress von Data Section: 0x4000
    PointerToRawData von Data Section: 0x2a00

    Berechnung:
    RVA String Adresse = ( VA Adresse der Variable - ModuleEntryPoint - VirtualAddressDataSection ) + PointerToRawData (Aus Data Section )

    RVA String Adresse ( 0x4040A2 - 0x400000 - 0x4000 ) + 0x2a00
    RVA String Adresse = 0x2aa2



  • kafffeee schrieb:

    ok, eine frage noch: wie kann ich das tatsächliche offset eines mnemonics aus der liste herausfinden?

    also wo die opcodes tatsächlich in der datei stehen?

    Du rechnest einfach die RVA dieses Opcodes aus, indem du die Start-Adresse des Codesegmentes von der VA des Opcodes subtrahierst.

    RVAop = VAop - VAcs ergibt die Entfernung vom Codesegment zum Opcode in Bytes an.

    Im Header (IMAGE_NT_HEADERS::IMAGE_OPTIONAL_HEADER::BaseOfCode) einer PE Datei hast du auch eine RVA zu Codesegment. Darauf noch die RVA zum Opcode addieren und schon bist du an der Opcode Stelle in der Datei.
    Achtung: Dies funktioniert natürlich nicht mit Code der im Heapsegment abgelegt wurde. Denn Speicherbereich in diesem Segment wird dynamisch zur Laufzeit der Anwendung alloziert und ist deshalb logischerweise in der PE-Datei nicht vorhanden.



  • addrtext schrieb:

    kafffeee schrieb:

    ok, eine frage noch: wie kann ich das tatsächliche offset eines mnemonics aus der liste herausfinden?

    also wo die opcodes tatsächlich in der datei stehen?

    Du rechnest einfach die RVA dieses Opcodes aus, indem du die Start-Adresse des Codesegmentes von der VA des Opcodes subtrahierst.

    RVAop = VAop - VAcs ergibt die Entfernung vom Codesegment zum Opcode in Bytes an.

    Im Header (IMAGE_NT_HEADERS::IMAGE_OPTIONAL_HEADER::BaseOfCode) einer PE Datei hast du auch eine RVA zu Codesegment. Darauf noch die RVA zum Opcode addieren und schon bist du an der Opcode Stelle in der Datei.
    Achtung: Dies funktioniert natürlich nicht mit Code der im Heapsegment abgelegt wurde. Denn Speicherbereich in diesem Segment wird dynamisch zur Laufzeit der Anwendung alloziert und ist deshalb logischerweise in der PE-Datei nicht vorhanden.

    entschuldigung... aber was ist (R)VA? und wo finde ich das? und wo finde ich IMAGE_NT_HEADERS::IMAGE_OPTIONAL_HEADER::BaseOfCode?



  • Les dir mal diesen Artikel durch:

    http://msdn.microsoft.com/en-us/magazine/cc301805.aspx

    Der sollte deine Frage benantworten.


Log in to reply