Início Curiosidades Engenharia reversa em cheats no CS-GO

Engenharia reversa em cheats no CS-GO

1389

 

 CS: GO é um dos jogos online competitivos mais populares, tem 520.285 jogadores atuais enquanto escrevo essas linhas. Como em qualquer outro jogo dirigido pela competição, surgem trapaceiros e especialmente na comunidade CS, eles se tornaram um problema sério.

Hoje estamos a ver a versão pública e privada de uma fraude para este jogo!Não vou mencionar o nome da filho da puta para evitar dar-lhes publicidade gratuita e porque não é necessário para esta publicação, mas se você estiver neste tópico, você provavelmente adivinhará.Antes de começar, é importante mencionar que consegui obter uma versão privada usando um canal alternativo 😈. 
Isso significa que eu nunca paguei para o desenvolvedor, então eu não apoiei seus negócios de forma alguma ! Maldito seja, trapaceiros!

Versão pública vs particular

Esta versão é bastante acessível, pois o desenvolvedor fornece uma versão pública (gratuita) com todos os recursos para os usuários tentarem. A “desvantagem” mais importante, é que a fraude pública é obviamente detectada pela VAC , então, se você usá-lo em um servidor protegido por VAC, é uma questão de tempo que sua conta seja banida pelo VAC.

Aqui é onde a versão privada paga entra em jogo: os clientes obtêm uma compilação única que é garantida para ser detectada.

Licenciamento

Cada versão privada está ligada a uma máquina, para evitar a pirataria, revenda, etc …

O procedimento de licença obtém a variável de ambiente SystemDrive e usando DeviceIoControlcom o parâmetro IOCTL_DISK_GET_DRIVE_GEOMETRY , lê as capacidades técnicas do disco rígido.Em seguida, a Cadeia da Marca do Processador também é lida usando a instrução do CPU .

Esta informação é formatada em uma string, hash com SHA1 e mutada com um algoritmo de rotação ASCII personalizado:

  Para (i = 0; i <v16; v16 = strlen ((const char *) & sha1_hex)) { 
  V18 = * ((char *) & sha1_hex + i); 
  Se ((int não assinado) (v18 - '0')> 9) 
  * ((_ BYTE *) & sha1_hex + i) = v18 + 5; 
  outro 
  * ((_ BYTE *) & sha1_hex + i) = v18 + '!'; 
  ++ i; 
  }

A cadeia resultante é a sua licença exclusiva, que é enviada ao desenvolvedor de truques quando você o compra e, em troca, você obtém uma compilação que só funciona no computador que gerou essa licença.

Como funciona a trapaça

Este cheat é um serviço externo , o que significa que todo o trabalho é feito fora do processo CS: GO (sem injeção DLL).

A primeira coisa que faz é abrir o processo csgo.exe e obter os endereços base de client.dll e engine.dll.

Em seguida, ele usa padrões para encontrar estruturas de jogos (offsets) na memória, esses padrões geralmente correspondem aos códigos opcionais dos binários do jogo, onde os ponteiros de memória são referenciados ou outras informações úteis. Eles também usam padrões para encontrar funções e strings do jogo.

Por exemplo, um dos padrões é:

  89 0D?  ?  ?  ?  8B 0D?  ?  ?  ?  8B F2 8B C1 83 CE 08

Se procuramos esses bytes no arquivo client.dll , obtemos o seguinte hit:

  0x102bdf1d 890de815f214 mov dword [0x14f215e8], ecx 
  0x102bdf23 8b0d5ccaec12 mov ecx, dword [0x12ecca5c] 
  0x102bdf29 8bf2 mov esi, edx 
  0x102bdf2b 8bc1 mov eax, ecx 
  0x102bdf2d 83ce08 ou esi, 8

O que significa que este padrão está procurando por uma dessas referências globais de memória presentes nas duas primeiras linhas de desmontagem.

Como dissemos, eles também usam padrões para localizar funções do jogo, por exemplo, com o seguinte padrão, a trapa localiza o início da função usada pelo jogo para executar comandos de console no jogo:

  55 8B EC 8B?  ?  ?  ?  ?  81 F9?  ?  ?  ?  75 0C A1?  ?  ?  ?  35?  ?  ?  ?  EB 05 8B 01 FF 50 34 50 A1

Este é encontrado em engine.dll :

  0x100aa300 55 push ebp 
  0x100aa301 8bec mov ebp, esp 
  0x100aa303 8b0d54345b10 mov ecx, dword [0x105b3454] 
  0x100aa309 81f938345b10 cmp ecx, 0x105b3438 
  = = 0x100aa30f 750c jne 0x100aa31d 
  |  0x100aa311 a168345b10 mov eax, dword [0x105b3468] 
  |  0x100aa316 3538345b10 xor eax, 0x105b3438 
  == <0x100aa31b eb05 jmp 0x100aa322 
  | `-> 0x100aa31d 8b01 mov eax, dword [ecx] 
  |  0x100aa31f ff5034 chamada dword [eax + 0x34] 
  `-> 0x100aa322 50 push eax 
  0x100aa323 a1f8325a10 mov eax, dword [0x105a32f8] 
  [...]

