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.
Há 1 usuários navegando neste tópico. (0 registrados e 1 visitantes)
Regras do Fórum