Autor Beitrag
ShadowCaster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 312



BeitragVerfasst: Mo 19.05.03 10:02 
Hi Leute, ich hab mal eine Frage,

seid längerem versuche ich die Dateien, die von so nem blöden virus bei mir zu Hause infiziert wurden (Das System ist mittlerweile zu 100% clean, nur ein paar infizierte Dateien hab ich "aufgehoben" *grins*) wieder zu cleanen.

Bei den Dateien handelt es sich um Exe-Dateien. Jetzt sieht das folgendermaßen aus. Eine Exe besteht aus einem DOS-Header und einem PE-Header. Jeder der beiden Header hat eine Checksumme. Die des alten Dos-Headers wird offenbar nicht über CRC16 oder 32 berechnet und die des neuen auch nicht. Also die des Dos-Headers ist ein WORD-Wert und die des PE-Headers ist DWORD. Mich würde interessieren wie ich die Checksummen der beiden Header berechne. zu dem Zeitpunkt der Checksummenberechnugn kann ich ja nicht wissen wie das Checksummenfeld selbst aussieht, also kann ich eigentlich die Checksumme nicht berechnen wenn dieses Feld mit dazu benutzt wird. Also welche Teile der exe werden zur Berechnung der Dos-Checksumme und der PE-Checksumme gebraucht? Welche Formel gilt zur berechnung? Die checksummenfelder können ja schlecht zum Zeitpunkt der Berechnung selbst verwendet werden. Wie mach ich das also? :cry:

bin für jede Hilfe dankbar. Wenn ich die Lösung hab, muss ich nurnoch den Entry-Point des Viruses ermitteln, der schneinbar in jeder Exe variabel irgendwo in den infizierten Code zu springen scheint. Wenn ich diesen Entrypunkt ermittelt hab, brauch ich nurnoch den Adresspunkt, der wieder an die ursprüngliche Stelle der Exe springt. Sofern ich den hab, kann ich den PE-Header rekonstruieren.
ShadowCaster Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 312



BeitragVerfasst: Mo 19.05.03 11:01 
Nachtrag:

Die Checkum des Dos-Exe-Headers wird wohl so berechnet, dass alle Word-Werte der Datei addiert werden. Dann werden sie abgeschnitten (auf 2 Byte Endgröße) und invertiert. Nur, woher soll ich vorher wissen wie große das WORD der Checksumme selbst ist? Wird das auch mit einberechnet? Gibt es da keinen Sourcecode für? Wie wird die PE-Checksumme berechnet? Ich brauch Antworten :-( Ich hab inzwischen über 30 Anfragen mit insgesamt 250 PC's die mit dem Virus infiziert sind und sämtliche kommerziellen Virenremover bauen mist und machen nurnoch mehr am System kaputt. dazu zählt auch Norton.
ShadowCaster Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 312



BeitragVerfasst: Mo 19.05.03 15:58 
Na schön, da hab ich Pech gehabt. Über 1000 Einträge bei Google abgeklappert. Wenn ich einen Assembler hätte, abgesehen vom Inlineassember von Delphi, dann könnte ich euch zu dem Thema jetzt 500 Computerviren mit Quelltext geben aber ich will doch nur wissen wie die beiden Checksummen in der Exe berechnet werden. Die erste Checksumme wird offenbar nicht immer benutzt, hab ich herausgefunden. Jedoch die des PE-Headers, wie berechne ich die? Ich will nicht 99$ für son blödes Tool ausgeben, was mir die Checksummen berechnet, aber die Formel nicht verrät. CRC 32 kann es nicht sein, weil der Algo ja nicht weiß, wie der DWORD-Wert der Exe, also die Checksumme später selbst ist und somit diesen nicht in die Erstellung des CRC-Schlüssels einbinden kann.
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Mo 19.05.03 16:17 
tolles thema, ich habe noch nicht so ganz verstande wie du den viers aus der Datei entferen willst jedoch den rest behalten willst.
könntes du mir das bitte etwas genau erklären ????
z.b. wie man diesen PH Header auslist ????

_________________
MFG
Michael Springwald, "kann kein englisch...."
ShadowCaster Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 312



BeitragVerfasst: Di 20.05.03 08:54 
Also wenn ich das Exeformat richtig verstanden habe:

Jede Exe ist in sogenannten Sektionen und einem Header aufgebaut (grob gesagt). In dem Header stehen allgemeine Informationen über die exe (z.B. größe einer Sektion, Linkerversion, auch die Checksumme der Exe).

Eine Win32-Exe hat zwei Header. Zum einen ist das der MZ-Header und der PE-Header.

Der MZ-Header beinhaltet Informationen für dos und Dos-Exefiles (16 Bit) haben früher (soviel ich weiß) nur diesen Header beinhaltet.

Im PE-Header steht der Detailaufbau einer Win32-Exe. Da stehen Jumpadressen drinnen, wie der Arbeitsspeicher reserviert wird, wie der Prozess vom Kernel verarbeitet wird.

In beiden Headern steht auch eine Checksumme, die dazu dient, damit der Kernel herausfindet, ob die Exe beschädigt wurde. Stellt euch vor, eine beschädigte Exe wird ausgeführt und anschließend stürzt Windows ab. Das wäre ja nicht schön ;)