Se o cheat quiser executar um comando no console do jogo, ele pode alocar memória no processo do jogo, passar os argumentos para a função usando essa memória e criar um novo tópico usando CreateRemoteThread no início do procedimento.

Quando o cheat localizou tudo o que precisa para funcionar, ele iniciará um monte de threads que implementam cada uma das funcionalidades. Esses tópicos são responsáveis ​​por monitorar e manipular a memória do jogo usando as funções ReadProcessMemory e WriteProcessMemory .

Alterando os valores das estruturas de jogos internos à vontade, a cheat pode atingir as funcionalidades que oferece.

Eu identifiquei algumas das funções e as mudei de nome no meu pseudocódigo:

  CreateThread (0, 0, (LPTHREAD_START_ROUTINE) aimassist, 0, 0, 0); 
  CreateThread (0, 0, (LPTHREAD_START_ROUTINE) aimlock, 0, 0, 0); 
  CreateThread (0, 0, (LPTHREAD_START_ROUTINE) bunnyhop, 0, 0, 0); 
  CreateThread (0, 0, (LPTHREAD_START_ROUTINE) anti_flash, 0, 0, 0); 
  CreateThread (0, 0, (LPTHREAD_START_ROUTINE) sub_403F0E, 0, 0, 0); 
  CreateThread (0, 0, (LPTHREAD_START_ROUTINE) esp_hack, 0, 0, 0); 
  CreateThread (0, 0, (LPTHREAD_START_ROUTINE) radar_hack, 0, 0, 0); 
  CreateThread (0, 0, (LPTHREAD_START_ROUTINE) kill_message, 0, 0, 0); 
  Enquanto (! Byte_4F1081 
  ||  Byte_4F1054 
  ||  Byte_4F1082 
  ||  Byte_4F10C9 
  ||  Byte_4F1062 
  ||  Byte_4F1040 
  ||  Byte_4F1090 
  ||  Byte_4F1028) 
  Dormir (0x64u); 
  // Configuração padrão 
  Cfg_antiflash = 1; 
  Cfg_aimlock = 1; 
  Cfg_killmessage = 1; 
  Cfg_radarhack = 1; 
  Byte_4F1032 = 0; 
  Cfg_glowesp = 1; 
  Byte_4F10C0 = 0; 
  Cfg_bunnyhop = 1; 
  Cfg_aimassist = 1; 
  Cfg_reload (); 
  Enquanto (WaitForSingleObject (csgo_prochandler, 0)! = 0) 
  Cfg_changes_loop (); 
  CloseHandle (csgo_prochandler); 
  J_exit (0);

Proteção de versão privada

A versão pública é mal protegida, eles apenas criptografaram as cordas com um algoritmo simples, mas não tem obstrução de código ou embalagem de PE.

Por outro lado, a versão privada está protegida com Themida , um empacotador comercial que, dependendo da sua configuração, pode ser bastante eficaz para proteger os executáveis.

É muito provável que eles usem Themida para dois propósitos:

  1. Proteja a licença da trapaça de ser corrigida. O programa pode ser manipulado para validar qualquer licença quando executado em um computador, mas reconstruir uma versão totalmente funcional do executável embalado e o patch pode ser bastante complicado.
  2. O segundo e mais importante, evite que as assinaturas da VAC detectem sua fraude ao correr. Themida pode proteger os opcodes originais do programa quando é carregado na memória e executando, e escrever assinaturas (padrões) para esses códigos opcionais é um dos métodos que a VAC usa para detectar trapaceiros.

Fechamento

Se compararmos isso com outras truques, este é simples em termos de funcionalidade, mas ainda é bastante eficaz.

Tenha em mente que os binários CSGO utilizados para a análise não são da última atualização do jogo, como eu escrevi isso há uma semana. Os binários que usei são:

  942fa5d3ef9e0328157b34666327461cee10aae74b26af135b8589dc35a5abc7 client.dll 
  E6f3eda5877f2584aeb43122a85d0861946c7fb4222d0cb6f3bc30034e4d3e24 engine.dll 
  1a5bb2b0ae9f2e6ef757c834eeb2c360a59dce274b2e4137706031f629e6455f csgo.exe

Isso significa que as assinaturas do truque podem ter sido ligeiramente modificadas para funcionar com os novos executáveis, e as compensações provavelmente não serão as mesmas se esses binários mudassem na última versão do jogo.

Deixe seu comentário