Seite 1 von 1

Umwandlung von Hex zu Int oder Long

Verfasst: Dienstag 13. März 2012, 23:31
von tany3
Hi zusammen ,

Ich möchte in meinem Skript die Basic Blocks auslesen und bekomme die Start und End Adresse als Hex geliefert, möchte aber Int oder Long zumindest kein Hex. Aber Irgendwie krieg ich immer trotzdem Hex raus, wieso ?

Code: Alles auswählen

def BasicBlocks(p=True):
    f = idaapi.FlowChart(idaapi.get_func(here()))
    for block in f:
        if p:
           print ( "%x - %x [%d]:" % (long(block.startEA), long(block.endEA), long(block.id) )) 
        for succ_block in block.succs():
            if p:
                print ( "%x - %x [%d]:" % (long(succ_block.startEA), long(succ_block.endEA), long(succ_block.id) ))          
        for pred_block in block.preds():
            if p:
                print ( "%x - %x [%d]:" % (long(pred_block.startEA), long(pred_block.endEA), long(pred_block.id) )) 
Was ich kriege ist dann sowas :

Code: Alles auswählen

404377 - 40438f [3]:
Kann jmd helfen ? :o

vG Tany3

Re: Umwandlung von Hex zu Int oder Long

Verfasst: Dienstag 13. März 2012, 23:43
von cofi
Du solltest dir mal http://docs.python.org/library/stdtypes ... formatting anschauen.
Speziell die Tabelle mit den "conversion types" und noch spezieller diese Zeile
'x' Signed hexadecimal (lowercase). (2)

Re: Umwandlung von Hex zu Int oder Long

Verfasst: Dienstag 13. März 2012, 23:49
von tany3
cofi hat geschrieben:Du solltest dir mal http://docs.python.org/library/stdtypes ... formatting anschauen.
Speziell die Tabelle mit den "conversion types" und noch spezieller diese Zeile
'x' Signed hexadecimal (lowercase). (2)

Super ! Hab den Fehler erkannt :D Danke !

Re: Umwandlung von Hex zu Int oder Long

Verfasst: Mittwoch 14. März 2012, 00:21
von tany3
Kurze Frage noch ...

Ich bekomm die Sachen jetzt aber nicht in eine Datei geschrieben weil "write" und "writelines" nur Strangs akzeptieren und mit Konversion hat es auch nicht geklappt ...

Code: Alles auswählen

# Loop through all the functions
for function_ea in Functions(SegStart(ea), SegEnd(ea)):
    q = None
    f = None
    ZusammenfassungFunktionen=open("ZusammenfassungFunktionen.txt","a")
    ZusammenfassungFunktionen.writelines(( "Funktionsadresse:",int(function_ea), "\n",
                                           "Funktionsadresse:",int(function_ea), "\n",
                                           "Basic Blocks",BasicBlocks(True),"\n" ))
    print "Funktionsadresse:",int(function_ea) 
    print "Funktionsname:",GetFunctionName(function_ea) 
    print "Basic Blocks",BasicBlocks(True)
Die Printe unten sind überflüssig ich weiß, aber wie bekomme ich meine Ergebnisse, die Integers bleiben müssen in eine Datei abgespeichert ? :oops:

Re: Umwandlung von Hex zu Int oder Long

Verfasst: Mittwoch 14. März 2012, 00:32
von problembär
Die Textdatei kann nicht unterscheiden, ob dort 'int' oder 'str' (String) gespeichert ist. Du kannst also ruhig nach String umwandeln und dann abspeichern.

Re: Umwandlung von Hex zu Int oder Long

Verfasst: Mittwoch 14. März 2012, 00:38
von tany3
problembär hat geschrieben:Die Textdatei kann nicht unterscheiden, ob dort 'int' oder 'str' (String) gespeichert ist. Du kannst also ruhig nach String umwandeln und dann abspeichern.

Hi ! Das hab ich probiert aber funktioniert nicht wie gedacht, denn :

Code: Alles auswählen

Funktionsadresse: 4294692
Funktionsname: HEEnterWindowLoop
Basic Blocks 4211520 - 4211550 [0]:
4211550 - 4211554 [1]:
4211554 - 4211575 [2]:
4211550 - 4211554 [1]:
ist die Ausgabe in der Shell, soweit super !

Und das :

Code: Alles auswählen

Funktionsadresse:4221488
Funktionsname:sub_406A30
Basic BlocksNone
Funktionsadresse:4221840
Funktionsname:sub_406B90
Basic BlocksNone
Funktionsadresse:4221904
Funktionsname:sub_406BD0
Basic BlocksNone
Funktionsadresse:4221968
Funktionsname:sub_406C10
Basic BlocksNone
Funktionsadresse:4222336
Funktionsname:sub_406D80
Basic BlocksNone
Funktionsadresse:4222400
Funktionsname:sub_406DC0
Basic BlocksNone
Funktionsadresse:4222672
Funktionsname:sub_406ED0
Basic BlocksNone
In der txt Datei am Ende ... Ich bekomm nur noch None's. Obwohl es eigentlich keine sind :K