Ich möchte eigentlich nurnoch die Checksumme des PE-Headers berechnen, weil ich den Lösungsweg für die andere (hoffentlich) mittlerweile hab.

Aufbau des MZ-Headers:
members.tripod.com/~...exe_file_header.html
Aufbau des PE-Headers:
vx.netlux.org/~vorgon/article1.htm

Achja, Nachtrag: hab jetzt rausgefunden, dass offenbar beide Checksummen nicht beachtet werden, wenn sie Null sind. Jedoch würd ich die schon gern berechnen. Die haben schon einen Sinn.

Nachtrag2: der Virus infiziert die Exe so, dass er den PE-Header verändert, eine neue ausführbare Sektion hinzufügt, sich in diese Sektion linkt und seinen Virencode ans Ende der Exe hängt. Im PE-Header steht die Beginnjumpadresse des Programms plötzlich auf die Jumpadresse des Virencodes ... Das heißt, der Virus wird vor dem Start der Exe ausgeführt.

Jeder bisherige Virenscanner entfernt den Virus nicht sauber und da ich den Virus entschlüsselt hab und den Assemblercode hab, und ihn gern entfernen möchte, hab ich mittlerweile schon 40 Anfragen mit über 250 PC's... Ich möcht ihn gern entfernen. Also naja ich denk, wenn ich das geschafft hab, kann ich den ganzen anderen Linkviren an den Kragen gehen und mal schauen, vielleicht werd ich bald noch mehr Virenentferner schreiben. Aber erstmal muss ich den Virus entfernen...(lernen)
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Di 20.05.03 14:02 
könntes du mal beispiele geben wie man diesen PH und MZ Header in Delphi auslesen kann und benutzen kann.... Das heißt also so ein Vieren scaner ist garnicht so schwer zu schreiben, oder doch ?
das heißt also man braucht nur die letze Sektion auslesen um an die addresse herranzukommen, und anschließen löscht man diese zeilen und fertig?

_________________
MFG
Michael Springwald, "kann kein englisch...."
ShadowCaster Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 312



BeitragVerfasst: Di 20.05.03 16:48 
ne, ganz so einfach ist es nicht... :? wäre schön wenn. Die Viren haben nur in der Regel ziemlich viele Jump-adressen. Sie jumpen mal in den infizierten Code, mal in die Exe, etc. Ich hab jetzt ne 267-seiten starke abhandlung übers Exe-format. Werds mir mal reinziehen. Und in assembler arbeite ich mich auch ein. Assembler ist gar nicht schlecht. Man kann viel beschleunigen und das effektiv erreichen, was man will.
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Di 20.05.03 17:12 
die links sind leider in englisch kennst du auch deutsche seiten die sowas haben ????
aber das thema interissiert mich ;)

_________________
MFG
Michael Springwald, "kann kein englisch...."
ShadowCaster Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 312



BeitragVerfasst: Mi 21.05.03 08:13 
Naja, ich werd wohl am WE vielleicht mal ein Exe-Tut schreiben. Arbeite mich nebenher in den Inlineassembler von Delphi ein.

So langsam blick ich das. Beide Checksummen werden ignoriert, sofern sie 0 sind. Den PE-Header des vom Virus infizierten Files kann ich auch wieder zu 70% rekonstruieren. Allerdings muss ich noch den ursprünglichen Entrypoint herausfinden. Hab den Virus gestern nochmal mit nem anderen Disassembler disassembliert und mir angeschaut (zumindest die Dll, die der Virus erstellt). Muss mal eine infizierte Exe durchgehen. Vielleicht kann ich die Entrypoints ermitteln und so ab diesen Entrypoints im Asm-Code die Jump-Adresse auf den ursprünglichen Code ermitteln. Im Prinzip müsste das gehen.

