Here is how to connect to any server without altering the client exe at all. This can be done via DLL injection using the Detours library from Microsoft:
Code:
/**
* Detour Prototypes
*/
extern "C"
{
int /**/(WINAPI *Real_connect)(SOCKET, const struct sockaddr*, int) = connect;
};
/**
* winsock2!connect Detour Callback
*/
int __stdcall Mine_connect(SOCKET s, const struct sockaddr* name, int namelen)
{
auto saddr = (sockaddr_in*)name;
// Check if this is a login attempt..
if (saddr->sin_port >= htons(4000) && saddr->sin_port <= htons(4013))
{
auto naddr = HookCore::instance().m_ConfigurationManager->GetConfigString("noshook", "override_server_addr");
auto nport = HookCore::instance().m_ConfigurationManager->GetConfigInt("noshook", "override_server_port", 4001);
saddr->sin_addr.s_addr = inet_addr(naddr);
saddr->sin_port = htons(nport);
}
return Real_connect(s, name, namelen);
}
// Apply the mutex detour:
::DetourTransactionBegin();
::DetourUpdateThread(::GetCurrentThread());
::DetourAttach(&(PVOID&)Real_connect, Mine_connect);
::DetourTransactionCommit();