Patchen ?

11/04/2008 23:54 wurstbrot123#1
da manche Leute solche sachen falsch verstehen und blöde vorurteile fällen bitte ich einen Mod diesen Thread zu löschen =)
ty
11/07/2008 01:52 scbiz#2
Ich habe vor einiger Zeit einen kleinen Battlefield 2 Memory Hack geschrieben. Falls du möchtest, dass ich ihn dir gebe, kann ich das tun. Das mache ich aber nur via PN. Hier ein kleiner Snippet:
Code:
BYTE bNoSkyOff1, bNoSkyOff2;

void NoSky(bool a1)
{
	DWORD dwBytesRead, dwFirst;
	BYTE bNoSkyOn = 0;

	if(a1 == true)
	{
		ReadProcessMemory(CurrentProc, (void*) (dwRendBase + 0x239970), &dwFirst, sizeof(dwFirst), &dwBytesRead);
		ReadProcessMemory(CurrentProc, (void*) (dwFirst + 0x6B2), &bNoSkyOff1, sizeof(bNoSkyOff1), &dwBytesRead);
		ReadProcessMemory(CurrentProc, (void*) (dwFirst + 0x6B3), &bNoSkyOff2, sizeof(bNoSkyOff2), &dwBytesRead);

		WriteProcessMemory(CurrentProc, (void*) (dwFirst + 0x6B2), &bNoSkyOn, sizeof(bNoSkyOn), &dwBytesRead);
		WriteProcessMemory(CurrentProc, (void*) (dwFirst + 0x6B3), &bNoSkyOn, sizeof(bNoSkyOn), &dwBytesRead);
	}
	else
	{
		ReadProcessMemory(CurrentProc, (void*) (dwRendBase + 0x239970), &dwFirst, sizeof(dwFirst), &dwBytesRead);

		WriteProcessMemory(CurrentProc, (void*) (dwFirst + 0x6B2), &bNoSkyOff1, sizeof(bNoSkyOff1), &dwBytesRead);
		WriteProcessMemory(CurrentProc, (void*) (dwFirst + 0x6B3), &bNoSkyOff2, sizeof(bNoSkyOff2), &dwBytesRead);
	}
}
Wie du siehst, benutzt man zum "Patchen" die Funktionen [Only registered and activated users can see links. Click Here To Register...] und [Only registered and activated users can see links. Click Here To Register...]. Und nun höre auf herumzuwhinen, weil du kein Mod wirst...
11/07/2008 05:08 wurstbrot123#3
Quote:
Originally Posted by nop0x90 View Post
Ich habe vor einiger Zeit einen kleinen Battlefield 2 Memory Hack geschrieben. Falls du möchtest, dass ich ihn dir gebe, kann ich das tun. Das mache ich aber nur via PN. Hier ein kleiner Snippet:
Code:
BYTE bNoSkyOff1, bNoSkyOff2;

void NoSky(bool a1)
{
	DWORD dwBytesRead, dwFirst;
	BYTE bNoSkyOn = 0;

	if(a1 == true)
	{
		ReadProcessMemory(CurrentProc, (void*) (dwRendBase + 0x239970), &dwFirst, sizeof(dwFirst), &dwBytesRead);
		ReadProcessMemory(CurrentProc, (void*) (dwFirst + 0x6B2), &bNoSkyOff1, sizeof(bNoSkyOff1), &dwBytesRead);
		ReadProcessMemory(CurrentProc, (void*) (dwFirst + 0x6B3), &bNoSkyOff2, sizeof(bNoSkyOff2), &dwBytesRead);

		WriteProcessMemory(CurrentProc, (void*) (dwFirst + 0x6B2), &bNoSkyOn, sizeof(bNoSkyOn), &dwBytesRead);
		WriteProcessMemory(CurrentProc, (void*) (dwFirst + 0x6B3), &bNoSkyOn, sizeof(bNoSkyOn), &dwBytesRead);
	}
	else
	{
		ReadProcessMemory(CurrentProc, (void*) (dwRendBase + 0x239970), &dwFirst, sizeof(dwFirst), &dwBytesRead);

		WriteProcessMemory(CurrentProc, (void*) (dwFirst + 0x6B2), &bNoSkyOff1, sizeof(bNoSkyOff1), &dwBytesRead);
		WriteProcessMemory(CurrentProc, (void*) (dwFirst + 0x6B3), &bNoSkyOff2, sizeof(bNoSkyOff2), &dwBytesRead);
	}
}
Wie du siehst, benutzt man zum "Patchen" die Funktionen [Only registered and activated users can see links. Click Here To Register...] und [Only registered and activated users can see links. Click Here To Register...]. Und nun höre auf herumzuwhinen, weil du kein Mod wirst...



Du hast da was falsch verstanden,
ich meine Befehle die man in olly sieht per C++
zu Patchen bzw zu Cracken nicht einfaches verändern
von werten bei einer Adresse.
Wieso musst du eigentlich immer solche
dummen Kommentare abgeben und so auf schlau tun ?
ich habs dir schon im anderen Post gesagt das ich
das was du gepostet hast NICHT wissen wollte.
Aber glaube langsam du sammelst hier nur Posts...
11/07/2008 15:06 scbiz#4
Aufgrund der miesen Beschreibung des Problems, weiß ich nicht, was du möchtest. :(
11/07/2008 15:59 zeraaaaaa#5
Quote:
Originally Posted by nop0x90 View Post
Aufgrund der miesen Beschreibung des Problems, weiß ich nicht, was du möchtest. :(
Mh. Dein Post war eigentlich die Antwort auf seine Frage.
Ich glaube er verkraftet die Kritik auf die Bewerbung einfach nicht :/. Naja, Ich hätte sowieso nur auf die MSDN verwiesen..
11/07/2008 19:36 wurstbrot123#6
Quote:
Originally Posted by zeraaaaaa View Post
Mh. Dein Post war eigentlich die Antwort auf seine Frage.
Ich glaube er verkraftet die Kritik auf die Bewerbung einfach nicht :/. Naja, Ich hätte sowieso nur auf die MSDN verwiesen..
Nein ebend nicht.
er zeigt mir wie man werte ändert...........
Leute ich bitte euch nicht so ein Unsinn zu Posten wenn ihr nicht wisst was ich mit meinem Post meine.
Was ich meine ist in etwa Reversing mit c++ wenn man die Adressen
mit dem asm Code den man ändern will schon kennt
hoffe ihr versteht das jetzt auch.
11/07/2008 21:26 link#7
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 ;-)