C++ PointerWrite-Read & Allocconsole

12/03/2013 14:46 Terrat#1
Hallo liebe Epvp Community,

ich habe einen Multilevelpointer mit 5 offsets,
diesen kriege ich aber leider nicht verarbeitet,
mein ziel ist es das (ist eine dll) sie überprüft ob der wert >29900 ist
und wen ja ihr wieder auf 300000 writet.

Das Zweite ist , dass ich aus der Dll AllocConsole aufrufe wodurch die Console auch erstellt wird doch ich kriege es nicht hin etwas rein zu writen mit freopen.

Vielen Dank schon mal im Vor raus jeder der versucht zu Helfen bekommt natürlich ein THX.
12/03/2013 14:59 Dr. Coxxy#2
dann zeig mal code den du bisher fabriziert hast, fertige copypastelösung wird dir hier niemand geben.
12/03/2013 15:17 Terrat#3
Ok hier der Code wo noch nichts davon Passiert:
Code:
#include <iostream>

void RewriteValues(){
    AllocConsole();
	#define Adress_Sp 0x00201D38
	int *SpPtr;
	SpPtr=(int*)Adress_Sp;
	//while(true)
	//{
		*SpPtr=300000;
//	}
}
	BOOL WINAPI DllMain(HINSTANCE hinstDll,DWORD Reason,LPVOID Reserved){

		switch(Reason){

		case DLL_PROCESS_ATTACH:
			
			RewriteValues();
			break;
		case DLL_PROCESS_DETACH:
			
			break;
		}

return TRUE;
}
12/03/2013 15:50 th0rex#4
//Edit nvm ...
12/03/2013 16:39 Delinquenz#5
Dazu gibt es genug Tutorials, die du offenbar nicht gelesen hast.
12/03/2013 18:51 Terrat#6
Quote:
Originally Posted by Hiris View Post
Rücke er, der Delinquent, seinen Code ein und verleibe ihm Sinn und Verstand ein, damit jemand ihn freiwillig liest. Nenne er des weiteren Offsets oder gehe er erstmal lernen wie der ganze Crap funktioniert bevor er auf die schnelle etwas auf den Boden scheißen will. Denn alles was man auf den Boden scheißt muss man auch irgendwann wieder wegwischen, außer man hat einen Minion der das übernimmt.
Hier:
Baseadress:=0x00400000
[Only registered and activated users can see links. Click Here To Register...]
12/03/2013 19:35 XxharCs#7
Quote:
Originally Posted by Dreamsläps View Post
Hier:
Baseadress:=0x00400000
[Only registered and activated users can see links. Click Here To Register...]
Bitte, deine Baseaddress ist nicht 0x00400000
Die Baseaddress, in deinem Fall (also in einer dll), bekommt man durch GetModuleHandle(0) und das addieren deines Modul Offsets. Also:
Code:
DWORD BasePointer = 0;
DWORD ImageBase = (DWORD)GetModuleHandle(0);
BasePointer = ImageBase + 0x00201D38;
Wie man mit Multilevelpointer arbeitet, ist ganz einfach. Du musst deiner Addresse immer den Offset dazuzählen. (bei der CE kannst du das sogar gut beobachten!)


Du solltest mal die Grundlagen lernen, man sollte schon wissen wie man Inputs/Outputs einer Allokierten Konsole verwaltet.
Code:
freopen("CONIN$", "r", stdin); 
freopen("CONOUT$", "w", stdout); 
freopen("CONOUT$", "w", stderr);
12/03/2013 20:06 Mostey#8
Quote:
Originally Posted by XxharCs View Post
Bitte, deine Baseaddress ist nicht 0x00400000
Die Baseaddress, in deinem Fall (also in einer dll), bekommt man durch GetModuleHandle(0) und das addieren deines Modul Offsets. Also:
Woher weißt du dass diese nicht 0x00400000 ist? Eventuell wird ASLR gar nicht verwendet, daher wäre das durchaus plausibel.

