Twitter Facebook Google Plus Linkedin email

Le protocole COD4 et les clefs CD

Lors de mon précédent post j'avais expliqué comment était calculé le pb_guid à partir de la clef CD. Cela m'a donné envie d'examiner un peu plus en profondeur le protocole COD4 afin de voir de quelle façon sont vérifiées les clefs CD.




Dans cet article je ferai un point sur :
  1. Le protocole de validation de clef COD4
  2. S'il est possible de générer une clef valide à partir d'un keygen
  3. Les trojans key stealers et le vol de clef CD
  4. 4) Comment être TOP EU sur clanbase
  • Le protocole

COD4 utilise en partie le protocole q3engine dont les sources sont disponibles ici. Ce protocole fonctionne avec un serveur principal (Master) qui s'occupe de recenser les serveurs en ligne et de vérifier la validité des clefs.

Voici un extrait de l'échange entre le Master et un serveur lors du démarrage de ce dernier :
server => master:20810
heartbeat COD-4.

master:20810 => server
getchallenge -1523121167

master:20810 => server
getstatus -1523121167

server => master:20800
getIpAuthorize 611600408 63.146.124.21 "" 0

server => master:20810
statusResponse
g_compassShowEnemies?g_gametypewargamenameCall of Duty 4mapnamemp_backlotprotocol6shortversion1.7sv_allowAnonymous?sv_disableClientConsole?sv_floodprotect1sv_hostnameDiggysv_maxclients12sv_maxPing?sv_maxRate25000sv_minPing?sv_privateClients?sv_punkbuster1sv_pure1sv_voice?ui_maxclients32challenge-1523121167pswrd?mod?

client => server
getinfo xxx

server => client
infoResponse
challengexxxprotocol6hostnameDiggymapnamemp_backlotsv_maxclients12gametypewarpure1kc1hw2mod?voice?pb1

server => master
heartbeat flatline.

Dès que le serveur démarre il envoie un message "heartbeat" pour informer le master que le serveur est en ligne. Il continuera d'envoyer le message "heartbeat" toutes les 5 minutes pour montrer sa présence en ligne. Lorsque le serveur s'arrête il envoie alors un message "heartbeat flatline" pour signaler au master son passage hors ligne.

Le master va alors répondre en envoyant le message "getchallenge" ainsi que le message "getstatus" . Le message getchallenge permet au Master d'authentifier le serveur de jeu, le master l'ajoutera à sa liste uniquement si le serveur répond avec le message "getIpAuthorize" suivi d'un numéro de challenge et de l'ip du Master.

Une fois le serveur de jeu identifié auprès du master, il peut recevoir 2 types de messages :

  • _Les messages "connectionless" qui représente les messages envoyés par des clients ou des browsers de serveur de jeu (gamespy/All Seeing Eye), ces messages sont getstatus, getinfo, getchallenge, connect, ipAuthorize, rcon .
  • _Les messages en rapport avec les clients connectés (les joueurs , les pgms et les noobs).

Connexion d'un client :
client => master:20800
getKeyAuthorize 0 ABCD-0123-4567-89AB PB 1c8f2b0836a17b0186c8b207fd688e68

client => server
getchallenge 0 "1c8f2b0836a17b0186c8b207fd688e68"

server => master:20800
getIpAuthorize 1204470709 89.3.249.119 "" 0 PB "1c8f2b0836a17b0186c8b207fd688e68"

master:20800 => server
ipAuthorize 1204470709 accept KEY_IS_GOOD 541288 1c8f2b0836a17b0186c8b207fd688e68

server => client
challengeResponse 1204470709

client => server
connect "cg_predictItems1cl_anonymous?cl_punkbuster1cl_voice?cl_wwwDownload1rate25000snaps30namepierzprotocol6challenge1204470709qport-5676"

server => client
connectResponse

On arrive à la partie qui nous intéresse : la connexion du client. Avant de se connecter à un serveur, le client envoie sa clef CD ainsi que son PB_GUID au serveur master via le message getKeyAuthorize.

Cela permet au master d'associer l'adresse ip d'un client avec une clef CD et un GUID. Le client envoie ensuite au serveur un message getchallenge suivi de son pb_guid . Le serveur va alors demander au master si la clef correspondant à ce guid et cette ip est valide.

Le master va répondre au serveur avec le message "ipAuthorize" de différente façon :

  • KEY_IS_GOOD : la clef est valide, le client sera accepté par le serveur.
  • INVALID_CDKEY : la clef est invalide, le client ne pourra pas se connecter au serveur.
  • CLIENT_UNKNOWN_TO_AUTH : le message getKeyAuthorize envoyé par le client n'a pas été reçu par le serveur ou bien il a été reçu mais à partir d'une autre ip, le client ne pourra pas se connecter (j'ai d'ailleurs remarqué que le message getKeyAuthorize était envoyé 2 fois par le client pour éviter les UDP packet loss).

