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ÿå!")) != 0 ) 
		
	
 Ich denke das reicht für den Anfang 
 
Greez