Cheat engine - c++

09/12/2012 19:22 Hiris#1
Hi, suche jemand der sich halbwegs mit c++ in verbindung mit cheat engin auskennt, wird hier nicht so leicht zu erklären sein, darum wärs nett wenn ihr mich kurz bei skype adden könntet :hirisis
09/13/2012 09:03 Medix#2
wenn du s hier nicht zum erklären hinkriegst wie solltest du es im skype hinkriegen?
09/13/2012 09:25 Hiris#3
Hab von nem tutorial mit dll injection abgeschaut :

Code:
 //HackMe.cpp
#include <iostream>

int main(void){

int Holz=100;


for(;;){

std::cout<<"Sie haben momentan"<<Holz<<"Holz\n";
//Damit wir nicht mühsam suchen müssen
std::cout<<"Die Adresse,die den Betrag an Holz haelt:"<<&Holz<<"\n";

getchar();
}

}
also exe und

Code:
//1.
#include <windows.h>
//2.
#define Holz_Adress 0x18fbdc

//3.
void RewriteValues(){

int *HolzPtr;

//Adresse übergeben
HolzPtr=(int *)Holz_Adress;

//Dereferenzieren
*HolzPtr=2000;

}

//4.
BOOL WINAPI DllMain(HINSTANCE hinstDll,DWORD Reason,LPVOID Reserved){


	switch(Reason){
         //5.
	case DLL_PROCESS_ATTACH:
		RewriteValues();
		break;
        //6.
	case DLL_PROCESS_DETACH:
		MessageBox(NULL,"DLL Hack detached","Heyho",0);
		break;

	}


return TRUE;
}
als dll, da ist das injecten mit winject auch kein problem.

Hab das jetzt mal bei solitär probiert, speicher von der punktzahl mit cheat engine geholt und in der dll actualisiert aber wenn ich sie injecten will steht bei winject: injection failed , reason -> 5
09/13/2012 13:53 Omdi#4
5 -> Access denied

Winject als admin starten oder einen anderen Injector benutzen.
09/13/2012 17:05 Hiris#5
geht als admin auch nicht, vorschläge für injector?
09/13/2012 17:27 tnd0#6
selbst schreiben.

openprocess() writeprocessmemory() createremotethread() fertig.
09/13/2012 18:51 Hiris#7
Quote:
openprocess() writeprocessmemory() createremotethread() fertig.
kannst du mir da ein beispiel geben? sry bin noch anfänger^^
09/13/2012 19:58 Nightblizard#8
Wie ich das in meiner Lib mache (Pseudocode):
Code:
Process::CurrentProcess.GrantDebugPrivileges();

//Dll laden:
auto dllPath = "C:\\Foo\\bar.dll";
auto process = Process::findFirstProcess("Foo.exe");
auto pathAddr = process.allocate(dllPath.Length);

process.write(pathAddr, dllPath);
auto thread = process.createThread(LoadLibray, pathAddr);
thread.waitForSingleObject();

//Exportierte Funktion laden (weil man die Finger von DllMain zu lassen hat):
auto findModule = [&]() -> Module
{
     foreach(auto module in process.modules)
          if(module.getPath() == dllPath)
               return module;

     throw Exception("Can not find module, injection failed!");
};

auto module = findModule();
auto myMain = module.getProcAddress("MyMain");

//Exportierte Funktion aufrufen:
thread = process.createThread(myMain);
thread.waitForSingleObject();

Die dll schaut dann z.B. so aus:
Code:
#include <Windows.h>

extern "C" void __declspec(dllexport) MyMain()
{
     MessageBox(nullptr, "Im inside your app!", nullptr, MB_OK);
}
Ich denke das ist mehr als genug um voran zu kommen, wenn man sich selber mit der Materie auseinander setzt.
09/13/2012 22:36 Hiris#9
Danke Nightblizard, hast mir sehr geholfen, hat jetzt auch geklapt, habs jetzt aber nochmal auf eine andere weise ohne injection versucht, also mit write proccesmemory etc. hat auch wunderbar geklappt, will jetzt nur gerne realisieren das man das Fenster angeben kann

schaut atm so aus:
Code:
#include <iostream>
#include <Windows.h>

using namespace std;

int main ()
{
	while (1==1)
	{
	int newValue = 20000;
	char carray[80];
	cin.getline ( carray, sizeof(carray) );
	cout << carray;
	HWND hWnd = FindWindow(0, carray);

	if (hWnd == 0) {
		cerr << "Cannot find window." << endl;

	} else {
		DWORD pId;
		GetWindowThreadProcessId(hWnd, &pId);
		HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pId);

		if (!hProc) {
			cerr << "Cannot open process." << endl;
		}else{
		int isSuccessful = WriteProcessMemory(hProc, (LPVOID)0x0037A674, &newValue, (DWORD)sizeof(newValue), NULL);
		if (isSuccessful > 0) {
			clog << "Process memory written." << endl;
		}
		else{
			cerr <<"Cannot write process memory." << endl;
		}
		CloseHandle(hProc);
		}
	}
	}
	return 0;
}
Hab versucht die eingabe über getline zu machen, die angabe stimmt eigentlich auch
nur findet er das richtige Fenster nicht, wenn man anstat carray "Solitär" nimmt gehts aber einwandfrei.

Ich schätze mal das liegt daran das im array noch zeichen dahinter sind also leere 0er, hat da jemand noch einen lösungsvorschlag?
09/14/2012 15:01 tnd0#10
Eigentlich sollte es daran nicht liegen. So gehts:
Code:
#include <iostream>
#include <string>
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

using namespace std;
int main( void ) 
{
	HWND l_hwnd;
	string l_target;
	getline(cin, l_target);
	l_hwnd = FindWindow(NULL, l_target.c_str());
	
	if (!l_hwnd)
	{
		std::cout << "could not find window\n";
		getchar();
		return 1;
	}
	
	std::cout << "found window\n";
	CloseWindow(l_hwnd); // zur kontrolle

	getchar();
        return 0;
}
Zu beachten ist, dass er nach der Window-Caption sucht, sprich NICHT "Mozilla Firefox" sondern z.b. "Google - Mozilla Firefox".
09/14/2012 15:08 Nightblizard#11
Du kannst über die Konsole Umlaute nicht so ohne weiteres einlesen, da die Konsole mit einem anderen Zeichensatz arbeitet. Versuche es mit Notepad, oder gebe, wie du das bereits gemacht hast, den Namen direkt im Programm ein.