Re: Umwandlung von Hex zu Int oder Long

Verfasst: Mittwoch 14. März 2012, 01:06
von problembär
Setze bei "open()" "a" nur ein, wenn's sein muß, wenn nicht, besser "r" (lesen) oder "w" (ganz neu schreiben (einschließlich löschen)).
Mit "write()" hat man mehr Kontrolle:

Code: Alles auswählen

#!/usr/bin/env python
# coding: iso-8859-1

fh = open("test.txt", "w")
fh.write("Funktionsadresse:" + "\t" + str(function_ea) + "\n")
fh.write("Funktionsname:" + "\t" + str(GetFunctionName(function_ea)) + "\n")
fh.write("Basic Blocks" + "\t" + str(BasicBlocks(True)))
fh.close()

Re: Umwandlung von Hex zu Int oder Long

Verfasst: Mittwoch 14. März 2012, 01:25
von tany3
problembär hat geschrieben:Setze bei "open()" "a" nur ein, wenn's sein muß, wenn nicht, besser "r" (lesen) oder "w" (ganz neu schreiben (einschließlich löschen)).
Mit "write()" hat man mehr Kontrolle:

Code: Alles auswählen

#!/usr/bin/env python
# coding: iso-8859-1

fh = open("test.txt", "w")
fh.write("Funktionsadresse:" + "\t" + str(function_ea) + "\n")
fh.write("Funktionsname:" + "\t" + str(GetFunctionName(function_ea)) + "\n")
fh.write("Basic Blocks" + "\t" + str(BasicBlocks(True)))
fh.close()

Code: Alles auswählen

