[ASM] Access Violation

12/11/2014 23:26 Benhero#1
Hey da das alte Problem beseitigt ist und ich nicht denke das mir dort jemand weiter helfen würde.

Es gibt nun aber ein anderes Problem. Und dies Betrifft eine Zugriffsverletzung über ASM.

Wenn ich folgenden Code ausführe gibt es keine Probleme:
Code:
__asm
{
	mov eax, dword ptr ds : [aTime];
	mov dword ptr ds : [eax], 255;
}
WriteProcessMemory(cHandle, (LPVOID)aTimeSub, &stopTimer, sizeof(char), 0);
Wenn ich aber diesen Ausführe gibt es die Zugriffsverletzung:
Code:
__asm
{
	mov eax, dword ptr ds : [aTime];
	mov dword ptr ds : [eax], 255;
	mov eax, ds : [aTimeSub];
	mov byte ptr [eax], 0x00;
}
dabei wird an die Selbe stelle geschrieben wie über WriteProcessMemory().

Ich weiß das es andere möglichkeiten gibt. Ich möchte aber ASM benutzen.
Deswegen bitte ich euch mir wenn möglich einen weg über ASM zu zeigen oder wie ich Zugriffsverletzung umgehen kann :)

Vielen Dank.

Benhero
12/12/2014 08:12 Jeoni#2
Das solltest du weiter ausführen.
Nach "mov eax, ds : [aTimeSub];" steht der Wert von aTimeSub, also die Adresse, die auch in WPM benutzt werden würde, in eax. Das folgende "mov byte ptr [eax], 0x00;" sollte an die Adresse den Wert 0 schreiben (das gleiche würde auch WPM tun, sofern stopTimer eine char-Variable mit dem Wert 0 ist). Ich sehe da keinen Fehler, aber korrigier mich, wenn ich gerade einen Denkfehler mache.
Hab das mit folgendem Beispielcode auch nochmal überprüft:
Code:
	int x = 15; // repräsentiert das, was der TE verändern will
	int* xPtr = &x; // repräsentiert TE's aTimeSub

	__asm
	{
		mov eax, ds : [xPtr]; // adresse von x ist nun in eax
		mov dword ptr [eax], 22; // x = 22
	}

	std::cout << x; // Output: 22
Aus dem Thread geht nicht hervor, dass mit WPM versucht wurde den eigenen Prozess zu manipulieren. "cHandle" kann ja auch ein externer Prozess sein. In diesem Fall sollte ja klar sein, dass es nicht klappt. Ich gehe aber mal davon aus, dass man cHandle in der WPM-Zeile ohne weiteres mit GetCurrentProcess substituieren kann.
Funktioniert WPM denn? Im Falle eines Fehlers würde WPM ja nicht zum Crash führen, sondern einfach FALSE returnen und den LastError entsprechend setzen.
Mit freundlichen Grüßen
Jeoni
12/12/2014 14:45 Benhero#3
WPM Funktioniert. Und ja man könnte auch GetCurrentProcess() verwenden. (cHandle = currentHandle). Durch WMP wird der Wert auf 0 gesetzt. Ja "stopTimer" ist ein char wert.
In diesem Fall ein unsinged char

aTimeSub ist bei WMP wie auch bei der ASM anweißsung der Selbe. Es ist für mich ja möglich einen Wert über ASM zu schreiben. Diese Anweißung hier funktioniert ohne Absturz:
Code:
mov eax, dword ptr ds : [aTime];
mov dword ptr ds : [eax], 255;
ledeglich das Schreiben eines einzelnen Bytes über "mov byte ptr [eax], 0x00" verurascht den problem.
Bei dir ist es ja wieder ein DWORD.

Und nein. Du hast keinen Denk fehler. Ledeglich gibt es eine wie oben bereits geschrieben "Zugriffsverletzung beim Schreiben" auf die Adresse von aTImeSub.
Aber eben nur beim ASM versuch.

Ich hoffe ich habe alles aufgegriffen.. o.o

Grüße
12/12/2014 20:18 Padmak#4
Wenn ich nicht ganz falsch liege, musst du zuerst VirtualProtect ausführen, um die gewünschte Region auf beschreibbar zu ändern.
Das müsste deinen Fehler eigentlich beheben.

Padmak
12/12/2014 23:25 Benhero#5
Ahhh okay. Also z.B
[Only registered and activated users can see links. Click Here To Register...]
Hoffe es funktioniert :D danke @Padmak

Grüße
12/12/2014 23:37 +Yazzn#6
Denke ich auch. Kümmert sich WriteProcessMemory nicht automatisch um so Zeug?
12/13/2014 00:39 Benhero#7
Glaube ich schon. Da ich mit WPM keine probleme habe. Aber eben über ASM :D

Grüße
12/14/2014 02:42 +Yazzn#8
Hast du es jetzt ausprobiert? Funktioniert es?
12/14/2014 18:38 Benhero#9
Nein, habe ich aktuell noch nicht. :)
Arbeite gerade an einer Externen Version.

Werde die DLL aber bald weiter entwickeln.

Grüße