Pointer mit 2 Offsets Problem

10/08/2013 15:55 EasyFarm#1
Hi.
Ich habe einen 100% funktionierenden Pointer.
Es muss am Code liegen, dass das Spiel crasht.
Ich habe nähmlich bei einem 4 Offsetcode einfach die Zeilen gelöscht, wo die anderen 2 Offsets ausgelesen/gesetzt wurden.

Was ist nun an diesem Code falsch?

Code:
//////////////SPEED//////////////
#define BasePointer1 0x6C4F24
#define Points6 0x00000004
#define Points7 0x0000066e


DWORD val2 = 0;

bool State2 = false;   

void SetSpeedhack(){
	HANDLE hProc = OpenProcess(((0x000F0000L) | (0x00100000L) | 0xFFFF), 0xFFFFFF, (unsigned int)GetCurrentProcessId());

	DWORD wert1 = 0;
				RtlCopyMemory((LPVOID)((void*)(&wert1)), (PVOID*)((int*)((BasePointer1))), sizeof((PDWORD)(BasePointer1))); 
				if(wert1 > 0){
				wert1+= Points6;
				RtlCopyMemory((LPVOID)((void*)(&wert1)), (PVOID*)&(*(_Uint32t*)(wert1)), sizeof((PDWORD)(wert1)));
				wert1+= Points7;
				RtlCopyMemory((LPVOID)((void*)(&wert1)), (PVOID*)&(*(_Uint32t*)(wert1)), sizeof((PDWORD)(wert1)));
	
			
				
				DWORD val1 = 16666;

				memcpy((PVOID*)(*(int*)(&wert1)), (PWORD*)((void*)&(*(_Uint32t*)&val1)), 2);
				}
				
}

Wenn ich nun SetSpeedhack(); aufrufe crasht es.

Danke :)
10/08/2013 16:34 snow#2
Ist der Code in einer DLL? Wieso benutzt du OpenProcess, wenn du bereits im Speicherbereich bist?
Solltest du eine Konsolenanwendung dafür verwenden: GetCurrentProcessId gibt dir deine Prozess-ID, somit schreibst du dann im eigenen Speicher rum.

Gefühlt würde ich sagen, dass das ganze Casting erstmal einfach ungesund ist, da hat man ja gar keine Übersicht mehr.
Und: Du hast 2 Offsets entfernt? Dir ist klar, dass dann die falsche Adresse rauskommt?
10/08/2013 16:47 EasyFarm#3
Ok.
Wie ändere ch dann diesen Code hier, sodass nur 2 Offsets benutzt werden?
Er geht ja, und deswegen würde ich ihn gerne weiterbenutzen.

Code:
#define BasePointer 0x6EBE1C  
#define Points0 0x00000008  
#define Points1 0x000005dc
#define Points2 0x000002d8
#define Points3 0x00000000
#define Points4 0x0000018c

DWORD val = 0;

bool State = false;   

void punkte()    
{
    if(State)
    {
        DWORD wert = 0;
				
				HANDLE hProc = OpenProcess(((0x000F0000L) | (0x00100000L) | 0xFFFF), 0xFFFFFF, (unsigned int)GetCurrentProcessId());

				RtlCopyMemory((LPVOID)((void*)(&wert)), (PVOID*)((int*)((BasePointer))), sizeof((PDWORD)(BasePointer))); 
					if(wert > 0){
				RtlCopyMemory((LPVOID)((void*)(&wert)), (PVOID*)((int*)((BasePointer))), sizeof((PDWORD)(BasePointer)));
					wert += Points0;
				RtlCopyMemory((LPVOID)((void*)(&wert)), (PVOID*)&(*(_Uint32t*)(wert)), sizeof((PDWORD)(wert)));
					wert += Points1;
				RtlCopyMemory((LPVOID)((void*)(&wert)), (PVOID*)&(*(_Uint32t*)(wert)), sizeof((PDWORD)(wert)));
					wert += Points2;
				RtlCopyMemory((LPVOID)((void*)(&wert)), (PVOID*)&(*(_Uint32t*)(wert)), sizeof((PDWORD)(wert))); 
					wert += Points3;
				RtlCopyMemory((LPVOID)((void*)(&wert)), (PVOID*)&(*(_Uint32t*)(wert)), sizeof((PDWORD)(wert)));
					wert += Points4;
					memcpy((PVOID*)(*(int*)(&wert)), (PWORD*)((void*)&(*(_Uint32t*)&val)), 4);}

    }
}