Also Assembler zu lernen macht echt fun und es scheint auch (zumindest bisher) garnicht so schwer zu sein. Ich hab zu Hause wie gesagte einige selbstextrahierende Exe-Dateien von Datensicherungen und die will ich wieder herstellen können. Naja, so wie ich das bisher sehe, muss ich nur den PE - Header rekonstruieren, die letzte Sektion aus der infizierten Exe entfernen und die Entrypoints zurücksetzen. Dann sollte die Exe wieder im ursprünglichen Modus laufen (so hoffe ich).

Also das mit der Checksum hat sich erledigt. Die brauch ich wohl nicht. Aber ich bin der Meinung wir könnten den Thread für interessierte offenhalten um Fragen gemeinsam zu beantworten ;)

Dennoch vielen Dank für die Hilfeversuche. Da muss ich wohl allein durch.
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Mi 21.05.03 14:07 
währe toll wenn du mal dein wissen über das EXE format in ein Tutorial schreiben könntes. währe echt klasse.

_________________
MFG
Michael Springwald, "kann kein englisch...."
ShadowCaster Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 312



BeitragVerfasst: Mi 21.05.03 14:11 
kein Problem. Das können wir ja dann hier reinstellen. Allerdings ist das Exe-Format nicht so einfach erklärbar. Allein über die Header kann man schon sehr viel schreiben. Wenn ich das mit Quellcode poste, muss ich nen Thread mit 5 - Seiten eröffnen. Also am Besten ich mach ein Thread mit Downloadlink. Zudem werd ich ein Exe-Header-Dumper heut abend programmiern.
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Mi 21.05.03 14:36 
was ist denn ein "Exe-Header-Dumper" ?
es gibt hier doch extra das forum Tutorials hier....

_________________
MFG
Michael Springwald, "kann kein englisch...."
ShadowCaster Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 312



BeitragVerfasst: Mi 21.05.03 14:41 
also ich hab ein sehr kompliziertes Buch über das Exe-Format was 267 Seiten groß ist (englisch)


Dump kommt aus dem Englischen und bedeutet soviel wie "Abbilden". In dem Fall heißt das. Die Exe-Datei wird Byte für Byte durchlaufen und die Header -werte werden rausgeholt und in einen Record zum Beispiel geschrieben. man holt sich mit einem Dumper den Exe-Header aus der Exe raus und das Programm zeigt das schön grafisch an :)

Ich werd mal sehen, dass ich den heute abend programmiert bekomm. Den brauch ich eh. Dann werd ich mal anfangen, die Exe-Header mit einigen Funktionen zu schreiben.
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Mi 21.05.03 15:33 
achso

_________________
MFG
Michael Springwald, "kann kein englisch...."
OldGrumpy
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 82



BeitragVerfasst: Sa 16.09.06 11:54 
Ist zwar schon Asbach, aber für die Nachwelt: Es gibt Tools, die für viele Exen den vermutlichen OEP (original entry point) anhand typischer "Startsequenzen" (also z.B. für einen bestimmten Compiler typische Anordnungen von Assemblerbefehlen) ermitteln können. Wenn noch irgendjemand Bedarf hat, such ich da mal was raus, das sind allerdings alles Werkzeuge, die vom Anwender ein bissl Ahnung erwarten :)
Zur Checksumme im PE- und MZ-Header:
- Checksumme wird nicht gecheckt wenn gleich Null.
- Exen mit falscher Checksumme stören Windows nicht (vielleicht ab Vista doch wieder)
- Treiber *müssen* im Header die korrekte Checksumme tragen sonst verweigert Windows das Laden des Treibers.
- Den korrekten Wert der Checksumme kann man mit der Funktion "MapFileAndChecksum" aus der imagehlp.dll ermitteln. Parameter usw. findet man in der MSDN. (google mit den Suchworten "MSDN" und "MapFileAndCheckSum" führt direkt zur entsprechenden Seite)
Den korrekten Wert dann einfach nur mit einem Hexeditor oder per Programm eintragen und fertig.
- Viele Exen haben im Header nur die Null stehen.
- Die Checksummen werden zur Compilezeit vom Linker eingetragen, das ist allerdings je nach Linker optional :)

So, wer noch Fragen hat, hebt jetzt die Hand ;)