# Loop through all the functions
for function_ea in Functions(SegStart(ea), SegEnd(ea)):
    q = None
    f = None
    ZusammenfassungFunktionen=open("ZusammenfassungFunktionen.txt","w")
    ZusammenfassungFunktionen.write("Funktionsadresse:"+"\t"+str(function_ea)+"\n")
    ZusammenfassungFunktionen.write("Funktionsname:"+"\t"+str(GetFunctionName(function_ea)+"\n")
    ZusammenfassungFunktionen.write("Basic Blocks:"+"\t"+str(BasicBlocks(True))+"\n")
    ZusammenfassungFunktionen.close()
Wo soll denn da ein Fehler sein -.- Ich bekomm immer :

Bild

Uploaded with ImageShack.us

Wahrscheinlich schon zu spät aber ich seh es nicht ... :lol:

Re: Umwandlung von Hex zu Int oder Long

Verfasst: Mittwoch 14. März 2012, 06:48
von snafu
Bei einem `SyntaxError` muss man oft eine Zeile höher gucken. Und dann sieht man auch, dass in der vorherigen Zeile 3 Klammern geöffnet, aber nur 2 Klammern geschlossen werden.

Re: Umwandlung von Hex zu Int oder Long

Verfasst: Mittwoch 14. März 2012, 08:17
von cofi
tany3 hat geschrieben:In der txt Datei am Ende ... Ich bekomm nur noch None's. Obwohl es eigentlich keine sind :K
Du speicherst hier auch das Ergebnis von ``BasicBlocks``. Wenn du ganz oben die komplette Funktion gezeigt hast ist das Ergebnis davon immer ``None`` da du keines explizit zurueckgibst (mit ``return``). Und fuer das schreiben in die Datei gilt auch: Nutze lieber String Formatierung als das zusammensetzen.

Re: Umwandlung von Hex zu Int oder Long

Verfasst: Mittwoch 14. März 2012, 08:35
von tany3
snafu hat geschrieben:Bei einem `SyntaxError` muss man oft eine Zeile höher gucken. Und dann sieht man auch, dass in der vorherigen Zeile 3 Klammern geöffnet, aber nur 2 Klammern geschlossen werden.
Jop das hab ich korrigiert danach kam es ja zu den ganzen Nones in den Basic Blocks.
cofi hat geschrieben:
tany3 hat geschrieben:In der txt Datei am Ende ... Ich bekomm nur noch None's. Obwohl es eigentlich keine sind :K
Du speicherst hier auch das Ergebnis von ``BasicBlocks``. Wenn du ganz oben die komplette Funktion gezeigt hast ist das Ergebnis davon immer ``None`` da du keines explizit zurueckgibst (mit ``return``). Und fuer das schreiben in die Datei gilt auch: Nutze lieber String Formatierung als das zusammensetzen.
Aber wieso klappt es denn dann in der Shell ... Ich versteh nicht was ich jetzt machen soll damit es klappt :K

Re: Umwandlung von Hex zu Int oder Long

Verfasst: Mittwoch 14. März 2012, 08:36
von BlackJack
@tany3: Du solltest vielleicht von dem konkreten Projekt mal einen Schritt zurück machen und ein Python-Tutorial durcharbeiten. Natürlich bekommst Du `None`\s, denn das ist nun einmal was zumindest die `BasicBlocks()`-Funktion *zurück* gibt. Funktionen geben nicht das zurück was sie *aus*geben, sondern das was sie mittels ``return``-Anweisung *zurück* geben. Wenn der Programmfluss das Ende einer Funktion erreicht ohne ein explizites ``return`` ausgeführt zu haben, dann kann man sich am Ende jeder Funktion ein implizites ``return None`` vorstellen.

Namen sollten nicht nur aus einem Buchstaben bestehen. Abgesehen von „Zählvariablen” oder solchen die nur innerhalb eines Ausdrucks, zum Beispiel einer „list comprehension” oder eines Generatorausdrucks, verwendet werden, sollen Namen dem Benutzer vermitteln was die Bedeutung der Objekte ist, ohne das er raten muss.

Der Code bei `BasicBlocks()` ist ungünstig organisiert. Wenn `p` an einen „unwahren” Wert gebunden ist, dann kann man sich eigentlich *den gesamten* Ablauf der Funktion sparen. Also sollte man die ``if``\s heraus ziehen oder dieses Flag komplett weglassen und die Entscheidung diese Funktion aufzurufen an den Aufrufer verschieben. Denn der hat dann ja schon das nötige Wissen wenn er das Flag übergeben würde.

Die `long()`-Aufrufe würde ich durch `int()` ersetzen. Der Typ `long` ist nun schon seit längerer Zeit ein „Auslaufmodell”. Es sei denn IDA erzwingt das. Von welchem Typ sind denn die Attribute, die da abgefragt werden?

Deine Probkeme mit Aus- und Rückgabe haben auch etwas damit zu tun, dass Du dort reine Programmlogik und UI im weitesten Sinne miteinander vermischt. Die `BasicBlocks()`-Funktion sollte die Blöcke ermitteln und zurück geben. Ausgabe auf der Konsole und/oder in eine Datei sollte an anderer Stelle, vielleicht sogar in jeweils eigenen Funktionen, passieren.

Bezüglich der Namensgebung solltest Du mal einen Blick in PEP 8 -- Style Guide for Python Code werfen.

Re: Umwandlung von Hex zu Int oder Long

Verfasst: Mittwoch 14. März 2012, 17:10
von problembär
tany3 hat geschrieben:

Code: Alles auswählen

# Loop through all the functions
for function_ea in Functions(SegStart(ea), SegEnd(ea)):
    q = None
    f = None
    ZusammenfassungFunktionen=open("ZusammenfassungFunktionen.txt","w")
    ZusammenfassungFunktionen.write("Funktionsadresse:"+"\t"+str(function_ea)+"\n")
    ZusammenfassungFunktionen.write("Funktionsname:"+"\t"+str(GetFunctionName(function_ea)+"\n")
    ZusammenfassungFunktionen.write("Basic Blocks:" + "\t"+str(BasicBlocks(True)) + "\n")
    ZusammenfassungFunktionen.close()
Wo soll denn da ein Fehler sein
Na ja, Du hast den "open()"-Befehl in der Schleife, das heißt, er versucht jedesmal neu, die Datei zu öffnen. Das ist glaube ich nicht, was Du willst.
Außerdem fehlte da noch eine Klammer, deshalb der "Syntax Error". Probier's mal so:

Code: Alles auswählen

#!/usr/bin/env python
# coding: iso-8859-1

ZusammenfassungFunktionen = open("ZusammenfassungFunktionen.txt", "w")

# Loop through all the functions
for function_ea in Functions(SegStart(ea), SegEnd(ea)):
    q = None
    f = None
    ZusammenfassungFunktionen.write("Funktionsadresse:" + "\t" + str(function_ea) + "\n")
    ZusammenfassungFunktionen.write("Funktionsname:" + "\t" + str(GetFunctionName(function_ea)) + "\n")
    ZusammenfassungFunktionen.write("Basic Blocks:" + "\t" + str(BasicBlocks(True)) +"\n")
    ZusammenfassungFunktionen.write("\n")

ZusammenfassungFunktionen.close()
Dein "ZusammenfassungFunktionen" ist ein file-handle, bzw. ein file-object. Ich würde versuchen, das auch in der Bezeichnung zum Ausdruck zu bringen (nur bitte nicht den Namen "file" verwenden, weil der in Python 2.x schon für die eingebaute "file"-Funktion verwendet wird).