AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Nachträglich Code in EXe einbauen

Ein Thema von Luckie · begonnen am 22. Sep 2007 · letzter Beitrag vom 23. Sep 2007
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Nachträglich Code in EXe einbauen

  Alt 22. Sep 2007, 20:59
Ich habe folgendes Programm (siehe Anhang) gerade hier im Forum gefunden. Meine Frage ist nun, wie funktioniert das? Das Prinzip ist klar: Er hängt Code an die Exe-Datei an und biegt den Einsprungspunkt um, dann wird sein Code ausgeführt und der origianl Einsprungspunkt angesprungen. Aber er muss ja irgendwie kompilierten, ausführbaren Code an die Exe hängen und das hab eich nicht verstanden, wie er das macht.
Angehängte Dateien
Dateityp: rar peencrypt_161.rar (190,6 KB, 45x aufgerufen)
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#2

Re: Nachträglich Code in EXe einbauen

  Alt 22. Sep 2007, 21:19
Der Code ist doch dabei? Sein Code wird ausgeführt und dnan springt er zum richtigen EntryPoint.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Nachträglich Code in EXe einbauen

  Alt 22. Sep 2007, 21:23
Ja, das ist klar. Aber es muss ja compilierter Code sein. Ich kann doch keine Funktionsaufrufe im Klartext in die Exe schreiben und dann erwarten, dass diese ausgeführt werden.

Ich sehe gerade, er hat ja kompilierten Code in der AttacheProc. Aber warum macht er das so umständlich:
Delphi-Quellcode:
type
  TGetProcAddress = function(hModule:HMODULE;lpProcName:LPCSTR):Pointer;stdcall;
  TLoadLibrary = function(lpLibFileName:PChar):HMODULE;stdcall;
  TFreeLibrary = function(hLibModule:HMODULE):BOOL;stdcall;
  TExitProcess = procedure(uExitCode:UINT);stdcall;
  TGetModuleHandle = function(lpModuleName:PChar):HMODULE;stdcall;
  TGetMessage = function(var lpMsg:TMsg;hWnd:HWND;wMsgFilterMin,wMsgFilterMax:UINT):BOOL;stdcall;
  // ...;
  // ...;
Und
Delphi-Quellcode:
type
  PAttachData=^TAttachData;
  TAttachData=packed record
    hLibUser32: HMODULE;
    hLibGDI32: HMODULE;
    _GetProcAddress: TGetProcAddress;
    _LoadLibrary: TLoadLibrary;
    _FreeLibrary: TFreeLibrary;
    _ExitProcess:    TExitProcess;
    _GetModuleHandle:    TGetModuleHandle;
    // ...;
    // ...;
    szLibUser32:    array[0..6] of Char; //   "user32"
    szLibGDI32:       array[0..5] of Char; //   "gdi32"

    szLoadLibrary:    array[0..12] of Char; //   "LoadLibraryA"
    szFreeLibrary:    array[0..11] of Char; //   "FreeLibrary"
    szExitProcess:    array[0..11] of Char; //   "ExitProcess"
    szGetModuleHandle: array[0..16] of Char; //   "GetModuleHandleA"
    szlstrlen: array[0..8] of Char; // "lstrlenA"

    szGetMessage:    array[0..11] of Char; //   "GetMessageA"
    szTranslateMessage: array[0..16] of Char; //   "TranslateMessage"
    szDispatchMessage: array[0..16] of Char; //   "DispatchMessageA"
Könnte man nicht einfach eine Exe nehmen und diese an die original Exe hängen, den EntryPoint umbiegen? Allerdings wie ruft man dann den original EntryPoint auf?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Nachträglich Code in EXe einbauen

  Alt 23. Sep 2007, 10:18
