CoderZ.cc

Zurück   CoderZ.cc > Security > Reverse Engineering


 
Themen-Optionen Ansicht
06.05.2013, 23:29   #1
easysurfer (Offline)
Administrator
 
 
Registriert seit: 31.10.2024
Beiträge: 421
Thanks: 67
Thanked 238 Times in 130 Posts
Standard [Sammelthread] WarThunder RE

Ausgehend von dem Wunsch nach einem WarThunder Bot habe ich mir "WarThunder" mal angeschaut. Es ist das optimale Programm zum Üben von RE, denn es nicht ist gepackt und besitzt auch keinen nervigen Cheatschutz.

Nach fast 2 Stunden WarThunder kennenlernen und in IDA-Pro stöbern, wurden folgende Sachen gefunden:
GlobalGameManager Klasse: 0x01780A24 // Hält Zeiger zu allem, was man sich wünschen kann
//Generated using ReClass 2011 by DrUnKeN ChEeTaH
class GameManagerContext;
class GameManagerModules;
class PlayerData;
class GameManagerContext
{
public:
    GameManagerModules* pModules; //0x0000 
char _0x0004[8];
    DWORD GameRunningTime; //0x000C 
char _0x0010[12];
    float GameTimeRunning; //0x001C 
    float unknown1; //0x0020 
    float unknown2; //0x0024 
char _0x0028[24];
};//Size=0x0040
class GameManagerModules
{
public:
char _0x0000[1040];
    PlayerData N019704BF; //0x0410 
};//Size=0x0890
};//Size=0x0040
class PlayerData
{
public:
char _0x0000[196];
    D3DXMATRIX ViewMatQ; //0x00C4 
    D3DXMATRIX ProjectionMatQ; //0x0104 
char _0x0144[104];
    D3DXVECTOR3 N019860A0; //0x01AC 
    D3DXVECTOR3 N019860A3; //0x01B8 
    D3DXVECTOR3 PlayerPosition; //0x01C4 
    D3DXVECTOR3 N019860A9; //0x01D0 
    D3DXVECTOR3 N019860AC; //0x01DC 
char _0x01E8[88];
    D3DXVECTOR3 N019860C5; //0x0240 
char _0x024C[564];
};//Size=0x0480
Damit hätten wir schonmal dynamisch die Position und Matrizen des Spielers.

Doch wie bin ich da drauf gekommen? Naja, ich hatte und habe eine Funktion gefunden, die wohl Funktionen mit anderen verlinkt und dabei den Namen der Funktion verwendet. Zu finden in IDA hier:
.text:00ECFE90 // GlobalFunctionLink
// u.a. Methoden wie:
  
sub_ED4E70(sub_ECF4B0"req_player_public_statinfo_by_player_id");
  
sub_ED4D90(sub_ECF500"get_player_public_stats");
  
sub_ED52D0(sub_EBB200"get_flightmodel");
  
sub_ED52D0(sub_EBB240"get_flightmodel_name");
  
sub_ED52D0(sub_EBB280"get_flightmodel_weapons");
  
sub_ED52D0(sub_EBB2C0"get_flightmodel_weapon_preset");
  
sub_ED5FF0(sub_ECEA30"shop_get_aircraft_hp");
  
sub_ED67D0(sub_EC98C0"get_player_lists"); 
Und bei der letzten besagten Funktion bin ich auf folgenden Code gestossen:
// sub_EC98C0
 
return *(_DWORD *)(LODWORD(GlobalManagerQ) + 0x410) + 0x10D90
Voila, ein Zeiger auf die GlobalManager-Klasse mit Offset 0x410 (PlayerManager?). Ab dort befindet sich die "PlayerList" im Offset 0x10D90. Aber das schau ich morgen weiter an.

Dann noch etwas Crypto-Stuff, warscheinlich zum cryten der Packete, welche über UDP versendet werden:
bool .data:00FE4770 DecryptFunctionsLoaded;

v9 = *(int (__stdcall **)(_DWORD))LoadLibraryA;

if ( !
DecryptFunctionsLoaded )
        {
          
v11 = (HMODULE)v9("?\tØÉ¦B");
          if ( !
v11 || !DecryptFunctQQQ2(v11) )
            
DecryptFunctQQQ();
          
DecryptFunctionsLoaded 1;
        }
// DecryptFunctQQQ = .text:00C61380
// DecryptFunctQQQ2 = .text:00C611F0 
Dabei werden einfach dynamisch Funktionen geladen, die warscheinlich die Packte dann entschlüsseln. Zeiger auf die Funktionen werden auf statische Speicherbereiche gelegt, z.B. hier:
GetProcAddr = *(int (__stdcall **)(_DWORD_DWORD))GetProcAddress;
  
dword_FDCEFC = (int (__cdecl *)(_DWORD))GetProcAddress(Handle"K");
  if ( 
dword_FDCEFC
    
&& (dword_FDCF18 = (int (__cdecl *)(_DWORD_DWORD))GetProcAddr(Handle"1+\x1B¦+*GØ}£Î")) != 0
    
&& (dword_FDCF0C GetProcAddr(Handle"=cx¤ÞiXR")) != 0
    
&& (dword_FDCF00 GetProcAddr(Handle"1cÝÏ+")) != 0
    
&& (dword_FDCF10 GetProcAddr(Handle"¥2}-")) != 0
    
&& (dword_FDCF14 GetProcAddr(Handle";")) != 0
    
&& (dword_FDCF1C GetProcAddr(Handle":ðÉ")) != 0
    
&& (dword_FDCF04 = (int (__cdecl *)(_DWORD_DWORD))GetProcAddr(Handle"ØÇ-s¯tÿå!")) != 
Ich denke das reicht für den Anfang

Greez
__________________
Gamehacking, Reversing and Security
  Mit Zitat antworten
The Following 2 Users Say Thank You to easysurfer For This Useful Post:
Mofo (07.05.2024), wieschoo (07.07.2024)
07.05.2013, 22:59   #2
easysurfer (Offline)
Administrator
 
 
Registriert seit: 31.10.2024
Beiträge: 421
Thanks: 67
Thanked 238 Times in 130 Posts
Standard

Ich darf/muss meinen Post von gestern in der einen oder anderen Hinsicht korregieren:
Die "gefundene" Manager-Klasse hat, trotz dass sie im statischem Adressbereich liegt, keinen festen Offset. Dies hat die zweite Korrektur zu verschulden: Die aces.exe ist "gepackt", erst zur Laufzeit werden die Offsets für diese Managerklasse da hinein geschrieben. Des weiteren bin ich auf einen mehr oder weniger zuverlässigen Anti-Debug Schutz gestossen, das schau ich mir morgen mal genauer an.

Aber für die doch nicht so statische ManagerKlasse bzw ihren Zeiger gibt es eine Lösung: Signaturen und Offsets zu Funktionen! Denn die oben genannte get_player_list-Funktion befindet sich immer an IMAGE_BASE + 0x3298C0:
004C98C0      A1 240AD800             MOV EAX,DWORD PTR DS:[D80A24]
004C98C5      8B80 10040000           MOV EAX,DWORD PTR DS:[EAX+410]
004C98CB      05 900D0100             ADD EAX,10D90
004C98D0      C3                      RETN
Und hierdurch können wir die Addresse jeweils auslesen.

So weit für heute

Greez
__________________
Gamehacking, Reversing and Security
  Mit Zitat antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:19 Uhr.

Powered by vBulletin®
Copyright ©2008 - 2013
Template-Modifikationen durch TMS