.dll zu HEX

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
Benutzeravatar
Baconman
User
Beiträge: 20
Registriert: Mittwoch 24. März 2010, 22:42
Kontaktdaten:

Aloha!

Ich habe folgendes Problem und zwar möchte ich mir den Inhalt einer DLL im Hexa-decimal Format ansehen.
Was ich bis jetzt habe:

Code: Alles auswählen

datei = open('Eine.dll', 'rb')
try:
    byte = datei.read(1)
    i = 0 ## Damit zum Testen nicht die ganze Datei gelesen wird.
    while byte != '' and i <= 10:
        byte = datei.read(1)
        i = i + 1
finally:
    datei.close()
Soweit so gut. Ich kriege es nur nicht hin die gelesenen Daten als Hex-Code anzuzeigen. Habe schon mit struct etwas rum gespielt, bin aber zu keinem Ergebnis gekommen.
Weis einer von euch Rat?

Grüße, Baconman
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Wie wäre es per ord(s) den numerischen Wert jedes Bytes herauszufinden und mit hex(n) (bzw. schöner String-Formatierung) diesen hexadezimal darzustellen?

Bzw. ein Modul wie binascii zu nutzen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dateien solltest Du mit dem ``with open(...) as handler``-Idiom öffnen. Zudem sehe ich hier nicht den Vorteil einer ``while``-Schleife. Wieso iterierst Du nicht einfach über die Bytes?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Baconman
User
Beiträge: 20
Registriert: Mittwoch 24. März 2010, 22:42
Kontaktdaten:

Okay, danke für die Tipps, das klappt jetzt soweit.

Mein nächstes Problem ist, das ich gerne die Adresse der jeweiligen Bytes hätte. Also die wirkliche Adresse im Speicher.
Mir stellen sich dabei 2 Fragen:
Muss die DLL dafür von einem Programm "geladen" werden?
Wie komme ich an die Adresse? In Python scheint es ja keine Zeiger zu geben und id() gibt wohl irgendeine andere Adresse als die aus dem Speicher aus.

Danke für eure Hilfe schon mal.

Baconman
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Vielleicht solltest du erstmal erklären, was du eigentlich genau vor hast. Willst du nur an den Dateiinhalt der DLL, möchtest du die DLL laden und darin verwendete Funktionen verwenden oder möchtest du auf den Speicherbereich einer geladenen DLL zugreifen? Wenn das klar ist, dann kann man dir etwas gezielter helfen.

Sebastian
Das Leben ist wie ein Tennisball.
BlackJack

@Baconman: Was ist für Dich „die Adresse”? Kann es sein, dass Du einfach nur den Versatz vom Dateianfang haben möchtest? Ansonsten ist das sehr schwer zu beantworten ohne sich tiefergehend mit dem DLL-Dateiformat auseinander zu setzen. Allgemein kann man dann für Teile der Datei relative Speicheradressen ermitteln, aber auch nicht für jedes Byte, denn einige davon sind Teil von Metainformationen die entweder gar nicht, oder nur temporär in den Speicher geladen werden.
Benutzeravatar
Baconman
User
Beiträge: 20
Registriert: Mittwoch 24. März 2010, 22:42
Kontaktdaten:

Ich möchte findjmp.exe in Python nachprogrammieren.

Meine erste Idee war jetzt halt jedes Byte einzeln inklusive seiner Adresse zu laden und in der Tupel-Liste dann nach dem(n) gesuchten paar(en) zu suchen.

Ist das mit Python machbar? Kann es sein das, das nur bei System-Dlls möglich ist? Weil diese ja von diversen Anwendungen geladen werden.

Gruß, Baconman
BlackJack

@Baconman: Das ist mit Python ganz sicher machbar, aber die Frage ist ob das für *Dich* machbar ist. Man muss die DLL anscheinend tatsächlich „verstehen”, also wissen wie das Dateiformat aufgebaut ist, wie man erkennt welche Daten darin Code sind. Zusätzlich auch noch wie Maschinencode für Intelprozessoren aufgebaut ist und wie Register in den Befehlen kodiert sind.
Benutzeravatar
Baconman
User
Beiträge: 20
Registriert: Mittwoch 24. März 2010, 22:42
Kontaktdaten:

Eigentlich ist das einzige Problem was ich habe, dass ich die Adresse von bestimmten HEX-Werten brauche. Mit Adresse meine ich die Adresse im RAM. Mir würde auch eine Beschränkung auf einpaar Kernel-DLLs reichen, davon werden ja schon viele beim Systemstart geladen und außerdem sind sie statische DLLs.

Obwohl ich es weis, ist es nicht nötig zu wissen welche Daten darin "Code" sind, wie du es nennst. Ich möchte nur die Adressen von Assamblerbefehlen, wie jmp esp, oder call esp haben. Diese haben ja jeweils eine bestimmte Hex-Codierung, wie z.B. /xff/xe4 = jmp esp. Das heißt ich brauche die Adresse von diesem ganz bestimmten /xff auf das dann /xe4 folgt. Deswegen auch das laden in Hex.

:)

Baconman
BlackJack

@Baconman: Wenn Du weisst welche Bytes in einer DLL Maschinencode sind — was ich nach Deinem bisherigen auftreten bezweifle — dann müsstest Du den Aufbau von DLLs ja kennen, und auch wissen wo und wie die (relativen!?) Adressen kodiert sind.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Klingt nach statischer Analyse. Evtl. hilft dir ja dieses Stichwort weiter. Also ich habe sofort ein interessante Präsentation zu gefunden.

edit: Die Seite auf die du verlinkt hast, sieht ja sehr vertrauenswürdig aus :mrgreen:
Benutzeravatar
Baconman
User
Beiträge: 20
Registriert: Mittwoch 24. März 2010, 22:42
Kontaktdaten:

Okay, ich guck mal. Danke.

Zu der Seite: Keine Ahnung, hab mir die nicht weiter angeguckt. Hab nur findjmp.exe gegoogelt. Die Exe hab ich schon ewig, keine Ahnung wo ich die damals runter geladen hab.
Antworten