Ir para conteúdo
Faça parte da equipe! (2024) ×

tutorial SendToServer - Do zero até enviar ao Servidor


qqshutup
 Compartilhar

Posts Recomendados

 

Decidi trazer um tutorial para aqueles que não sabem como manusear a send to server ao seu favor, será passo a passo.

 

1 - Precisamos achar o endereço da CLTClient::SendToServer.

Para isso basta abrir o Engine.exe em seu IDA e pesquisar por CLTClient::SendToServer.

W15SE9B.png

 

Basta ir até onde ela está ( .rdata ) e pressionar a tecla 'x' para ver as referências ( são duas ), ambas dentro da mesma função.

1hVksrq.png

 

Como pode ver ele foi até onde a string está sendo utilizada.

1AOZpe5.png

 

Agora basta subir até o início dessa função, você verá o endereço da função em sub_ENDEREÇO e também podem ver que o this está presente no em seu primeiro argumento através da própria função ( ou dentro da cshell, pois o lt_client será movido para o ecx ).

RsVpc4R.png

 

OK, agora temos o endereço da função que é 47D880, então vamos fazer um hook, mas antes vamos ver sua sintaxe.

 

Simbol Undecorated do PDB do CA Classic: ?SendToServer@CLTClient@@UAEIPAVILTMessage_Read@@I@Z

Se utilizarem uma tool chamada undname que vem instalado junto ao Visual Studio, o simbolo decorado não apresenta this.

xEKZwgC.png

 

Mas ele está lá, e também o PDB mostra o uso da classe ILTMessage_Read quando na verdade a versão usada é a CLTMessage_Read_Client.

Como eu sei disso?

Eu peguei o ponteiro e joguei no Cheat Engine -> Tools -> Dissect Data Structures e como ele consegue recuperar o RTTI de classes, mostrou CLTMessage_Read_Client e o IDA também mostra ela sendo a versão mais derivada.

soyrsxQ.png

 

Então vamos considerar a função abaixo.

É necessário se cadastrar para acessar o conteúdo.

Vamos usar o MinHook ( The Minimalistic x86/x64 API Hooking Library for Windows ) para isso.

 

Antes precisamos iniciar o MinHook

É necessário se cadastrar para acessar o conteúdo.

Vamos preparar nosso alias para ponteiro de função.

É necessário se cadastrar para acessar o conteúdo.

Agora vamos criar nossa função para fazer nosso hook na SendToServer.

É necessário se cadastrar para acessar o conteúdo.

Agora criamos o hook e ativamos ele.

É necessário se cadastrar para acessar o conteúdo.

O nosso hook está feito.

 

Vamos começar aprendendo a enviar mensagem para o servidor.

Precisamos criar a mensagem utilizando uma função chamada create_message ( que vai chamar um wrapper de alloc dentro da clt_message_write_client, fora da vtable ) presente na classe CLTCommonClient.

 

Estrutura da create_message:

É necessário se cadastrar para acessar o conteúdo.

 

É necessário se cadastrar para acessar o conteúdo.

 

Se você não tem a classe CLTClient utilize meu tópico: 

 

E caso não tenha a CLTCommonClient, o index na vtable para a função create_message é o 9 ou offset 0x24.

Continuando..

 

Um adendo.

O primeiro ID da mensagem é sempre um std::uint8_t e indica do que se trata toda a mensagem ( obviamente o servidor precisa de uma referência para entender o que precisa ler ).

 

Esses dois exemplos não vão fazer nada em nenhum jogo, pois acabei de inventar para demonstrar.

É necessário se cadastrar para acessar o conteúdo.

Agora vamos entender como pegar um id dentro da SendToServer e trocar valores dele.

É necessário se cadastrar para acessar o conteúdo.

Perfeito, agora já sabemos como enviar para o servidor e como ler e editar o que vai para o servidor.

 

Mas calma ai, ainda não falei como vocês vão descobrir como a mensagem foi montada, não basta converter tudo em uint8 e achar que é o brabo..

A primeira maneira é você, dentro de sua hook na sendtoserver chamar uma função intrínseca chamada _ReturnAddress, que vai dizer o endereço de onde a SendToServer foi chamada.

É necessário se cadastrar para acessar o conteúdo.

Obviamente essa maneira não é tão fácil assim.

Uma melhor mas que ainda vai exigir engenharia reversa é você pegar o PDB do CA CLASSIC e olhar no IDA as funções, criando pattern do CABR para funcionar no CA CLASSIC em uma versão de dois anos atrás. Não é difícil mas deixa mais fácil o trabalho, pois o PDB deixa os nomes, inclusive de variáveis expostos.

Você pode encontrar o PDB em: Lithtech Archive

 

E além de fazer isso, você pode fazer hook em toda a VTABLE da clt_message_write_client e printar tudo que é chamado ( meu logger faz algo desse tipo ).

Depois é só usar o IDA para entender o que são os VALORES enviados na mensagem.

 

Bom, acredito que ninguém nunca fez um tutorial assim sobre SendToServer.

 

Créditos

qqshutup

 

E dê bônus para vocês, vai toda minha classe que reverti.. clt_message_read_client, clt_message_write_client, ilt_ref_count, cpacket_data, cpacket_read e cpacket_write..

Spoiler
É necessário se cadastrar para acessar o conteúdo.
É necessário se cadastrar para acessar o conteúdo.
É necessário se cadastrar para acessar o conteúdo.
É necessário se cadastrar para acessar o conteúdo.
É necessário se cadastrar para acessar o conteúdo.
É necessário se cadastrar para acessar o conteúdo.

 

 

 

 

Editado por qqshutup

CONTA DESATIVADA

 

Link para o comentário
Compartilhar em outros sites

Link para o comentário
Compartilhar em outros sites

Participe da Conversa

Você pode postar agora e se cadastrar mais tarde. Cadastre-se Agora para publicar com Sua Conta.
Observação: sua postagem exigirá aprovação do moderador antes de ficar visível.

Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.

 Compartilhar

×
×
  • Criar Novo...

Informação Importante

Nós fazemos uso de cookies no seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies , caso contrário, vamos supor que você está bem para continuar.