Das tutorial stammt ursprünglich von beaving. Jedoch habe ich es für euch ins deutsche übersetzt.
Das tutorial zeigt euch wie man einen maphack für starcraft 2 erstellt ohne patches in der .text section von starcraft 2 zu machen. Ihr solltet über etwas Basiswissen in C++ und Assembler haben um das ganze auch zu verstehen.
In Starcraft 2 gibt es die sogenannte Galaxy API welche zur Entwicklung von Custom Maps verwendet wird. Diese API ist sehr gut dokumentiert und man findet reichlich nützliche Funktionen. Hier findet man eine tolle Dokumentation zur Galaxy API:
http://www.sc2mapster.com/wiki/galaxy/main-page/Im genaueren werden wir uns mit der Galaxy Funtkion
VisEnable beschäftigen.
Hier der Link zur Dokumentation dieser Funktion auff SC2Mapster
http://www.sc2mapster.com/wiki/galaxy/triggers/enable-disable-visibility/Neben wir nun die Argumente dieser Funktion etwas genauer unter die Lupe: presets Visibility Type und Enable/Disable.
It could mean anything, let's have a closer look at the presets Visibility Type and Enable/Disable Option
Was wir also brauchen sind:
Fog Of War c_visTypeFog
und
Disabledefinition von preset:
Preset is a set of variables with constant values. You can compare it with enum from C/C+ + , but in galaxy you can use all kinds of types for preset.Die erste variable in einem enum ist immer auf 0 gesetzt sofern ihr nicht manuell ein anderer Wert zugewiesen wurde und die folgende Variablen werden immer um 1 erhöht in einem enum.
Daher ist c_visTypeFog mit dem Wert 1 die zweite Variable in dem preset.
Da wir den fog of war ausschalten wollen müssen wir einfach das zweite Argument der Funktion VisEnable auf Disable stellen. Disable/Enable sind einfach definiert als true und false.
Soweit zur Galaxy Funktion. Nun müssen wir die Funktion selber aufrufen damit der Fog auch ausgeschalten wird.
Das ganze sollte dann so aussehen:
VisEnable( 1, false ); //1. param = c_visTypeFog, 1. = Disable
Erstellt einfach ein neues DLL Projekt in eurer IDE und macht eine Funktion zum ein/ausschalten der Funktion:
Das könnte dann so aussehen:
while( true )
{
if( GetAsyncKeyState( VK_F7 ) & 0x8000 )
{
//Maphack ein/ausschalten
}
Sleep( 50 );
Um die Funktion auch nützen zu können deklarieren wir sie mit einem typedef:
typedef void ( __fastcall* SC2_GalaxyVisEnable_t) ( DWORD* lpdwParams );
static SC2_GalaxyVisEnable_t SC2_GalaxyVisEnable = (SC2_GalaxyVisEnable_t)0x00A0F560; // Offset ist für Starcraft II Patch 1.3.6
Um an das Offset zu kommen könnt ihr zb einfach die Galaxy API mit hilfe des DebugString dumpen oder einfach das
IDA script von rolle3k verwenden. Wenn ein neuer Patch kommt müsst ihr das Offset aktualisieren sonst wird Starcraft 2 crashen und der hack wird nicht funktionieren.
Um die Funktion aufzurufen müssen wir einen array mit den parametern der funktion übergeben weil die meisten Galaxy API funktionen lesen die parameter über einen einzigen array ein.
DWORD dwParams[] = { 1, false }; //1st param = c_visTypeFog, 2nd = Disable
Nun sind wir eigentlich schon fertig und der code sollte nun so aussehen:
#include <Windows.h>
bool Initialize( void );
typedef void ( __fastcall* SC2_GalaxyVisEnable_t) ( DWORD* lpdwParams );
static SC2_GalaxyVisEnable_t SC2_GalaxyVisEnable = (SC2_GalaxyVisEnable_t)0x00A0F560;
BOOL WINAPI
DllMain( HMODULE hDll, DWORD dwReason, LPVOID lpReserved )
{
if( dwReason == DLL_PROCESS_ATTACH )
return !!CreateThread( 0, 0, (LPTHREAD_START_ROUTINE)Initialize, 0, 0, 0 );
return TRUE;
}
bool Initialize( void )
{
bool bOnetime = true; //as im too lazy to make a good manager. rather use a WndProc
while( true )
{
if( bOnetime )
{
if( GetAsyncKeyState( VK_F7 ) & 0x8000 )
{
DWORD dwParams[] = { 1, false };
SC2_GalaxyVisEnable( dwParams );
bOnetime = false;
}
}
Sleep( 50 );
}
}
Nun müsst ihr den code nur noch zur .dll kompilieren und dann mit hilfe eines DLL Injectors (zb: Winject) injecten.
Ihr werdet merken ,dass ihr auch gegnerische Einheiten auswählen könnt was zwar ziemlich nützlich ist jedoch ist es somit leicht in replays zu erkennen ,dass man einen maphack verwendet. Daher sollte man etwas vorsichtig sein.
Leider werdet ihr auch merken ,dass ihr desynced werdet nach einer gewissen zeit wenn ihr übers battle.net spielt. ( zum Beispiel wenn man auf erhöhtes Terrain schießt ohne ,dass man eigentlich die Sicht dazu hat).
Um dieses Problem zu lösen muss man noch ein bisschen tiefer gehen und die Galaxy Funktion VisEnable mit hilfe von reverse engineering nochmal auseinander nehmen.
Besorgt euch IDA mit dem Hex-Ray Plugin und dann öffnet das Programm , Datei->Öffnen->sc2.exe.
Stellt sicher ,dass ihr nicht den SC2 Loader öffnet der den gleichen Namen (sc2.exe trägt) und im Hauptverzeichnis des Starcraft 2 Ordners liegt.
Lasst nun IDA die Datei analysieren , das kann etwas länger dauern kommt ganz auf die Geschwindigkeit eures Computers an.
Drückt nun G und dann gibt das offset für die Funktion VisEnable ein welche 0x00A0F560 ist und dann drückt F5 um den Pseudo C++ Code zu bekommen. (geht nur wenn ihr das hex-ray plugin für IDA habt (findet man im Internet))

Nichts spezielles zu finden hier . Die funktion liest den array und übergibt ihn der nächsten funktion. Also folgen wir der nächsten Funktion mit einem Doppelklick auf das sub_xxxx.

Wir wissen nun ,dass der paramter a1 der type des fogs ist und a2 disable/enable ist.
Der Code überprüft ob a1 != false ist und dann ob a1 == 1 ist. Dannach werden 3 Funktionen aufgerufen:
sub_EAFB80(a2); //Dieser Funktion wird der Disable paramter übergeben. Daher ist diese Funktion besonders interessant für uns.
sub_A48440((void*)((v2 != 0)-1));
result= sub_A60A30();
Die Funktionsnamen können sich ändern wenn ihr eine andere Starcraft 2 Version habt. Also nicht verwirrt sein.
Also folgen wir der sub_EAFB80(a2); funktion mit einem Doppelklick.

Wir sehen ,dass viele variablen gesetzt werden. Da wir den Maphack patch frei machen wollen und dort keine weiteren funktions aufrufe sind gehen wir nicht mehr tiefer und rufen einfach die Funktion auf.
Wir deklarieren die Funktion wieder mit einem typedef:
typedef void ( __fastcall* SC2_AddFog_t) ( DWORD dwAddFog );
static SC2_AddFog_t SC2_AddFog = (SC2_AddFog_t)0x00EAFB80;
und dann rufen wir die Funktion auf:
SC2_AddFog( 0 );
Somit sollte der endgültige Code für den Maphack so aussehen:
#include <Windows.h>
bool Initialize( void );
typedef void ( __fastcall* SC2_AddFog_t) ( DWORD dwAddFog );
static SC2_AddFog_t SC2_AddFog = (SC2_AddFog_t)0x00EAFB80;
BOOL WINAPI
DllMain( HMODULE hDll, DWORD dwReason, LPVOID lpReserved )
{
if( dwReason == DLL_PROCESS_ATTACH )
return !!CreateThread( 0, 0, (LPTHREAD_START_ROUTINE)Initialize, 0, 0, 0 );
return TRUE;
}
bool Initialize( void )
{
bool bOnetime = true; //as im too lazy to make a good manager. rather use a WndProc
while( true )
{
if( bOnetime )
{
if( GetAsyncKeyState( VK_F7 ) & 0x8000 )
{
SC2_AddFog( false );
bOnetime = false;
}
}
Sleep( 50 );
}
}
Fertig. Nun kompiliert den Hack startet SC2 geht in ein Spiel injected die .dll und dann ruft die Maphack Funktion mit dem Hotkey auf. Das ganze sollte nun so aussehen: