Clone of Akilla's acserver @ https://github.com/deregtd/ACServer

ClientAdapter.cpp 7.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. // ClientAdapter.cpp : Defines the entry point for the DLL application.
  2. //
  3. #include "stdafx.h"
  4. #include "ClientAdapter.h"
  5. #include "ApiHook.h"
  6. #include "Socket.h"
  7. static cUDPSocket *m_pSocket = NULL;
  8. // Functions for hooking from wsock32.dll
  9. int PASCAL bindF ( SOCKET s, const struct sockaddr FAR *name, int namelen ); // 2
  10. int PASCAL closesocketF ( SOCKET s ); // 3
  11. int PASCAL getsockoptF ( SOCKET s, int level, int optname, char FAR *optval, int FAR *optlen ); // 7
  12. int PASCAL ioctlsocketF ( SOCKET s, long cmd, u_long FAR *argp ); // 12
  13. int PASCAL recvfromF ( SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR* from, int FAR* fromlen ); // 17
  14. int PASCAL selectF ( int nfds, fd_set FAR *readfds, fd_set FAR *writefds, fd_set FAR *exceptfds, const struct timeval FAR *timeout ); // 18
  15. int PASCAL sendtoF ( SOCKET s, const char FAR *buf, int len, int flags, const struct sockaddr FAR *to, int tolen ); // 20
  16. int PASCAL setsockoptF ( SOCKET s, int level, int optname, const char FAR *optval, int optlen ); // 21
  17. SOCKET PASCAL socketF ( int af, int type, int protocol ); // 23
  18. int PASCAL WSAStartupF ( WORD wVersionRequested, LPWSADATA lpWSAData ); // 115
  19. int PASCAL WSACleanupF (); // 116
  20. static cHookDescriptor _hooks[] = {
  21. { eByOrdinal, _T( "wsock32.dll" ), _T( "bind" ), 2, reinterpret_cast< DWORD > ( bindF ), 0 },
  22. { eByOrdinal, _T( "wsock32.dll" ), _T( "closesocket" ), 3, reinterpret_cast< DWORD > ( closesocketF ), 0 },
  23. { eByOrdinal, _T( "wsock32.dll" ), _T( "getsockopt" ), 7, reinterpret_cast< DWORD > ( getsockoptF ), 0 },
  24. { eByOrdinal, _T( "wsock32.dll" ), _T( "ioctlsocket" ), 12, reinterpret_cast< DWORD > ( ioctlsocketF ), 0 },
  25. { eByOrdinal, _T( "wsock32.dll" ), _T( "recvfrom" ), 17, reinterpret_cast< DWORD >( recvfromF ), 0 },
  26. { eByOrdinal, _T( "wsock32.dll" ), _T( "select" ), 18, reinterpret_cast< DWORD > ( selectF ), 0 },
  27. { eByOrdinal, _T( "wsock32.dll" ), _T( "sendto" ), 20, reinterpret_cast< DWORD > ( sendtoF ), 0 },
  28. { eByOrdinal, _T( "wsock32.dll" ), _T( "setsockopt" ), 21, reinterpret_cast< DWORD > ( setsockoptF ), 0 },
  29. { eByOrdinal, _T( "wsock32.dll" ), _T( "socket" ), 23, reinterpret_cast< DWORD > ( socketF ), 0 },
  30. { eByOrdinal, _T( "wsock32.dll" ), _T( "WSAStartup" ), 115, reinterpret_cast< DWORD > ( WSAStartupF ), 0 },
  31. { eByOrdinal, _T( "wsock32.dll" ), _T( "WSACleanup" ), 116, reinterpret_cast< DWORD > ( WSACleanupF ), 0 },
  32. { eByOrdinal, _T( "fsock32.dll" ), _T( "bind" ), 2, reinterpret_cast< DWORD > ( bindF ), 0 },
  33. { eByOrdinal, _T( "fsock32.dll" ), _T( "closesocket" ), 3, reinterpret_cast< DWORD > ( closesocketF ), 0 },
  34. { eByOrdinal, _T( "fsock32.dll" ), _T( "getsockopt" ), 7, reinterpret_cast< DWORD > ( getsockoptF ), 0 },
  35. { eByOrdinal, _T( "fsock32.dll" ), _T( "ioctlsocket" ), 12, reinterpret_cast< DWORD > ( ioctlsocketF ), 0 },
  36. { eByOrdinal, _T( "fsock32.dll" ), _T( "recvfrom" ), 17, reinterpret_cast< DWORD >( recvfromF ), 0 },
  37. { eByOrdinal, _T( "fsock32.dll" ), _T( "select" ), 18, reinterpret_cast< DWORD > ( selectF ), 0 },
  38. { eByOrdinal, _T( "fsock32.dll" ), _T( "sendto" ), 20, reinterpret_cast< DWORD > ( sendtoF ), 0 },
  39. { eByOrdinal, _T( "fsock32.dll" ), _T( "setsockopt" ), 21, reinterpret_cast< DWORD > ( setsockoptF ), 0 },
  40. { eByOrdinal, _T( "fsock32.dll" ), _T( "socket" ), 23, reinterpret_cast< DWORD > ( socketF ), 0 },
  41. { eByOrdinal, _T( "fsock32.dll" ), _T( "WSAStartup" ), 115, reinterpret_cast< DWORD > ( WSAStartupF ), 0 },
  42. { eByOrdinal, _T( "fsock32.dll" ), _T( "WSACleanup" ), 116, reinterpret_cast< DWORD > ( WSACleanupF ), 0 },
  43. }; // 22
  44. BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
  45. {
  46. if ( ul_reason_for_call == DLL_PROCESS_ATTACH )
  47. DisableThreadLibraryCalls ( hModule );
  48. return TRUE;
  49. }
  50. static DWORD g_dwIP;
  51. static std::string g_strUsername;
  52. static std::string g_strPassword;
  53. static short g_sConnPort;
  54. // This is an example of an exported function.
  55. extern "C" CLIENTADAPTER_API void InitClientAdapter ( DWORD dwIP, char *username, char *password, short ConnPort )
  56. {
  57. in_addr addr;
  58. addr.S_un.S_addr = dwIP;
  59. TCHAR szMessage[ 255 ];
  60. ::_stprintf ( szMessage, _T( "Initialize Client Adapter: IP=%s, username=%s, password=%s" ),
  61. inet_ntoa ( addr ), username, password );
  62. g_dwIP = dwIP;
  63. g_strUsername = username;
  64. g_strPassword = password;
  65. g_sConnPort = ConnPort;
  66. DWORD dwPrevProtect;
  67. /* DWORD PatchLoc = 0x475A54, PatchSize=2;
  68. for (DWORD i=PatchLoc;i<PatchLoc+PatchSize;i+=2)
  69. {
  70. WORD *pwTest = reinterpret_cast< WORD * > ( i );
  71. ::VirtualProtect ( pwTest, sizeof ( WORD ), PAGE_EXECUTE_READWRITE, &dwPrevProtect );
  72. *pwTest = 0x9090;
  73. }*/
  74. hookFunctions ( _hooks, 22, true );
  75. }
  76. int PASCAL bindF ( SOCKET s, const struct sockaddr FAR *name, int namelen )
  77. {
  78. _ASSERTE ( m_pSocket != NULL );
  79. _ASSERTE ( m_pSocket->getSocket () == s );
  80. // We don't bind to a local socket - just connect
  81. return 0;
  82. }
  83. int PASCAL closesocketF ( SOCKET s )
  84. {
  85. _ASSERTE ( m_pSocket != NULL );
  86. _ASSERTE ( m_pSocket->getSocket () == s );
  87. delete m_pSocket;
  88. m_pSocket = NULL;
  89. return 0;
  90. }
  91. int PASCAL getsockoptF ( SOCKET s, int level, int optname, char FAR *optval, int FAR *optlen )
  92. {
  93. _ASSERTE ( m_pSocket != NULL );
  94. _ASSERTE ( m_pSocket->getSocket () == s );
  95. return getsockopt ( s, level, optname, optval, optlen );
  96. }
  97. int PASCAL ioctlsocketF ( SOCKET s, long cmd, u_long FAR *argp )
  98. {
  99. _ASSERTE ( m_pSocket != NULL );
  100. _ASSERTE ( m_pSocket->getSocket () == s );
  101. static DWORD commands[] = {
  102. FIONREAD,
  103. FIONBIO,
  104. FIOASYNC,
  105. SIOCSHIWAT,
  106. SIOCGHIWAT,
  107. SIOCSLOWAT,
  108. SIOCGLOWAT,
  109. SIOCATMARK, };
  110. return ioctlsocket ( s, cmd, argp );
  111. }
  112. int PASCAL recvfromF ( SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR* from, int FAR* fromlen )
  113. {
  114. _ASSERTE ( m_pSocket != NULL );
  115. _ASSERTE ( m_pSocket->getSocket () == s );
  116. return m_pSocket->recvfrom ( buf, len, flags, from, fromlen );
  117. }
  118. int PASCAL selectF ( int nfds, fd_set FAR *readfds, fd_set FAR *writefds, fd_set FAR *exceptfds, const struct timeval FAR *timeout )
  119. {
  120. _ASSERTE ( m_pSocket != NULL );
  121. return m_pSocket->select ( readfds, writefds, exceptfds, timeout );
  122. }
  123. int PASCAL sendtoF ( SOCKET s, const char FAR *buf, int len, int flags, const struct sockaddr FAR *to, int tolen )
  124. {
  125. _ASSERTE ( m_pSocket != NULL );
  126. _ASSERTE ( m_pSocket->getSocket () == s );
  127. return m_pSocket->sendto ( buf, len, flags, to, tolen );
  128. }
  129. int PASCAL setsockoptF ( SOCKET s, int level, int optname, const char FAR *optval, int optlen )
  130. {
  131. _ASSERTE ( m_pSocket != NULL );
  132. _ASSERTE ( m_pSocket->getSocket () == s );
  133. return setsockopt ( s, level, optname, optval, optlen );
  134. }
  135. SOCKET PASCAL socketF ( int af, int type, int protocol )
  136. {
  137. _ASSERTE ( m_pSocket == NULL );
  138. m_pSocket = new cUDPSocket ( g_dwIP, g_strUsername.c_str (), g_strPassword.c_str (), g_sConnPort );
  139. _ASSERTE ( m_pSocket->getSocket () != 0 );
  140. return m_pSocket->getSocket ();
  141. }
  142. int PASCAL WSAStartupF ( WORD wVersionRequested, LPWSADATA lpWSAData )
  143. {
  144. _ASSERTE ( m_pSocket == NULL );
  145. return WSAStartup ( wVersionRequested, lpWSAData );
  146. }
  147. int PASCAL WSACleanupF ()
  148. {
  149. _ASSERTE ( m_pSocket == NULL );
  150. return WSACleanup ();
  151. }