Umwandlung von Hex zu Int oder Long

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
tany3
User
Beiträge: 20
Registriert: Mittwoch 7. März 2012, 10:32

Dienstag 13. März 2012, 23:31

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
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dienstag 13. März 2012, 23:43

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)
tany3
User
Beiträge: 20
Registriert: Mittwoch 7. März 2012, 10:32

Dienstag 13. März 2012, 23:49

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 !
tany3
User
Beiträge: 20
Registriert: Mittwoch 7. März 2012, 10:32

Mittwoch 14. März 2012, 00:21

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:
problembär

Mittwoch 14. März 2012, 00:32

Die Textdatei kann nicht unterscheiden, ob dort 'int' oder 'str' (String) gespeichert ist. Du kannst also ruhig nach String umwandeln und dann abspeichern.
tany3
User
Beiträge: 20
Registriert: Mittwoch 7. März 2012, 10:32

Mittwoch 14. März 2012, 00:38

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
problembär

Mittwoch 14. März 2012, 01:06

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()
tany3
User
Beiträge: 20
Registriert: Mittwoch 7. März 2012, 10:32

Mittwoch 14. März 2012, 01:25

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:
Benutzeravatar
snafu
User
Beiträge: 5990
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mittwoch 14. März 2012, 06:48

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.
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Mittwoch 14. März 2012, 08:17

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.
tany3
User
Beiträge: 20
Registriert: Mittwoch 7. März 2012, 10:32

Mittwoch 14. März 2012, 08:35

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
BlackJack

Mittwoch 14. März 2012, 08:36

@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.
problembär

Mittwoch 14. März 2012, 17:10

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