Follow along with the video below to see how to install our site as a web app on your home screen.
Anmerkung: This feature may not be available in some browsers.
Die CPU "liest" nichts ein und überlegt es sich auch nicht, dass es nur Funktionen sind - nach dem WindowsPE Loader die Exe in den Speicher geladen hat, ließt er den EntryPoint Wert aus und setzt den EIP Register auf diesen Wert. Damit beginnt die Ausführung des Codes auch erst an dieser Stelle.Das bedeutet, dass wenn ich den EP auf meinen angehängten Code setze, die CPU über alle Sections hinwegliest wie wenn es nur Funktionen wären, bis sie zu meinem angehängten Code mit dem neuen EP gelangt, und dann mit der Ausführung anfängt, richtig??
Ich glaube du hast das Prinzip nicht verstanden. Du siehst das ganze noch viel zu sehr als Hochsprache an. ASM ist vom Grundsatz her viel simpler aufgebaut, als z.b. C++. Das macht dann einfach den Code viel komplexer. Es gibt keine eigentlichen Funktionen...Ah..jetzt hab ichs verstanden...
D.h., dass die "Befehle" vor dem EP nur beispielsweise Funktionen sind, welche noch nichts ausführen ,da sie erst aufgerufen werden müssen (was dann im Codeabschnitt nach dem EP passiert, oder?), oder?
Das bedeutet, dass wenn ich den EP auf meinen angehängten Code setze, die CPU über alle Sections hinwegliest wie wenn es nur Funktionen wären, bis sie zu meinem angehängten Code mit dem neuen EP gelangt, und dann mit der Ausführung anfängt, richtig??
Grüße
Gapa
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
.data
MsgBoxCaption db "Wirt",0
MsgBoxText db "Ich bin der Wirt",0
.code
start:
invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, NULL
invoke ExitProcess, NULL
end start
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
.data
MsgBoxCaption db "Anhaengsel",0
MsgBoxText db "Ich bin das Anhaengsel",0
.code
start:
invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, NULL
invoke ExitProcess, NULL
end start
Ich hoffe du kannst wenigstens ein bisschen erkennen, dass ich Eigeninitiative zeige...Sorry, aber ich frag mich ernsthaft, ob du auch etwas anderes als die Forenbeiträge hier liest? Wie wäre es mit einem Asm-Buch ? Denn hier werden Sachen z.T zum 4 mal wiederholt und irgendwie habe ich immer mehr den Eindruck, dass du versuchst die ganzen Grundlagen hier aus den Postings zu herauszulesen. Das wird so nicht wirklich funktionieren.
Ja so ne PE-infection ist halt was anderes als 2 Dateien zusammenfuegen!Der Virus ist ja ne Millionen Zeilen lang.
<--- bevor du dich da vertust (und das tut sehr man schnell), würde ich einen PE-Editor (PE-Tools oder LordPE) nehmen - zumindest um eine "Gegenprobe" zu haben.Original von Gapa
Ich werde nun (so wie mein aktueller Wissensstand ist) in einzelnen Schritten erläutern, wie man 2 kompilierte EXE mit nur einem HexEditor zur Hilfe ineinander fügt
damit bekommst du nur die "virtual Size" der Sectionen heraus!9. Anhang.exe im HexEditor öffnen
10. Größe von Anhang.exe ermitteln:
- Section-Table auslesen
nicht vergessen, den Wert zu alignen:11. Wirt.exe modifizieren:
- SizeOfImage = SizeOfImage + Größe von Anhang.exe
Wenn die Linker unterschiedliche SectionAlignments verwendet haben (also vom Wirt und Anhang.exe) könnte man sonst Probleme bekommen.SizeOfImage
The size (in bytes) of the image, including all headers, as the image is loaded in memory. It must be a multiple of SectionAlignment.
also: wenn du SizeOfRawData == VirtualSize setzt, musst du auch vorher schauen, dass du die Bytes zu diesem Wert auffüllst. Denn SizeOfRawData kann durchaus kleiner/größer (in 99% kleiner) sein.- SizeOfRawData (letzte Section) = VirtualSize + Größe von Anhang.exe (gerundet, so dass Alignment im OptionalHeader durch den Wert teilbar ist)
nicht vergessen - dann muss deine "main" bzw. Codeanfang auch ganz am Anfang der Anhang.exe sein. Hat man in MASM/TASM/FASM "automatisch".- OEP = VirtualAdress (letzte Section) + Größe von Anhang.exe
jep, aber ohne die anderen zu überschreiben- Characteristics (letzte Section) auf executable setzen
wie erwähnt: wenn du mit Hexeditor kopieren willst, brauchst du auch die physicalische Größe.Anhang.exe
- VS aller Sections
erhälst du schon mal eine Exe mit nur einer Section.Sollte weniger Probleme geben (und weniger zu berechnen seine:\masm32\bin\ml /c /coff /nologo program.asm
E:\masm32\bin\Link /NOLOGO /SUBSYSTEM:WINDOWS /MERGE:.rdata=.text /MERGE:.data=.text /section:.text program.obj /section:.text,RWE
Andersrum. SizeOfRawData "richtet" sich nach FileAlignment Wert. FileAlignment besagt, dass die Größe ein Vielfaches von diesem Wert sein muss. Bsp:Mit "Alignment" sind schon die Rundungen gemeint, oder? Da gibt es ja so ein FileAlignment, welches ja immer ein Mehrfaches von SizeOfRawData ist, sprich: Man kann FileAlginment durch SizeOfRawData dividieren.
natürlich auf, die Erklärung warum hast du ja schon selbst gegebenMeine Frage hier ist nur: aufrunden oder abrunden??
VS ist die Größe der Section im Speicher. "Raw" ist die Größe in der Datei. Wenn VS>SizeOfRawData, wird die Differenz im Speicher mit 00 ausgefüllt. Wenn SizeOfRawData>VS, wird ein Teil der Daten "abgeschnitten" - also nicht geladen.Und was ich auch gelesen habe, ist, dass VS die orginale Größe des Codes ist, und SizeOfRawData die gerundete
d.h es kann physikalisch sogar 0 sein und der Speicher wird dann so zusagen erst beim laden der Exe reserviert.Zitat von pecoffv8.doc
VirtualSize
The total size of the section when loaded into memory. If this value is greater than SizeOfRawData, the section is zero-padded. This field is valid only for executable images and should be set to zero for object files.
Du bringst "virtuelle" und "physikalische" Werte durcheinander:Also hier noch einmal alle Werte, die modifiziert werden müssen:
SizeOfImage = SizeOfImage + alle SizeOfRawDatas der Sections von Anhang.exe
OEP = VA der letzten Section + alle SizeOfRawDatas der Sections von Anhang.exe
Letzte Section:
- VS = VS + alle VS der Sections von Anhang.exe (+ Aligning checken ??)
- SizeOfRawData = SizeOfRawData + alle SizeOfRawDatas der Sections von Anhang.exe (+ Aligning checken ??)
- Characterstics = 0xE0000020
Aufrunden.Also mir fehlt jetzt nur noch die Antwort auf die Frage mit dem Aligning checken:
- Was genau ist damit gemeint (runden - auf - ab) ?
- Bezieht sich das nur auf SizeOfImage
.386
.model flat,stdcall
.code
start:
MOV EAX, 00401000
JMP EAX
end start
00402EBB . FF15 14504000 CALL DWORD PTR DS:[<&kernel32.CreateFile>; \CreateFileA
CALL DWORD PTR DS:[405014]
386
.model flat,stdcall
.code
start:
push 0
push 0
push 0
push 0
call DWORD PTR [405014] <- oder welcher Wert das in der Wirt exe auch sein mag.
MOV EAX, 00401000
JMP EAX
end start
386
.model flat,stdcall
.code
start:
jmp code_
Message db "Hi",0
code_:
call delta
delta:
;Stackherrichten
pop ebp <--- nun in EBP die adresse von delta - label
mov eax,ebp
sub eax,(delta-Message)
push 0
push 0
push eax
push 0
call dword ptr [herausgefundene API adresse]
MOV EAX, 00401000
JMP EAX
end start
call delta
delta:
pop ebp <--- nun in EBP die adresse von delta - label
mov eax,ebp
sub eax,8
push 0
push 0
push eax
push 0
call dword ptr [herausgefundene API adresse]
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
.data
MsgBoxCaption db "Wirt",0
MsgBoxText db "Gut",0
.code
start:
invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, NULL
invoke ExitProcess, NULL
end start
.386
.model flat,stdcall
.code
start:
MOV EAX, 00401000
JMP EAX end start
Original von Gapa
Code:.386 .model flat,stdcall .code start: MOV EAX, 00401000 <--- hier fehlt ein h für Hexadezimal, er spring sonst zu 0x6xxirgendwas JMP EAX end start
Und hier die modifizierten Werte in Wirt.exe (so wie sie eig. sein sollten, aber so läuft das Programm nicht!!):
SizeOfImage : 00004007 <-- aufrunden auf den nächsten Wert =0x5000
FileAlignment ist der "Richtwert" - den sollte man nicht ändern!FileAlignment : 00000400 <-----muss ja mind. 400 sein, da die letzte Section ja nun 400 Bytes groß ist
in dem man die aktuelle ImageSize berechnet (bei dir z.b 0x4007) undSectionAlignment : 00001000 <---- wie soll das jemals mit SizeOfImage übereinstimmen??????
ok, ich hab mich verrechnetok ich habe es mal versucht, SizeOfImage auf 5000 aufzurunden