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