Liste erstellen in Python

  • Themenstarter Themenstarter caffeine
  • Beginndatum Beginndatum
C

caffeine

Guest
Hi HB ,

Hab' noch ein kleines Problem: Ich möchte in IDAPython eine Liste erstellen wo immer nur die Opcodes heraussortiert werden.Das habe ich soweit hinbekommen aber irgendwie klappt es nicht dass er nur die z.B. "mov" Argumente rausnimmt und auflistet .

PHP:
#For each of the segments:
for seg_ea in Segments():
   for head in Heads(seg_ea, SegEnd(seg_ea)):
      if isCode(GetFlags(head)):
        for


bzw. :

PHP:
for seg_ea in Segments():
   for head in Heads(seg_ea, SegEnd(seg_ea)):
      if str(isCode(GetFlags(head)))== "mov": 
          mnem = GetMnem(head)
          mnemonics[mnem] = mnemonics.get(mnem, 0)+1
# Sort the mnemonics by number of occurrences
sorted1 = map(lambda x:(x[1], x[0]), mnemonics.items() )
sorted1.sort()
# Print the sorted list
for mnemonic, count in sorted1: 
   Moves=open("Moves.txt","a") 
   Moves.writelines(( (str(mnemonic),"\n",str(count)) ))
print("Fertig, Moves gespeichert in Moves.txt")
Bei der letzten For-Schleife klappt es nicht.

vG tanye
 
Zuletzt bearbeitet:
Ein kleines lauffähiges Beispiel wäre nicht schlecht oder zumindest ein Beispiel für Ein/Ausgabe - falls es nicht zu viel wird (k.A von IDAPython), denn vermutlich ist das Problem nicht IDAPython spezifisch.

Denn "irgendwie klappt es nicht dass er nur die z.B. "mov" Argumente rausnimmt und aufliste" und "Bei der letzten For-Schleife klappt es nicht." beschreiben das Problem irgendwie nicht wirklich - klappt denn nur die Ausgabe nicht oder werden auch andere Opcodes/Argumente als "mov" gefunden?

Zum Zählen kann man im übrigen auch Counter von collections nehmen - die Einträge sind dann auch einfacher zu sortieren:
Code:
>>> from collections import Counter
>>> c = Counter()
>>> for x in "abcd aaa bb c":
...   c[x] += 1
...
>>> c
Counter({'a': 4, ' ': 3, 'b': 3, 'c': 2, 'd': 1})
>>> c.most_common()
[('a', 4), (' ', 3), ('b', 3), ('c', 2), ('d', 1)]
>>>
 
Also mit folgendem :

PHP:
#For each of the segments:
for seg_ea in Segments(): 
   # For each of the defined elements
   for head in Heads(seg_ea, SegEnd(seg_ea)):

      # If it's an instruction
      if isCode(GetFlags(head)):
          # Get the mnemonic and increment the mnemonic 
          # count
          mnem = GetMnem(head)
          mnemonics[mnem] = mnemonics.get(mnem, 0)+1
# Sort the mnemonics by number of occurrences
sorted = map(lambda x:(x[1], x[0]), mnemonics.items() )
sorted.sort()
# Print the sorted list
for mnemonic, count in sorted: 
   DictionaryList=open("DictionaryList.txt","a") 
   DictionaryList.writelines(( (str(mnemonic),"\n",str(count)) ))
print("Fertig, DictionaryList gespeichert in DictionaryList.txt")

Bekomme ich alle Opcodes sortiert nach der Häufigkeit in der sie vorkommen, sowas in etwa :

PHP:
cpuid1
nop1
setnbe1
shld1
shrd1
xchg2
popf2
pushf2
setle4
jns4
rcr4

Aber ich möchte jetzt nur die Mov's bzw. halt je nach dem was ich suche ein anderen Befehl.Ich wollte das durch eine Abfrage machen dass wann ein Opcode %mov% ähnelt oder so etwas. Aber daran scheitere ich gerade. :)
Hoffe so wird mein Problem klarer :thumb_up:
 
Am einfachsten wäre dann wohl die Ergebnissliste zu filtern ;)
Bsp:
Code:
>>> pseudo_mnem = {'mov':3, 'movzx':2,'cpuid':1,'nop':4}
>>> mov_only = [(key,val) for key,val in pseudo_mnem.items() if "mov" in key.lower()]
>>> classic_sorted = sorted(mov_only,key = lambda tup: tup[1])
>>> classic_sorted
[('movzx', 2), ('mov', 3)]
>>> classic_sorted.reverse()
>>> classic_sorted
[('mov', 3), ('movzx', 2)]
>>>
"klassisch" sortiert man Listen mit Tupeln, indem man "sorted" z.B lambda Ausdruck übergibt oder "item_getter" nutzt:
HowTo/Sorting - PythonInfo Wiki
 
Am einfachsten wäre dann wohl die Ergebnissliste zu filtern ;)
Bsp:
Code:
>>> pseudo_mnem = {'mov':3, 'movzx':2,'cpuid':1,'nop':4}
>>> mov_only = [(key,val) for key,val in pseudo_mnem.items() if "mov" in key.lower()]
>>> classic_sorted = sorted(mov_only,key = lambda tup: tup[1])
>>> classic_sorted
[('movzx', 2), ('mov', 3)]
>>> classic_sorted.reverse()
>>> classic_sorted
[('mov', 3), ('movzx', 2)]
>>>
"klassisch" sortiert man Listen mit Tupeln, indem man "sorted" z.B lambda Ausdruck übergibt oder "item_getter" nutzt:
HowTo/Sorting - PythonInfo Wiki

Hmm vielen Dank erstmal für deine Antwort aber ich kann das grad nicht so nachvollziehen geschweige denn in mein Code einbaun :S
 
Hmm vielen Dank erstmal für deine Antwort aber ich kann das grad nicht so nachvollziehen geschweige denn in mein Code einbaun :S
Hm, das waren "Livebeispiele" aus der Pythonkonsole. Damit die laufen, muss man nur die >>> entfernen ;)

Zu Deinem Problem (bezogen auf das erste Posting):
Code:
[COLOR=#000000][COLOR=#0000bb]mnemonics[/COLOR][COLOR=#007700][[/COLOR][COLOR=#0000bb]mnem[/COLOR][COLOR=#007700]][/COLOR][/COLOR]
1) globale Variablen sind böse - ich tippe stark darauf, dass mnemonics nicht vor dem Gebrauch "genullt"/geleert wird und daher nach dem Durchgang auch die alten Einträge vorhanden sind.
also ganz am Anfang (vor den Schleifen) des Codes im ersten Posting mal einen
Code:
mnemonics = {}
einsetzen.
oder gleich das ganze in eine Funktion auslagern:
Code:
def get_my_mnem():
  my_mnems = {}
  [COLOR=#000000][COLOR=#ff9900]#For each of the segments: 
[/COLOR][COLOR=#007700]  for [/COLOR][COLOR=#0000bb]seg_ea in Segments[/COLOR][COLOR=#007700]():  
   [/COLOR][COLOR=#ff9900]# For each of the defined elements [/COLOR][/COLOR]
  ... (mnemonics durch my_mnems ersetzen, am Ende Ergebnissliste zurückgeben)
2) mein Beispielcode war auf Dein zweites Posting bezogen:

Code:
mnemonics = {}
[COLOR=#000000][COLOR=#ff9900]#For each of the segments: 
[/COLOR][COLOR=#007700]for [/COLOR][COLOR=#0000bb]seg_ea in Segments[/COLOR][COLOR=#007700]():  
   [/COLOR][COLOR=#ff9900]# For each of the defined elements 
   [/COLOR][COLOR=#007700]for [/COLOR][COLOR=#0000bb]head in Heads[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]seg_ea[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]SegEnd[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]seg_ea[/COLOR][COLOR=#007700])): 
 
      [/COLOR][COLOR=#ff9900]# If it's an instruction 
      [/COLOR][COLOR=#007700]if [/COLOR][COLOR=#0000bb]isCode[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]GetFlags[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]head[/COLOR][COLOR=#007700])): 
          [/COLOR][COLOR=#ff9900]# Get the mnemonic and increment the mnemonic  
          # count 
          [/COLOR][COLOR=#0000bb]mnem [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]GetMnem[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]head[/COLOR][COLOR=#007700]) 
          [/COLOR][COLOR=#0000bb]mnemonics[/COLOR][COLOR=#007700][[/COLOR][COLOR=#0000bb]mnem[/COLOR][COLOR=#007700]] = [/COLOR][COLOR=#0000bb]mnemonics[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000bb]get[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]mnem[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]0[/COLOR][COLOR=#007700])+[/COLOR][COLOR=#0000bb]1 [/COLOR][/COLOR]
ich gehe davon aus, dass mnemonics dann alle Statistiken enhält und Du nun nur bestimmte davon ausgeben möchtest.
Man kann nun das Ergebniss einfach filtern:
Code:
mov_only = [(key,val) for key,val in mnemonics.items() if "mov" in key.lower()]
das ist eine List-comprehension, ist relativ häufig in Python anzutreffen.
List comprehension - Wikipedia, the free encyclopedia
vereinfacht gesagt handelt es sich in diesem Fall (List-Comprehensions sind deutlich mächtiger und nicht nur für Tippfaule Leute ;) ) um einen Ersatz für
Code:
mov_only = []
for key,val in mnemonics.items():
  if "mov" in key.lower():
    mov_only.append((key,val))
die nächste Zeile:
Code:
classic_sorted = sorted(mov_only,key = lambda tup: tup[1])
erzeugt dann die (wie gewünscht?) sortierte Liste.
man kann auch
Code:
classic_sorted = sorted(mov_only,key = lambda tup: tup[1], sorted=True)
schreiben, wenn man absteigende Sortierung wünscht.

PS: "sorted" ist eigentlich eine "built-in" Funktion in Python.
 
Zurück
Oben