In diesem Fall wäre die Funktion GetModuleHandle() auch überflüssig.
12/04/2013 18:29 Terrat#9
Hab es jetzt so gemacht ,
der Compiler und Co sagen mir auch kein Fehler aber er gibt mir das richtige nicht aus ?
Code:
#include <Windows.h>
#include <iostream>
#include <stdio.h>
void RewriteValues(){
	DWORD BasePointer = 0;
	DWORD ImageBase = (DWORD)GetModuleHandle(0);
	BasePointer = ImageBase + 0x00201D38;
	WCHAR BaseOutput[50]; // WCHAR is the same as wchar_t
	// swprintf_s is the same as sprintf_s for wide characters
	swprintf_s(BaseOutput, 10, L"%d", BasePointer); // use L"" prefix for wide chars
	
	MessageBox(NULL,BaseOutput,NULL,NULL);
    DWORD PROC_ID;
    HANDLE PROC_HANDLE;
	DWORD Step1,Step2,Step3,Step4,Step5,EndAdress;
    GetWindowThreadProcessId(FindWindow(NULL, (LPCTSTR)"S4 Client"), &PROC_ID);
    PROC_HANDLE = OpenProcess(PROCESS_ALL_ACCESS, false, PROC_ID);
    ReadProcessMemory(PROC_HANDLE, (void*)BasePointer, &Step1, sizeof(Step1), NULL);
    Step1=Step1+0x84;
	ReadProcessMemory(PROC_HANDLE, (void*)Step1, &Step2, sizeof(Step2), NULL);
	Step2=Step2+0x214;
	ReadProcessMemory(PROC_HANDLE, (void*)Step2, &Step3, sizeof(Step3), NULL);
	Step3=Step2+0x58;
	ReadProcessMemory(PROC_HANDLE, (void*)Step3, &Step4, sizeof(Step4), NULL);
	Step4=Step2+0x14;
	ReadProcessMemory(PROC_HANDLE, (void*)Step4, &Step5, sizeof(Step5), NULL);
	Step5=Step2+0x5d8;
	ReadProcessMemory(PROC_HANDLE, (void*)Step5, &EndAdress, sizeof(EndAdress), NULL);
	WCHAR BaseOutput2[500]; // WCHAR is the same as wchar_t
	// swprintf_s is the same as sprintf_s for wide characters
	swprintf_s(BaseOutput2, 500, L"%d", EndAdress); // use L"" prefix for wide chars
	MessageBox(NULL,BaseOutput2,L"Adress",MB_OK);
	CloseHandle(PROC_HANDLE);

}
	BOOL WINAPI DllMain(HINSTANCE hinstDll,DWORD Reason,LPVOID Reserved){

		switch(Reason){

		case DLL_PROCESS_ATTACH:
			
			RewriteValues();
			break;
		case DLL_PROCESS_DETACH:
			
			break;
		}

return TRUE;
}
12/04/2013 18:54 XxharCs#10
Quote:
Originally Posted by Mostey View Post
Woher weißt du dass diese nicht 0x00400000 ist? Eventuell wird ASLR gar nicht verwendet, daher wäre das durchaus plausibel.

In diesem Fall wäre die Funktion GetModuleHandle() auch überflüssig.
In 90% der Fälle ist es ASLR, bzw. ich bin immer auf ASLR gestoßen :)


Quote:
Originally Posted by Dreamsläps View Post
Hab es jetzt so gemacht ,
der Compiler und Co sagen mir auch kein Fehler aber er gibt mir das richtige nicht aus ?
Anscheinend verstehst du da vieles nicht.

1. Wieso verwendest du OpenProcess in der dll wenn du sie sowieso in das "Opfer"-Programm injizierst?
2. Wieso verwendest du ReadMemory, wenn du die "Haupt"-Addresse & Offsets kennst?
3. Schau dir die Pointer Arithemtic an, anscheinend hast du es missverstanden / weißt nicht was das ist. [Only registered and activated users can see links. Click Here To Register...]
oder das openbook von C mit den Pointer (ob C oder C++ die Pointer Arithemtic funktioniert gleich in den 2 Sprachen) [Only registered and activated users can see links. Click Here To Register...]