Zitat von Luckie:
Könnte man nicht einfach eine Exe nehmen und diese an die original Exe hängen, den EntryPoint umbiegen? Allerdings wie ruft man dann den original EntryPoint auf?
Nein, das fängt ja indem Moment an, wenn du den Code in die andere Exe einfügen willst. Da musst du die Exe ja neu in Code-, Data-, Import-, und ggf. noch weitere Sections unterteilen und diese dann clever einbauen. Eine Exe besteht ja nicht nur aus Code und Einsprungpunkt

Edit:
Am einfachsten bastelst du alles in ein Record:
-Platz für Pointer zu WIN-API-funktionen
-Platz für daten (die kurzen char-arrays)
-Platz für eigene compilierte Funktionen (lange char-arrays)
Dadurch kannst du über Die Refrenz des Records alle Daten und Funktionen bequem erreichen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
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
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

Re: Nachträglich Code in EXe einbauen

  Alt 23. Sep 2007, 14:22
Ist es auf diese Weise eigentlich auch möglich die Resourcen Section zu verschlüsseln?
  Mit Zitat antworten Zitat
gabneo

Registriert seit: 15. Okt 2006
Ort: Deutsche Toskana :)
93 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: Nachträglich Code in EXe einbauen

  Alt 23. Sep 2007, 14:31
Hi,
aufbauend auf Zacherls frage: Wenn man die Ressourcen so verschlüsseln könnte/kann dann würden Sie ja auch nicht mehr [Edit]so einfach zumindest[/Edit] Extrahiert werden können, oder?
Das wäre echt geil!
greez
gabneo

PS:
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Nachträglich Code in EXe einbauen

  Alt 23. Sep 2007, 14:47
Dsa heißt also seine Methode ist doch, obwohl es anders anmutet die einfachere. Hm, OK, ich glaube das wird mich dann wohl einige Tage kosten, seinen Code durchzuarbeiten und zu verstehen.

Es geht mir nicht darum die Exe zu packen oder zu verschlüsseln. Es geht mir nur darum rauszufinden,w ei so etwas funktionieren könnte. Allerdings so ganz ohne ist das natürlich nicht, den früher haben die Viren wahrscheinlich nichts anderes gemacht, wenn sie andere ausführbare Dateien infiziert haben.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

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

Re: Nachträglich Code in EXe einbauen

  Alt 23. Sep 2007, 17:04
Also das Umleiten an sich ist super simpel, im Prinzip nichts anderes als bei den WindowProcs wo Du Dir den Pointer holst, nen eigenen Wert reinschreibst, Dein Ding machst und am Ende die alte Proc aufrufst. Trickreich wirds erst wenn Dein Code halt Systemfunktionen aufrufen will. Dafür gibts mehrere Möglichkeiten:

a) Dein Code macht das alles zu Fuss (hat seine eigene Importtable die beim Start erstmal gefüllt wird)
b) Dein Exepatcher untersucht die Imports der Zielexe und benutzt die vorhandene Importtable für seinen eigenen Code ebenfalls. Falls der eigene Code APIs braucht die noch nicht in der Importtable stehen, lässt sich diese auch erweitern.

a) klingt schon nach viel Aufwand, ist aber noch wesentlich einfacher als b) zu programmieren wenn man nicht jeden Tag in den Innereien des PE-Formates rumwühlt *g*

Dein Exepatcher muss dann nur noch den Entrypoint (EP) aus dem PE-Header auslesen, den Wert durch den Einsprungspunkt des eigenen Codes ersetzen und am Ende des eigenen Codes per JMP an den EP springen. Sowas in Delphi zu programmieren wäre mir persönlich allerdings zu umständlich, meine kleinen Patcher hab ich bisher immer direkt in Assembler gestrickt (Und eh jetzt wieder jemand was von Cracker schreit, es handelte sich bei den Dingern um ganz legale Programme die im Zuge meiner damaligen Entwicklertätigkeit notwendig wurden.)
"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
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Nachträglich Code in EXe einbauen

  Alt 23. Sep 2007, 17:07
Falls du noch ein anderes (unübersichtliches) CodeBeispiel brauchst :

DP
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz