Ich hatte zwar eigentlich vor, zum Trotz keine Posts mehr zu verfassen, aber der Richtigstellung zuliebe werde ich diesen Thread jetzt dennoch kommentieren:
Desweiteren hatte ich nop0x90 zwar schon darauf hingewiesen, dass er mangels Kenntnis die Frage fehlinterpretiert hat, und habe auch versucht, ihm zu erkären, wie es richtig funktioniert, aber irgendwie schien er davon unbeeindruckt und hat nicht einmal einen Ansatz in sein altes Posting hinein editiert bzw. in sein Letzteres aufgenommen.
Ungeachtet dessen folgt nun meine Laienbeantwortung, die durchaus falsch [!] sein kann:
Die Sektion, die den Programmcode enthält, ist im PE-Header als ausführbar und zusätzlich schreibgeschützt definiert, was bedeutet, dass du erst die nötigen Rechte erhalten musst, um Zugriff auf einen spezifischen Speicherblock zu haben.
Jene erhälst du z.B. durch die WinAPI-Funktion
[Only registered and activated users can see links. Click Here To Register...].
Der Rest ist dann so, wie du es wahrscheinlich gewohnt bist.
Da der Code statisch geladen wird, ist es so ähnlich, wie, als wenn du eine statische Adresse hättest, die auf einen Speicherblock zeigt, der als DWORD-Variable benutzt wird.
Du musst halt nur beachten, dass du die Opcodes, mit welchen du die alten überschreiben willst, in ein BYTE-Array packst, da, wenn du es nicht tun würdest, die Speicherordnung, also Little Endian, in Kraft treten würde.
Hier noch ein abschließender Beispielcode meiner bescheidenen Ausführung :x
In C:
Code:
BOOL Poke(HANDLE hProc, DWORD dwAddr, void *lpWrite, DWORD dwCount) {
BOOL bWPM;
DWORD dwOld, dwWritten;
if(hProc) {
if(VirtualProtectEx(hProc, (LPVOID)dwAddr, dwCount, PAGE_READWRITE, &dwOld)) {
bWPM = WriteProcessMemory(hProc, (LPVOID)dwAddr, lpWrite, dwCount, &dwWritten);
VirtualProtectEx(hProc, (LPVOID)dwAddr, dwCount, dwOld, &dwOld);
}
}
return (bWPM & (dwWritten == dwCount));
}
In Drexx-Masm:
Code:
Poke proc hProc:DWORD, dwAddr:DWORD, lpWrite:DWORD, dwCount:DWORD
add esp, -0Ch
mov eax, [hProc]
test eax, eax
jz .fail
invoke VirtualProtectEx, [hProc], [dwAddr], [dwCount], PAGE_READWRITE, [ebp - 4]
test eax, eax
jz .fail
invoke WriteProcessMemory, [hProc], [dwAddr], [lpWrite], [dwCount], [ebp - 8]
test eax, eax
jz .fail
push eax
lea eax, [ebp - 4]
invoke VirtualProtectEx, [hProc], [dwAddr], [dwCount], [eax], eax
pop eax
jmp .end
.fail:
xor eax, eax
.end:
ret
Poke endp
PS: [Kleine Anmerkung, um mich höher zu stufen :P]
Ich wusste von Anfang an, was du meintest, auch ohne deinen letzten Post, wobei der nun nicht allzu stark erläuternd ist, gelesen zu haben ;-)
PPS: Falls etwas unklar ist, nachfragen.
Falls ich Müll erzählt haben sollte, darauf hinweisen, thx.
Ich hoffe, dass dies nun deine eigentümliche Frage beantwortet ;-)