Sur cod 1 et cod 2 il suffisait d'éditer le fichier hosts en ajoutant la ligne: "127.0.0.1 cod2master.activision.com" pour créer un serveur cracké car le serveur refusait la connexion d'un client uniquement s'il recevait le message INVALID_CDKEY, s'il ne recevait pas de message le client était quand même autorisé à se connecter.

Sur cod4 le serveur attend obligatoirement une réponse au message "getIpAuthorize" c'est pourquoi il faut utiliser le "no wait patch" dispo sur gamecopyworld , qui émule les autorisations de clefs CD.

S'ensuit l'échange de challenge pour authentifier le client et la confirmation de connexion au serveur avec les messages "challengeResponse" , "connect" et "connectResponse" . Ces messages ne nous intéressent pas vraiment, car on a assez d'information pour réaliser notre vérificateur de clef CD.

  • Générer des clefs CD valides ?

Pour expérimenter tout çà j'ai réalisé un petit tool qui test des clefs CD, j'en ai générées + de 10 millions via l'algo du keygen razor. Résultat : "EPIC FAIL", aucune n'était valide ! Donc n'essayez pas de générer plusieurs clefs avec un keygen dans l'espoir d'avoir un jour une clef valide :)

Je ne release pas le tool car il est inefficace et peu causer un DOS s'il est utilisé en masse.

Cependant voici un extrait du code qui résume bien le principe du programme :
//pour chaque clef CD

//on calcule le GUID correspondant
cod4key2guid(formatkey,guid);

//on s'identifie auprès du serveur Master (émulation du client)
sprintf(l_buffer,"ÿÿÿÿgetKeyAuthorize 0 %s PB %s",formatkey,guid);
sendto(listen_s,l_buffer,strlen(l_buffer),0,(struct sockaddr*)&masterAddr,sizeof(masterAddr)).
Sleep(250);

//on simule une connexion de ce même client sur un serveur (émulation du serveur)
sprintf(l_buffer,"ÿÿÿÿgetIpAuthorize %d %s "" 0 PB "%s"",challenge,localIp,guid);
sendto(listen_s,l_buffer,strlen(l_buffer),0,(struct sockaddr*)&masterAddr,sizeof(masterAddr))

//On recoit la réponse
recvfrom(listen_s,l_buffer,BUFFERSIZE,0,(struct sockaddr*)&fromAddr,&fromSize )

if( strstr(l_buffer,"KEY_IS_GOOD") ){
//JACKPOT
}else if( strstr(l_buffer,"INVALID_CDKEY") ){
//
  • D'autres moyen pour obtenir des clefs cd

Obtenir une clef CD gratuitement est difficile,mais il reste encore un moyen : le vol. La clef CD cod4 est stocké dans le registre à cette adresse : HKEY_LOCAL_MACHINESOFTWAREActivisionCall of Duty 4 codkey .

Il est facile de la récupérer à partir du moment où on a accès à la machine, de nombreux trojan intègre cette fonctionnalité, c'est pourquoi certains développeurs ont pris des mesures : c'est le cas du jeu Battlefield 2 qui à partir du patch 1.03 chiffre la clef CD du registre en fonction du hardware (mais je suppose qu'avec un peu de reverse engineering ont doit pouvoir récupérer l'original).

Maintenant le problème est le vecteur d'infection : Comment avoir un accès à l'ordinateur d'un joueur de cod4 ?

Idée n°1 (La moins efficace) : Installer un serveur cod4 et se démerder pour avoir un maximum de joueurs, à partir de là vous pouvez récupérer les adresses ips des joueurs. L'inconvénient est que de nos jours exploiter un windows XP à distance de cette façon est difficile; principalement à cause des routeurs/firewall puis à cause des services désactivés par les AV, mais les pcs vulnérables existent toujours.

Idée n°2 (Ultra efficace) : Prendre le contrôle de sites relatifs à ces jeux, typiquement : les communautés de joueurs, les forums, ceux proposant des tournois/ladder ou encore les sites de cheats. Là on sait que les visiteurs ont quasiment tous cod4 installés, donc une fois le site hacké , on peut mettre en place un mpack (exploiter ie est déjà beaucoup plus réaliste qu'exploiter une faille LSASS ; ) , binder les exécutables proposés par le site ou carrément forcer le téléchargement etc.

Il faut savoir que certain site de cheat vendent des clefs CD, je n'ai aucune idée de leur origine, mais si elles ne proviennent pas d'Activision, il est fort probable qu'elles proviennent des key stealers...

En parlant de cheat, j'espère pouvoir vous expliquer prochainement comment sont réalisés les Wallhack/Aimbots et autre merde en tout genre sur cod4.