Code:
DWORD dwOffset1 = *(DWORD*)(BasePointer + 0x5d8);
DWORD dwOffset2 = *(DWORD*)(dwOffset1 + 0x14);
DWORD dwOffset3 = *(DWORD*)(dwOffset2 + 0x58);
DWORD dwOffset4 = *(DWORD*)(dwOffset3 + 0x214);
DWORD dwOffset5 = *(DWORD*)(dwOffset4 + 0x84);
Edit:
Vergessen zu erwähnen, du brauchst noch ein Thread, in diesen führst du deine Funktion aus. Den Thread startest du in DLL_PROCESS_ATTACH.
Code:
DWORD WINAPI HackThread(LPVOID unused)
{
...
}
...
...
CreateThread(0, 0, &HackThread , 0, 0, 0);
...
12/05/2013 07:39 MrSm!th#11
Quote:
Originally Posted by XxharCs View Post
2. Wieso verwendest du ReadMemory, wenn du die "Haupt"-Addresse & Offsets kennst?
Die Frage sollte eher lauten:
"Wieso verwendest du ReadProcessMemory, wenn du dich im selben Address-Space befindest?"
Die einzelnen Zwischenadressen muss man so oder so auslesen, machst du mit deinem Code ja auch - insofern verstehe ich nicht ganz, was der Verweis auf Hauptadresse und Offsets soll.
12/05/2013 07:55 Mostey#12
Quote:
Originally Posted by XxharCs View Post
In 90% der Fälle ist es ASLR, bzw. ich bin immer auf ASLR gestoßen :)
Bin ich jetzt auch eigentlich immer, obwohl ich das bisher testweise nur 3-4 mal gemacht habe. Kann aber trotzdem möglich sein. :cool:

Code:
	ReadProcessMemory(PROC_HANDLE, (void*)Step2, &Step3, sizeof(Step3), NULL);
	Step3=Step2+0x58; // Step3 += 0x58
	ReadProcessMemory(PROC_HANDLE, (void*)Step3, &Step4, sizeof(Step4), NULL);
	Step4=Step2+0x14; // Step4 += 0x14
	ReadProcessMemory(PROC_HANDLE, (void*)Step4, &Step5, sizeof(Step5), NULL);
	Step5=Step2+0x5d8; // Step5 += 0x5d8
	ReadProcessMemory(PROC_HANDLE, (void*)Step5, &EndAdress, sizeof(EndAdress), NULL)
Dort sind wesentliche Fehler, du addierst komischerweise immer den Inhalt aus 'Step2' mit den Offsets, obwohl du eigentlich den Inhalt der zuletzt ausgelesen Adresse mit dem Offset addieren solltest. (Du addierst in CE ja auch die Offsets auf das Ergebnis der jeweils letzten Operation, oder?)
12/05/2013 11:51 Terrat#13
Danke leute kreigt Alle Thx

Aber warum Crasht der Code jetzt den Client?
ps:kann mir jemand den richtigen Code reinschreiben der Funktioniert mit ein bissel erklärung
Code:
#include <Windows.h>
#include <iostream>
#include <stdio.h>
DWORD WINAPI HackThread(LPVOID unused){
	DWORD BasePointer = 0;
	DWORD ImageBase = (DWORD)GetModuleHandle(0);
	BasePointer = ImageBase + 0x00201D38;
	DWORD dwOffset1 = *(DWORD*)(BasePointer + 0x5d8);
	DWORD dwOffset2 = *(DWORD*)(dwOffset1 + 0x14);
	DWORD dwOffset3 = *(DWORD*)(dwOffset2 + 0x58);
	DWORD dwOffset4 = *(DWORD*)(dwOffset3 + 0x214);
	DWORD dwOffset5 = *(DWORD*)(dwOffset4 + 0x84);
	int *SpPtr;
	SpPtr=(int*)dwOffset5;
	while(true)
	{
		if(*SpPtr!=30000);
			*SpPtr=300000;
	}
	return 0;


}
	BOOL WINAPI DllMain(HINSTANCE hinstDll,DWORD Reason,LPVOID Reserved){

		switch(Reason){

		case DLL_PROCESS_ATTACH:
			
			CreateThread(0, 0, &HackThread , 0, 0, 0);
			break;
		case DLL_PROCESS_DETACH:
			
			break;
		}

return TRUE;
}
12/05/2013 15:41 +Yazzn#14
Vielleicht dereferenzierst du einen nullptr?
12/05/2013 15:46 Terrat#15
Hmm eigentlich ein bissel,
er ist erst aktiv wen ich in einen mode gehe ingame macht das etwas aus ?