Cara não é questão de medo, é questão de que já tem tutorias MUITO bem explicados na internet, e ajudar é uma coisa, fazer pra você é outra totalmente diferente.
Se você não tem capacidade de realizar um hook em um GameServer, como espera fazer todo o resto, sendo que o hook esta entre os mais simples dos passos?
Mais para não ficar apenas jogando palavras ao vento e ainda ser taxado como arrogante, vou tentar facilitar as coisas pra você.
No seu projeto, inclua esses dois arquivos aqui.
MuMsg.cpp
#include "Library.h"
#include "MuMsg.h"
CMsg::CMsg()
{
memset(&this->MsgDefault, 0x00, sizeof(this->MsgDefault));
this->MsgHead = NULL;
strcpy(this->MsgDefault, "Msg Error");
}
CMsg::~CMsg()
{
this->MsgFree();
}
void CMsg::LoadWTF(LPSTR File)
{
FILE* FileWTF;
fopen_s(&FileWTF, File, "rb");
if(FileWTF == NULL)
{
MessageBoxA(NULL, File, "Error", MB_OK|MB_APPLMODAL);
return;
}
if(this->MsgListInit() != NULL)
{
fread(&this->LoadHeader, 28, 1, FileWTF);
if(this->LoadHeader.HeadCode != 0xCC)
{
MessageBoxA(NULL, "TextCode Type Wrong.", "Error", MB_OK|MB_APPLMODAL);
}
else if((this->LoadHeader.Version - 1) != 0)
{
MessageBoxA(NULL, "Áö¿øÇÏÁö ¾Ê´Â ¹öÁ¯ µ¥ÀÌÅÍ ÀÔ´Ï´Ù.", "Error", MB_OK|MB_APPLMODAL);
}
else
{
this->DataFileLoad(FileWTF);
}
fclose(FileWTF);
}
}
LPSTR CMsg::Get(BOOL Index)
{
if(Index >= 0 && Index < 32768)
{
if(this->MsgIndex[Index] == 0)
{
return this->MsgDefault;
}
if(this->MsgIndex[Index]->Msg == 0)
{
return this->MsgDefault;
}
if(*this->MsgIndex[Index]->Msg == 0)
{
return this->MsgDefault;
}
return (LPSTR)this->MsgIndex[Index]->Msg;
}
return (LPSTR)this->MsgDefault;
}
void CMsg::MsgFree()
{
for(int n = 0; n < 32768; n++)
{
if(this->MsgIndex[n] != 0)
{
delete[] this->MsgIndex[n]->Msg;
delete this->MsgIndex[n];
}
}
}
void CMsg::MsgListPrint()
{
for(int n = 0; n < 32768 ;n++)
{
if(this->MsgIndex[n] != 0)
{
MessageBoxA(NULL, (LPSTR)this->MsgIndex[n]->Msg, "Message", MB_OK);
}
}
}
DWORD CMsg::MsgListInit()
{
MSGSTRUCT* Msg = new MSGSTRUCT;
if(Msg == NULL)
{
MessageBoxA(NULL, "Memory Allocation Error (MuMsg)", "Error", MB_OK);
return FALSE;
}
Msg->Next = NULL;
Msg->Number = NULL;
Msg->Msg = NULL;
memset(&this->MsgIndex, 0x00, sizeof(this->MsgIndex));
return TRUE;
}
DWORD CMsg::MsgListAdd(DWORD Index, LPBYTE Msg)
{
char* Pointer;
int MsgLen;
MsgLen = strlen((LPSTR)Msg);
if(MsgLen >= 1)
{
this->MsgIndex[Index] = new MSGSTRUCT;// this->MsgListNew();
if(this->MsgIndex[Index] == NULL)
{
MessageBoxA(NULL, "Memory Allocation Error #2(MuMsg)", "Error", MB_OK);
return FALSE;
}
Pointer = new char[MsgLen+1];
if(Pointer != NULL)
{
this->MsgIndex[Index]->Number = Index;
if(Index >= NULL || Index < 32767)
{
this->MsgIndex[Index]->Msg = (LPBYTE)Pointer;
strcpy((char*)this->MsgIndex[Index]->Msg, (char*)Msg);
return TRUE;
}
else
{
MessageBoxA(NULL, "Message Index Table Make Error", "Error", MB_OK);
return FALSE;
}
}
}
return TRUE;
}
void CMsg::XorBuffer(LPSTR Buffer, DWORD Len)
{
if(Len <= NULL)
return;
for(unsigned int i = 0; i < Len; i++)
Buffer
= Buffer^0xCA;
}
void CMsg:ataFileLoad(FILE* File)
{
BYTE Temp[255];
DWORD Max;
WORD Index;
WORD Len;
Max = this->LoadHeader.Count;
if(Max <= NULL)
{
MessageBoxA(NULL, "Modification error data while reading", "Error", MB_OK|MB_APPLMODAL);
return;
}
while(Max--)
{
memset(&Temp, 0, sizeof(Temp));
fread(&Index, 2, 1, File);
fread(&Len, 2, 1, File);
fread(Temp, Len, 1, File);
Temp[Len] = 0;
this->XorBuffer((LPSTR)Temp, Len);
this->MsgListAdd(Index, (LPBYTE)Temp);
}
}
MuMsg.h
#pragma once
struct MSGSTRUCT
{
MSGSTRUCT* Next; // 0
DWORD Number; // 4
LPBYTE Msg; // 8
};
struct CHeader
{
BYTE HeadCode; // 0
BYTE Version; // 1
char Caption[21];// 2
DWORD Count; // 18
};
class __declspec(dllexport) CMsg
{
private:
void MsgFree();
void MsgListPrint();
DWORD MsgListInit();
DWORD MsgListAdd(DWORD, LPBYTE);
//
void XorBuffer(LPSTR, DWORD);
void DataFileLoad(FILE*);
protected:
MSGSTRUCT* MsgHead; // 0
MSGSTRUCT* MsgCurr; // 4
MSGSTRUCT* MsgIndex[32768]; // 8
//
CHeader LoadHeader; // 20008
//
char MsgDefault[50];// 20024
public:
CMsg();
~CMsg();
//
void LoadWTF(LPSTR);
LPSTR Get(BOOL);
};
no seu projeto crie também um arquivo chamado:
Exports.def (se liga na extensão, ele é .DEF) e insira o seguinte código
LIBRARY MuMsg
Agora na raiz do seu projeto, recolhendo todas as pastas, até ficar assim:
Clique com o Botão Auxiliar sobre ele, e vá em Properties.
Na aba da sua lateral esquerda, procure por Linker, e dentro de Linker navegue até Input.
Em Input, no lado direito abrirá as seções, procure por Module Definition File
Nele coloque o nome do seu arquivos de Exportação, aquele com o formato .DEF agora quando compilar sua dll, mude o nome dela para mumsg.dll, ou já compile com o nome MuMsg.dll
Fazendo isso, não haverá necessidade de você realizar o hook pelo olly, e nesse caso não terá necessidade de usar Assembly.
Se a versão que você for trabalhar não for 97d, esqueça esse método e vai quebrar a cabeça com Assembly mesmo, já tem muitos tutorias explicando na internet, e alguns muito bem explicados, se não tiver aqui, use o Google.