Download tmsrv.exe + tmsrv.map (v.1.2). [Somente usuários registrados podem vem os links. ]

O arquivo .map é gerado contendo os simbolos de algum assembly.

Tendo o assembly (.exe, .dll, etc) e o .map, ajuda MUITO na hora de fazer engenharia reversa.

O .map contém, basicamente, TODAS as funções que o assembly contém, contém o RVA, address base, lib, e o protótipo das funções.

Basicamente, com o .map, você pode analizar as funções do tmsrv pelo nome, conseguir o endereço virtual relativo, o tipo de retorno, e os parametros que ela pede.

Se você ainda não entendeu pra que isso serve, vá estudar engenharia reversa.

Vou dar um exemplo e o resto é com vocês:


0001:0001e7e0 ?SendClientMessage@@YAXHPAD@Z 0041f7e0 f SendFunc.obj
Temos o endereço base (0001e7e0), o simbolo (?SendClientMessage@@YAXHPAD@Z), o rva+base (0041f7e0) e a lib (SendFunc.obj).

Essa função é a função de enviar aquela msg do client (packet 0x101).

Trocando em miúdos, o endereço da função SendClientMessage (que é a função que envia o packet 0x101 pro client) é 0x041f7e0. Os parametros e o retorno da função são os símbolos logo após o nome (@@YAXHPAD@Z). Veja a parte de name mangling q eu escrevi abaixo:

Name Mangling

Não vou aqui explicar o que é name mangling, se quiser saber, procure no google. Aqui vou apenas informar o que cada símbolo significa tomando como exemplo a função SendClientMessage:

Tipos Básicos:


D is char int8
E is unsigned char uint8
F is short int16
G is unsigned short uint16
H is int int32
I is unsigned int uint32
J is long int32
K is unsigned long uint32
M is float float32
N is double float64

X is void

_J is int 64 int64
_K is unsigned int 64 uint64
_N is bool
Ponteiros
PA = prefixo de algum tipo de ponteiro.
PB = prefixo de algum tipo de ponteiro constante (const).
Sabendo disso, vamos obter todos os parametros e o tipo de retorno da função, tendo em vista que os simbolos gerados pelo .map escrevem a função assim (em stdcall, o que é o caso da maioria das funções do tmsrv):

"?NomeDaFuncao @@YA TipoDeRetorno ListaDeParametro Z"

@@YA = cdecl
@@YG = stdcall

?SendClientMessage@@YAXHPAD@Z

Nome da função = SendClientMessage
@@YA = Memory Block (cdecl)
Tipo de retorno = "X" (void)
Lista de Parametros = "HPAD" (int32, int8*) {são 2 paramentros, o primeiro é um inteiro de 32 bits SIGNED, o segundo é um ponteiro para byte (int8 {8 bits**), ou seja, um ponteiro para char (char*), ou seja, uma string. (int, char*).

Provavelmente o primeiro argumento deve ser o ClientID, e o segundo, a string que será mostrada no client.

Um possivel uso para um FunctionPointer dessa função poderia ser:


// atribuição do function pointer SendClientMessage para o addr 0x041f7e0
int clientID;

// atribuição do clientID

SendClientMessage(clientID, "Essa é uma mensagem.")*
Bem... com esse texto espero que finalmente essa comunidade CRESÇA e não fiquem esperando alguem fazer, vá lá e faça você mesmo.

Só lembrando, esse tmsrv e .map são versão 1.2, a versão que o pessoal usa é a 1.7, os endereços são DIFERENTES, você ter que abrir a sua tmsrv, e a tmsrv 1.2, vá para a função na tmsrv.1.2, procure alguma instrução em assembly que talvez seja única daquela função, dê ctrl+f na sua tmsrv 1.7 e procure pela instrução, se tiver mais de uma ocorrencia da busca, vá procurando até aparecer uma função quase IDENTICA a da versão 1.2. Lembrando que talvez tenha mudado algo da versão 1.2 pra 1.7 naquela função, portanto você terá q analizar e testar as funções que se assemelhem (caso não ache nenhuma identica).

Flw.