utils-netredirect.cpp
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:6k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <stdarg.h>
  5. #include "common.h"
  6. /* Creates a packet data structure.
  7.  * Returns NULL if data is not a full packet, or a Packet structure.
  8.  * next is the offset of the next packet, in case data contains more than one packet.
  9.  */
  10. Packet *
  11. unpackPacket (const char *data, int len, int &next)
  12. {
  13. Packet *packet;
  14. if (len < 3)
  15. return NULL;
  16. packet = (Packet *) calloc (sizeof (Packet), 1);
  17. packet->ID = (unsigned char) data[0];
  18. memcpy (&(packet->len), data + 1, 2);
  19. if (len < packet->len) {
  20. free (packet);
  21. return NULL;
  22. }
  23. if (packet->len > 0)
  24. packet->data = (char *) data + 3;
  25. next = packet->len + 3;
  26. return packet;
  27. }
  28. SOCKET
  29. createSocket (int port)
  30. {
  31. sockaddr_in addr;
  32. SOCKET sock;
  33. DWORD arg = 1;
  34. sock = socket (AF_INET, SOCK_STREAM, 0);
  35. if (sock == INVALID_SOCKET)
  36. return INVALID_SOCKET;
  37. // Set to non-blocking mode
  38. ioctlsocket (sock, FIONBIO, &arg);
  39. addr.sin_family = AF_INET;
  40. addr.sin_port = htons (port);
  41. addr.sin_addr.s_addr = inet_addr ("127.0.0.1");
  42. while (OriginalConnectProc (sock, (struct sockaddr *) &addr, sizeof (sockaddr_in)) == SOCKET_ERROR) {
  43. if (WSAGetLastError () == WSAEISCONN)
  44. break;
  45. else if (WSAGetLastError () != WSAEWOULDBLOCK) {
  46. closesocket (sock);
  47. return INVALID_SOCKET;
  48. } else
  49. Sleep (10);
  50. }
  51. return sock;
  52. }
  53. // Checks whether a socket is still connected
  54. bool
  55. isConnected (SOCKET s)
  56. {
  57. fd_set fds;
  58. long count;
  59. timeval tv;
  60. tv.tv_sec = 0;
  61. tv.tv_usec = 1;
  62. FD_ZERO (&fds);
  63. FD_SET (s, &fds);
  64. count = OriginalSelectProc (1, NULL, &fds, NULL, &tv);
  65. return (bool) count;
  66. }
  67. // Checks whether there's data available from a socket
  68. bool
  69. dataWaiting (SOCKET s)
  70. {
  71. fd_set fds;
  72. long count;
  73. timeval tv;
  74. tv.tv_sec = 0;
  75. tv.tv_usec = 1;
  76. FD_ZERO (&fds);
  77. FD_SET (s, &fds);
  78. count = OriginalSelectProc (1, &fds, NULL, NULL, &tv);
  79. return (bool) count;
  80. }
  81. int
  82. readSocket (SOCKET s, char *buf, int len)
  83. {
  84. int ret = OriginalRecvProc (s, buf, len, 0);
  85. if (ret == 0)
  86. return SF_CLOSED;
  87. else if (ret > 0)
  88. return ret;
  89. else if (ret == SOCKET_ERROR) {
  90. if (WSAGetLastError () == WSAEWOULDBLOCK)
  91. return SF_NODATA;
  92. else
  93. return SF_CLOSED;
  94. } else
  95. return SF_CLOSED;
  96. }
  97. // This function "replaces" a function with another function
  98. // So, for example, if you do this:
  99. //   OriginalWSASendProc = (MyWSASendProc) HookImportedFunction (GetModuleHandle (0), "WS2_32.DLL", "WSASend", (PROC) MyWSASend);
  100. // This will "replaces" WSASend() with MyWSASend(). Every time the app calls WSASend(), MyWSASend() gets called instead.
  101. // This function returns a pointer to the original function.
  102. PROC
  103. HookImportedFunction (HMODULE hModule, // Module to intercept calls from
  104. PSTR FunctionModule, // The dll file that contains the function you want to hook
  105. PSTR FunctionName, // The function that you want to hook
  106. PROC pfnNewProc) // New function, this gets called instead
  107. {
  108. #define MakePtr( cast, ptr, addValue ) (cast)( (DWORD)(ptr)+(DWORD)(addValue))
  109. PROC pfnOriginalProc;
  110. IMAGE_DOS_HEADER *pDosHeader;
  111. IMAGE_NT_HEADERS *pNTHeader;
  112. IMAGE_IMPORT_DESCRIPTOR *pImportDesc;
  113. IMAGE_THUNK_DATA *pThunk;
  114. if (IsBadCodePtr (pfnNewProc)) return NULL;
  115. if (OriginalGetProcAddressProc) {
  116. pfnOriginalProc = OriginalGetProcAddressProc(GetModuleHandle(FunctionModule), FunctionName);
  117. } else {
  118. pfnOriginalProc = GetProcAddress(GetModuleHandle(FunctionModule), FunctionName);
  119. }
  120. if(!pfnOriginalProc) return NULL;
  121. pDosHeader = (PIMAGE_DOS_HEADER)hModule;
  122. if ( IsBadReadPtr(pDosHeader, sizeof(IMAGE_DOS_HEADER)) )
  123. return NULL;
  124. if ( pDosHeader->e_magic != IMAGE_DOS_SIGNATURE )
  125. return NULL;
  126. pNTHeader = MakePtr(PIMAGE_NT_HEADERS, pDosHeader, pDosHeader->e_lfanew);
  127. if ( IsBadReadPtr(pNTHeader, sizeof(IMAGE_NT_HEADERS)) )
  128. return NULL;
  129. if ( pNTHeader->Signature != IMAGE_NT_SIGNATURE )
  130. return NULL;
  131. pImportDesc = MakePtr(PIMAGE_IMPORT_DESCRIPTOR, pDosHeader,
  132. pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
  133. if ( pImportDesc == (PIMAGE_IMPORT_DESCRIPTOR)pNTHeader )
  134. return NULL;
  135. while ( pImportDesc->Name ) {
  136. PSTR pszModName = MakePtr(PSTR, pDosHeader, pImportDesc->Name);
  137. if ( stricmp(pszModName, FunctionModule) == 0 )
  138. break;
  139. pImportDesc++;
  140. }
  141. pNTHeader = MakePtr(PIMAGE_NT_HEADERS, pDosHeader, pDosHeader->e_lfanew);
  142. if ( pImportDesc->Name == 0 )
  143. return 0;
  144. pThunk = MakePtr(PIMAGE_THUNK_DATA, pDosHeader, pImportDesc->FirstThunk);
  145. MEMORY_BASIC_INFORMATION mbi_thunk;
  146. while ( pThunk->u1.Function ) {
  147. if ( (DWORD)pThunk->u1.Function == (DWORD)pfnOriginalProc) {
  148. VirtualQuery(pThunk, &mbi_thunk, sizeof(MEMORY_BASIC_INFORMATION));
  149. if (FALSE == VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize, PAGE_READWRITE, &mbi_thunk.Protect))
  150. return NULL;
  151. DWORD * pTemp = (DWORD*)&pThunk->u1.Function;
  152. *pTemp = (DWORD)(pfnNewProc);
  153. VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize,mbi_thunk.Protect, NULL);
  154. break;
  155. }
  156. pThunk++;
  157. }
  158. SYSTEM_INFO si;
  159. DWORD i;
  160. byte *data = NULL;
  161. GetSystemInfo(&si);
  162. LPVOID lpMem = si.lpMinimumApplicationAddress;
  163. while (lpMem < si.lpMaximumApplicationAddress) {
  164. VirtualQuery(lpMem, &mbi_thunk,sizeof(MEMORY_BASIC_INFORMATION));
  165. if ((DWORD)mbi_thunk.BaseAddress <= (DWORD)pDosHeader + pNTHeader->OptionalHeader.SizeOfImage
  166. && mbi_thunk.State == MEM_COMMIT && mbi_thunk.RegionSize > 0 && !(mbi_thunk.Protect & PAGE_GUARD)) {
  167. if (VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize, PAGE_READWRITE, &mbi_thunk.Protect)) {
  168. data = (byte*)mbi_thunk.BaseAddress;
  169. for (i = 0; i < mbi_thunk.RegionSize - 3; i++) {
  170. if (*(DWORD*)(data+i) == (DWORD)pfnOriginalProc) {
  171. *(DWORD*)(data+i) = (DWORD)pfnNewProc;
  172. }
  173. }
  174. VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize,mbi_thunk.Protect, NULL);
  175. }
  176. }
  177. lpMem = MakePtr(LPVOID, mbi_thunk.BaseAddress, mbi_thunk.RegionSize+1);
  178. }
  179. return pfnOriginalProc;
  180. }
  181. void
  182. debugInit ()
  183. {
  184. if (enableDebug)
  185. AllocConsole ();
  186. }
  187. void
  188. debug (const char *format, ...)
  189. {
  190. if (enableDebug) {
  191. va_list ap;
  192. char msg[1024];
  193. va_start (ap, format);
  194. vsprintf (msg, format, ap);
  195. va_end (ap);
  196. WriteConsole (GetStdHandle (STD_OUTPUT_HANDLE), msg, strlen (msg), NULL, NULL);
  197. }
  198. }