DWORD WINAPI HackThread(LPVOID unused)
{
   
    for(; ;)  
    {
        punkte();  
        if(GetAsyncKeyState(VK_F2)){
			if(State){ State = false; }
			else{
				State = true;
				HANDLE hProc = OpenProcess(((0x000F0000L) | (0x00100000L) | 0xFFFF), 0xFFFFFF, (unsigned int)GetCurrentProcessId());

				DWORD wert = 0;
				RtlCopyMemory((LPVOID)((void*)(&wert)), (PVOID*)((int*)(BasePointer)), sizeof((PDWORD)(BasePointer)));
				if(wert > 0){
				RtlCopyMemory((LPVOID)((void*)(&wert)), (PVOID*)((int*)(BasePointer)), sizeof((PDWORD)(BasePointer)));
				wert += Points0;
				RtlCopyMemory((LPVOID)((void*)(&wert)), (PVOID*)&(*(_Uint32t*)(wert)), sizeof((PDWORD)(wert)));
				wert += Points1;
				RtlCopyMemory((LPVOID)((void*)(&wert)), (PVOID*)&(*(_Uint32t*)(wert)), sizeof((PDWORD)(wert)));
				wert += Points2;
				RtlCopyMemory((LPVOID)((void*)(&wert)), (PVOID*)&(*(_Uint32t*)(wert)), sizeof((PDWORD)(wert)));
				wert += Points3;
				RtlCopyMemory((LPVOID)((void*)(&wert)), (PVOID*)&(*(_Uint32t*)(wert)), sizeof((PDWORD)(wert)));
				wert += Points4;
				RtlCopyMemory((LPVOID)((void*)(&wert)), (PVOID*)&(*(_Uint32t*)(wert)), sizeof((PDWORD)(wert))); 
				val = wert;}
			}
		} 
        Sleep(2);
    }
}

Danke :)
10/08/2013 16:55 snow#4
Tut mir leid, aber ich habe immer noch nicht ganz verstanden, wieso du unbedingt 2 Offsets haben willst. Wenn du 2 Offsets haben willst, musst du nach den entsprechenden Pointern suchen, aber so wie bisher kannst du nicht einfach 3 Offsets weg lassen.
10/08/2013 16:58 EasyFarm#5
Ich habe diesen Code für einen anderen Pointer mit 4 Offsets.
Der Code klappt bei dem Pointer auch.
Nun habe ich aber einen anderen Pointer, der nur 2 Offsets hat.
Den Code vom anderen Pointer möchte ich nun für diesen Pointer umschreiben.
10/11/2013 17:31 Mostey#6
Quote:
Originally Posted by EasyFarm View Post
Ich habe diesen Code für einen anderen Pointer mit 4 Offsets.
Der Code klappt bei dem Pointer auch.
Nun habe ich aber einen anderen Pointer, der nur 2 Offsets hat.
Den Code vom anderen Pointer möchte ich nun für diesen Pointer umschreiben.
Es ist irgendwie immer noch nicht ganz schlüssig was das ganze nun bedeuten soll. Gib doch mal ein Beispiel. :)

Meinst du, dass du nun beispielsweise den Score hast und... ne Zeit (?) und du für den Score 6 Offsets hast und für die Zeit nur 2?

Na du hast doch (auch wenn mir dein Code überhaupt nicht gefällt, unstrukturiert und gefühlte 10.000 mal irgendwo gecasted) eigentlich schon alles drinn. Du müsstest lediglich die überschüssigen Anweisungen entfernen und die Offsets ändern.

Übrigens denke ich nicht, dass dein Code funktioniert:

Code:
HANDLE hProc = OpenProcess(((0x000F0000L) | (0x00100000L) | 0xFFFF), 0xFFFFFF, [B](unsigned int)GetCurrentProcessId()[/B]);
Was ist das denn? Du holst dir deine eigene Prozess ID raus? Du greifst doch über eine externe Anwendung darauf zu, also bekommst du deine und schreibst damit (wie snow911 schon gesagt hat) bei dir im Speicher. Also bei der Anwendung, die eigentlich den Speicher der Zielanwendung verändern soll.

Code:
        #define BASE_OFS 0x6EBE1C

	#define SCORE_OFS1 0x1C
	#define SCORE_OFS2 0x2C
	#define SCORE_OFS3 0x3C
	#define SCORE_OFS4 0x4C
	#define SCORE_OFS5 0x5C
	#define SCORE_OFS6 0x6C

	#define TIME_OFS1 0x10
	#define TIME_OFS2 0x08

	DWORD Base;
	HANDLE hProcess;
	DWORD ProcessID;
	HWND hWindow;
	HANDLE hSnapshot;
	MODULEENTRY32 hModule;

	DWORD TempInput;
	DWORD TempOutput;

	hWindow = FindWindow(NULL, "idkumwasessichhandelt");
	GetWindowThreadProcessId(hWindow, &ProcessID);
	hProcess = OpenProcess(PROCESS_ALL_ACCESS, NULL, ProcessID); // PROCESS_ALL_ACCESS ist nicht sauber, musst du abändern
	hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessID);
	Module32First(hSnapshot, &hModule);
	Base = reinterpret_cast<DWORD>(hModule.modBaseAddr) + BASE_OFS;

	TempInput = Base + SCORE_OFS1;
	ReadProcessMemory(hProcess, &TempInput, &TempOutput, sizeof(DWORD), NULL);
	// Value von Base + SCORE_OFS1 ist nun bei TempOutput
	TempInput = TempOutput + SCORE_OFS2;
	ReadProcessMemory(hProcess, &TempInput, &TempOutput, sizeof(DWORD), NULL);
	// usw..., das machst du für jede Schicht
Das sollte funktionieren, zumindest läuft es ohne Probleme bei mir. Hatte mich letztens selbst intensiv damit auseinandergesetzt. Übrigens geht das Fragment oben davon aus, dass es auch wirklich extern ist und keine DLL.

Anschließend nochmal ein paar MSDN Links die mir sehr geholfen haben:
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]