4Story C++ Hack

01/11/2011 16:21 *Dr.Bob#1
Hallo Leute,
ich bin gerade dabei C++ zu Lernen und einen Hack für 4Story zu schreiben es is eine DLL.
Der Hack soll den wert von Handel auf 1 Setzen wenn F5 gedrückt wird doch irgendwie klappt das nicht so richtig und ich finde auch keine fehler, danke schonmal im vorraus:



#include <windows.h>
#include <stdio.h>

#define Addr_Base 0x6CA388
#define Offs_1 0x318
#define Offs_2 0x128

void Speedhack()
{

if(GetAsyncKeyState(VK_F5))
{
*(DWORD*)(Addr_Base + Offs_1 + Offs_2) = 1;
}
}



void HackThread()
{
Speedhack();
Sleep(30);
}

BOOL WINAPI DllMain( HINSTANCE HMODULE, DWORD dwReason, LPVOID lpvReserved)
{
if(dwReason == DLL_PROCESS_ATTACH)
{
MessageBoxA(NULL, "4Story DLL NoMenu Hack", "Hack", MB_OK);
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)HackThread, 0, 0, 0);
}
return TRUE;
}
01/11/2011 17:31 xNopex#2
Quote:
ich bin gerade dabei C++ zu Lernen
Sieht man.

1st: Anstatt #include <stdio.h> lieber #include <cstdio>, wenn c++. Jedoch scheint mir der Include für dein Quellcode überflüssig.

2nd: Anstatt
Code:
void HackThread()
lieber
Code:
DWORD WINAPI HackThread( LPVOID lpParam )
Damit sparst du dir später den Cast beim erstellen des Threads.

3rd: Anstatt
Code:
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)HackThread, 0, 0, 0);
Lieber
Code:
CreateThread(NULL, 0, HackThread, NULL, 0, NULL);
Dein Compiler sollte dich gewarnt haben.

4th: Zum eig. Problem: CreateThread gibt nen return-Wert zurück, anhand welchem du herausfindest, ob dein Thread überhaupt erfolgreich erstellt wurde. Wenn ja, dann stimmt wohl deine Adresse nicht.
01/11/2011 17:33 *Dr.Bob#3
mein compiler hat mich vor garnix gewarnt oO und doch die addresse stimmt da ich nen bypass hab und in CE eingefügt habe, muss an was anderes liegen, kannst du mir vlt ne richtige version von dem was ich dir gepostet habe machen damit ich es richtig lerne? oder wie ist das mit WriteProcessMemory? 4Story is kein Shootergame, und ich hab das tut wie ich den ahck gecoded hab aus ner Shooter game section btw Warrock
01/11/2011 17:42 xNopex#4
Les dir das nochmal durch und schaue, ob der Thread gestartet wird:
[Only registered and activated users can see links. Click Here To Register...]

Dazu: [Only registered and activated users can see links. Click Here To Register...]

EDIT: Irgendwie glaube ich trotzdem, dass die Adresse schlicht falsch ist bzw. das Anti-Cheat System dein Modul entlädt oder something like this.
01/11/2011 17:45 Xenox3#5
omfg dir fehlt ne while schleife du bob
01/11/2011 17:57 *Dr.Bob#6
hähh jez kapier ich 0 wie meinste while schleife?^^
01/11/2011 18:41 xNopex#7
Tatsache, das habe ich gar nicht gesehen. Im Thread solltest du noch eine Schleife einbauen, sonst wird die FUnktion nur einmal aufgerufen und dann beendet sich der Thread. In etwa so:

Code:
DWORD WINAPI HackThread( LPVOID lpParam )
{
    while( TRUE )
    {
        //... Funktionen aufrufen + Sleep()
    }
}
01/11/2011 18:49 *Dr.Bob#8
ja aber das bleibt dan ofen in CE also ohne frezzen also muss es auch so gehen
01/11/2011 19:24 Banana.Crafts#9
Probier es einfach aus, und du wirst staunen o.O
01/11/2011 19:52 *Dr.Bob#10
ich staune nicht, es funktioniert nicht habs probiert
01/12/2011 00:13 KDeluxe#11
Code:
*(DWORD*)(Addr_Base + Offs_1 + Offs_2) = 1;
Da sollte eigentlich jedem etwas auffallen.

Das die Schleife fehlt ist mir auch nicht aufgefallen, da das eigentlich eine Selbstverständlichkeit ist. "HackThread()" und "Speedhack()" könnte außerdem zusammenfassen.

Ich habe das ganze mal so gelöst, sollte eigentlich funktionieren:
Code:
#include <windows.h>

DWORD Addr_Base = 0x6CA388;
DWORD Offset[2] = {0x318, 0x128};

void HackThread(){
	MessageBoxA(NULL, "4Story DLL NoMenu Hack\nBlablablabla", "Hack", MB_OK);
	while(true){
		if(GetAsyncKeyState(VK_F5)){
			DWORD Address = *(DWORD*)(Addr_Base);
			Address = *(DWORD*)(Address + Offset[0]);
			Address = *(DWORD*)(Address + Offset[1]);

			if(Address == 1){
				Address = 0;
			}else{
				Address = 1;
			}
		}

		Sleep(50);
	}
}

BOOL WINAPI DllMain(HINSTANCE HMODULE, DWORD dwReason, LPVOID lpvReserved){
	if(dwReason == DLL_PROCESS_ATTACH){
		CreateThread(0, 0, (LPTHREAD_START_ROUTINE)HackThread, 0, 0, 0);
	}
	return TRUE;
}
Das ganze ist je nach Situation des Spiels noch fehleranfällig, das könnte man aber mit einer If-Abfrage verhindern. Für dein Problem sollte es aber reichen.
01/12/2011 11:43 *Dr.Bob*#12
Erst mal danke KillerDeluxe für dein Beispiel, aber irgendwas stimmt da nicht.
Er erkennt zwar das die Speicheradresse z.b 0 oder 1 ist aber ändert sie nicht.
Vielleicht ist dies: Address = 1; nicht ausreichend ?
01/12/2011 13:56 KDeluxe#13
Kleiner Denkfehler von mir, so geht es:
Code:
#include <windows.h>

DWORD Addr_Base = 0x6CA388;
DWORD Offset[2] = {0x318, 0x128};

void HackThread(){
	MessageBoxA(NULL, "Blablablabla", "Hack", MB_OK);
	while(true){
		if(GetAsyncKeyState(VK_F5)){
			DWORD Address = *(DWORD*)(Addr_Base);
			Address = *(DWORD*)(Address + Offset[0]);
			DWORD Value = *(DWORD*)(Address + Offset[1]);

			if(Value == 1){
				*(DWORD*)(Address + Offset[1]) = 0;
			}else{
				*(DWORD*)(Address + Offset[1]) = 1;
			}
			Sleep(250);
		}

		Sleep(50);
	}
}

BOOL WINAPI DllMain(HINSTANCE HMODULE, DWORD dwReason, LPVOID lpvReserved){
	if(dwReason == DLL_PROCESS_ATTACH)
		CreateThread(0, 0, (LPTHREAD_START_ROUTINE)HackThread, 0, 0, 0);
	return true;
}
BTW, mach mal deinen LC Hack aus der Signatur.
01/12/2011 14:26 *Dr.Bob*#14
Thx, geht wunderbar^^
01/12/2011 15:27 *Dr.Bob#15
neeiN!! du hättest nich hier sein dürfen donni du arsch geh weg^^