Download tmsrv.exe + tmsrv.map (v.1.2). [Only registered and activated users can see links. Click Here To Register...]
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:
Citação:
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:
Citação:
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
Citação:
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:
Citação:
// 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.