Pointer von Cheatengine in C++

05/18/2015 19:42 FroZenBabE#1
Ich will einen Base Pointer den ich in Cheat Engine gefunden habe in eine Dll mithilfe von c++ einbauen.

MIthilfe des Pointer Scanns habe ich einen Base Pointer mit der Adresse
"Meingame.exe"+004CECBC
1. Offset :1c8

"Meingame.exe" = 00400000
egal was ich versuche es scheint nicht zu funktionieren hier ein Beispiel:

DWORD dwItemBase = *(DWORD*)(0x00400000+0x004CECBC);
DWORD dwHolz_Adress = *(DWORD*)(dwItemBase + 0x1c8);

ich versteh den Mathematischen zusammenhang auch nich ganz was wohl einer der Gründe dafür ist das ich es nicht auf die Reihe bekomme^^

Wär klasse wenn mir jemand helfen könnte.
;)
05/18/2015 21:56 _asm#2
versuch's mal so:
Code:
DWORD dwHolzAddr = *(DWORD *)(*(DWORD *)0x8CECBC + 0x1C8);
05/18/2015 23:17 FroZenBabE#3
hm also in Cheatengine funktioniert das soweit da zeigt er dann auch die richtige Adresse an wenn ich 8CECBC also base adresse und 1c8 als pointer angeb
Aber irgendwie funktionierts nicht richtig und winject zeigt mir grad auch an das es mim injecten nichmehr geht und vorher gings ma is iwi komisch :D

Hier mal mein Code:
05/18/2015 23:24 Requi#4
Du dereferenzierst doch den Pointer schon hiermit:
Code:
*(DWORD *)*(DWORD *)0x8CECBC + 0x1C8)
Probiers mal so:
Code:
DWORD *HolzPtr = ((DWORD *)*(DWORD *)0x8CECBC + 0x1C8);
*HolzPtr = 200;
05/18/2015 23:41 FroZenBabE#5
Ich probiers ma eben edit kommt gleich^^

Hm was ich komisch finde ich injecte das 1. ma dann funktioniert das injecten wenn ichs nochma machen will kommt ein fehler ? wieso sollte ich eine Adresse nicht ein 2. ma ändern können :O Schlägt das injecten fehl wenn die Adresse dich angebe nicht im Speicher genutzt wird von dem Spiel ?

CODE:

05/19/2015 00:35 Logtetsch#6
Korrigiert mich, falls ich mich täusche: Sofern deine DLL vom Prozess (dein Spiel) nicht sauber detached wurde, wird das erneute Injecten der gleichen DLL fehlschlagen. Ich nehme an, dass Windows dabei keinen Bedarf sieht die selbe DLL nochmal zu injecten, sofern sich diese noch im Speicher aufhält.

Btw. gibt es einen Grund warum hier alle C-Style casts verwenden?
Eventuell auf DWORD_PTR/ ULONG_PTR ausweichen, aber wayne.

Code:
const DWORD MEINGAME_ADDR = 0x400000;
const DWORD BASE_PTR_OFFSET = 0x4CECBC;
const DWORD WOOD_PTR_OFFSET = 0x1C8;

DWORD* meingamePtr = reinterpret_cast<DWORD*>(MEINGAME_ADDR);
DWORD* basePtr = meingamePtr + BASE_PTR_OFFSET;

DWORD* woodPtr = basePtr + WOOD_PTR_OFFSET;
	
std::wcout << TEXT("Address of wood storage: ") << std::hex << woodPtr << std::endl;
std::wcout << TEXT("Value: ") << std::dec << *woodPtr << std::endl;

*woodPtr = 100;
std::wcout << TEXT("New Value: ") << std::dec << *woodPtr << std::endl;
05/19/2015 01:10 FroZenBabE#7
soweit so gut^^ doch iwi scheint sich dein code nich mit meiner Bool WINAPI zu vertragen^^ denn dann lässt sich die dll nich injecten wenn ich die BOOL WINAPI aber ausklammer lässt sie sich zwar injecten aber das bringt ja auchnichts weil die void funktion nicht aufgerufen wird.
Was das mit dem detachen angeht hast du recht wird mir auch angezeigt^^ Wie detach ich die dll wieder ?
ehm ich denk der grund warum alle C-Style casts verwenden ist denk ich das es etwas unkomplizierter zu sein scheint auserdem gabs da ma nen tutorial dazu wo das halt so gemacht wurde^^

CODE:
05/20/2015 19:52 hazejp#8
Von meiner Seite aus betrachtet ist es keine Schande, C-Style casts zu verwenden, da sich der Code hier bis auf iostream, etc. kaum bis gar nicht von C unterscheidet und kein objektorientierter Code verwendet wird.