Einzelnen Beitrag anzeigen

Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Nachträglich Code in EXe einbauen

  Alt 23. Sep 2007, 13:32
Natürlich kann man ("Rucksackverfahren") den EP einfach auf eigenen Code umbiegen, in der Sectiontable legt man dazu einfach eine zusätzliche Section an mit passenden Accessflags (read/write/executable/usw.) und schreibt da seinen Code rein. Der grosse Knackpunkt dabei ist aber: Allein dadurch wird die Exe ja kein bissl sicherer.

Also geht man hin und verschlüsselt Teile der Exe... Uh-oh. In dem Moment wo Du Code verschlüsselst, musst Du mehr oder weniger zwangsläufig auch API-Aufrufe verschlüsseln. Und da tut sich nun das eigentliche Problem auf: Im Normalfall gibts in der Exe eine Tabelle in der die Adressen von Systemfunktionen stehen, die aus user32.dll, kernel32.dll usw. usw. kommen. Beim Laden einer Exe durch das Betriebssystem werden hier die symbolischen Namen ("GetProcAddressA", "LoadLibraryA" und unzählige andere) durch die aktuell für das jeweilige Windows gültigen Adressen ergänzt, das Programm holt sich danach nicht mehr jedes Mal mühsam über GetProcAddress eine API-Einsprungsadresse sondern springt über eine Sprungtabelle direkt dorthin, diese Sprungtabelle wird ja vom BS beim Laden gefüllt und sieht recht häufig unterschiedlich aus (kleiner Exkurs: Genau an dieser Stelle crashen dann schlechte Cracks *ggg* weil Adressen hardgecoded in der Exetabelle abgelegt wurden die nicht zum momentanen OS passen).

Ein weiteres Problem sind die Fixups. Eine Exe wird zwar seit ewigen Zeiten eigentlich immer an die gleiche Adresse (0x00400000) geladen, prinzipiell könnte eine Exe aber ebenso wie eine DLL auch an anderen Adressen abgelegt werden. Damit die absoluten Sprünge im Code trotzdem funktionieren, gibts eine weitere Tabelle die vom Betriebssystem beim Laden der Exe ausgewertet wird und Offsets enthält - ungefähr so wie "an der Adresse x muss Startadresse der Exe plus y als Wert eingetragen werden". Wenn ich jetzt meine Exe verschlüssele ist ja noch alles in Ordnung, aber wenn ich nach dem Laden der Exe durch die Fixups des Betriebssystems auf einmal andere Werte in der Exe stehen habe, geht die Entschlüsselung an der Stelle schief und das Programm schmiert im besten Falle "problemlos" ab

Exepacker haben durchaus die gleichen Probleme... Die Lösung dafür heisst: Originaltabellen irgendwo in Sicherheit bringen und im PE-Header auf "Null" stellen damit das Betriebssystem die Exe nicht kaputtmacht beim Laden. Danach muss dann der Entpacker/Entschlüssler alle diese Schritte die das BS sonst macht in Eigenregie durchführen. Danach ist die Exe dann (hoffentlich) wieder lauffähig
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat