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

外挂编程

开发平台:

Windows_Unix

  1. #include <windows.h>
  2. #include <wchar.h>
  3. #include <Tlhelp32.h>
  4. #include <stdlib.h>
  5. #include "utils.h"
  6. static int initialized = 0;
  7. static int isNT = 0;
  8. static void
  9. init ()
  10. {
  11. OSVERSIONINFO version;
  12. if (initialized)
  13. return;
  14. version.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
  15. GetVersionEx (&version);
  16. isNT = version.dwPlatformId == VER_PLATFORM_WIN32_NT;
  17. initialized = 1;
  18. }
  19. static const char *
  20. basename (const char *filename)
  21. {
  22. const char *base = strrchr (filename, '\');
  23. if (base)
  24. return base + 1;
  25. else
  26. return filename;
  27. }
  28. /**
  29.  * Convert a UTF-8 string to a Unicode wide string.
  30.  *
  31.  * @param str A UTF-8 string.
  32.  * @param len The length of str, in bytes.
  33.  * @param resultLength A pointer to an int. If not NULL, the length of the result
  34.  *                     (in characters) will be stored here.
  35.  * @return A Unicode wide string, or NULL of the conversion failed. This
  36.  *         must be freed whe no longer necessary.
  37.  * @requires str != NULL && len >= 0
  38.  * @ensure if result != NULL && resultLength != NULL: *resultLength >= 0
  39.  */
  40. static WCHAR *
  41. utf8ToWidechar (const char *str, int len, int *resultLength = NULL)
  42. {
  43. int size;
  44. WCHAR *unicode;
  45. // Determine the size (in characters) the buffer must be.
  46. size = MultiByteToWideChar (CP_UTF8, 0, str,
  47. len, NULL, 0);
  48. if (size == 0) {
  49. return NULL;
  50. }
  51. // Allocate the buffer and convert UTF-8 to Unicode.
  52. unicode = (WCHAR *) malloc (sizeof (WCHAR) * (size + 1));
  53. if (unicode == NULL) {
  54. return NULL;
  55. }
  56. if (MultiByteToWideChar (CP_UTF8, 0, str, len, unicode, size) == 0) {
  57. return NULL;
  58. }
  59. if (resultLength != NULL) {
  60. *resultLength = size;
  61. }
  62. // NULL-terminate the string.
  63. unicode[size] = (WCHAR) 0;
  64. return unicode;
  65. }
  66. DWORD 
  67. GetProcByName (const char *name)
  68. {
  69. HANDLE toolhelp;
  70. PROCESSENTRY32 pe;
  71. pe.dwSize = sizeof(PROCESSENTRY32);
  72. toolhelp = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  73. if (Process32First(toolhelp,&pe)) {
  74. do {
  75. if (!stricmp(name, basename (pe.szExeFile))) {
  76. CloseHandle(toolhelp);
  77. return pe.th32ProcessID;
  78. }
  79. } while (Process32Next(toolhelp,&pe));
  80. }
  81. CloseHandle(toolhelp);
  82. return 0;
  83. }
  84. bool
  85. InjectDLL (DWORD ProcID, const char *dll)
  86. {
  87. #define TESTING_INJECT9x 0
  88. #ifdef TESTING_INJECT9x
  89. #define debug(x) MessageBox(0, x, "Debug", 0)
  90. #else
  91. #define debug(x)
  92. #endif
  93. init ();
  94. if (TESTING_INJECT9x || !isNT) {
  95. HMODULE lib;
  96. int i;
  97. HWND hwnd;
  98. typedef int WINAPI __declspec(dllexport) (*injectSelfFunc) (HWND hwnd);
  99. injectSelfFunc injectSelf;
  100. // The window may not appear immediately so we try for at least 5 seconds
  101. for (i = 0; i < 10; i++) {
  102. hwnd = FindWindow (NULL, "Ragnarok");
  103. if (hwnd)
  104. break;
  105. else
  106. Sleep (500);
  107. }
  108. if (!hwnd) {
  109. debug ("No RO window found.");
  110. return false;
  111. }
  112. lib = LoadLibrary (dll);
  113. if (!lib) {
  114. debug ("Could not load library.");
  115. return false;
  116. }
  117. injectSelf = (injectSelfFunc) GetProcAddress (lib, "injectSelf");
  118. if (!injectSelf) {
  119. debug ("No injectSelf() function.");
  120. FreeLibrary (lib);
  121. return false;
  122. }
  123. injectSelf (hwnd);
  124. return true;
  125. }
  126. /* Attach to ragexe */
  127. HANDLE hProcessToAttach = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcID);
  128. if (!hProcessToAttach) {
  129. return false;
  130. }
  131. LPVOID pAttachProcessMemory = NULL;
  132. DWORD dwBytesWritten = 0;
  133. char * dllRemove;
  134. /* Allocate a piece of memory in ragexe. */
  135. dllRemove = (char*)calloc(strlen(dll) + 1, 1);
  136. pAttachProcessMemory = VirtualAllocEx( 
  137. hProcessToAttach,
  138. NULL, 
  139. strlen(dll) + 1, 
  140. MEM_COMMIT,
  141. PAGE_EXECUTE_READWRITE );
  142. if (!pAttachProcessMemory) {
  143. CloseHandle(hProcessToAttach);
  144. return false;
  145. }
  146. /* Write our DLL filename to that allocated piece of memory. */
  147. WriteProcessMemory( 
  148. hProcessToAttach, 
  149. pAttachProcessMemory, 
  150. (LPVOID)dll, strlen(dll) + 1,
  151. &dwBytesWritten );
  152. if (!dwBytesWritten) {
  153. return false;
  154. }
  155. /* Create a remote thread in the ragexe.exe process, which
  156.    calls LoadLibraryA(our DLL filename) */
  157. HMODULE kDLL = GetModuleHandle("Kernel32");
  158. HANDLE hThread = CreateRemoteThread( hProcessToAttach, NULL, 0, 
  159. (LPTHREAD_START_ROUTINE)GetProcAddress(kDLL, "LoadLibraryA"),
  160. (LPVOID)pAttachProcessMemory, 0,   
  161. NULL);
  162. if (!hThread) {
  163. return false;
  164. }
  165. WaitForSingleObject(hThread, INFINITE);
  166. /* Free the string we created */
  167. WriteProcessMemory( 
  168. hProcessToAttach, 
  169. pAttachProcessMemory, 
  170. (LPVOID)dllRemove, strlen(dll) + 1, 
  171. &dwBytesWritten );
  172. if (!dwBytesWritten) {
  173. return false;
  174. }
  175. VirtualFreeEx( 
  176. hProcessToAttach,      
  177. pAttachProcessMemory, 
  178. strlen(dll) + 1, 
  179. MEM_RELEASE);
  180. if (hThread) {
  181. CloseHandle(hThread);
  182. }
  183. return true;
  184. }
  185. void
  186. printConsole (const char *message, int len) {
  187. int size;
  188. WCHAR *unicode;
  189. unicode = utf8ToWidechar(message, len, &size);
  190. if (unicode != NULL) {
  191. WriteConsoleW (GetStdHandle (STD_OUTPUT_HANDLE), unicode,
  192. size, NULL, NULL);
  193. free (unicode);
  194. } else {
  195. WriteConsoleA (GetStdHandle (STD_OUTPUT_HANDLE), message,
  196. len, NULL, NULL);
  197. }
  198. }
  199. void
  200. setConsoleTitle (const char *title, int len) {
  201. WCHAR *unicode;
  202. unicode = utf8ToWidechar(title, len);
  203. if (unicode != NULL) {
  204. SetConsoleTitleW (unicode);
  205. free (unicode);
  206. } else {
  207. SetConsoleTitleA (title);
  208. }
  209. }
  210. char *
  211. codepageToUTF8(unsigned int codepage, const char *str, unsigned int len, unsigned int *resultLength) {
  212. WCHAR *unicode;
  213. int unicode_len;
  214. char *result;
  215. int result_len;
  216. /*** Convert the multibyte string to unicode. ***/
  217. // Query the necessary space for the unicode string.
  218. unicode_len = MultiByteToWideChar(codepage, 0, str, len, NULL, 0);
  219. if (unicode_len == 0) {
  220. return NULL;
  221. }
  222. // Allocate the unicode string and convert multibyte to unicode.
  223. unicode = (WCHAR *) malloc(sizeof(WCHAR) * unicode_len);
  224. if (MultiByteToWideChar(codepage, 0, str, len, unicode, unicode_len) == 0) {
  225. free(unicode);
  226. return NULL;
  227. }
  228. /*** Convert the unicode string to UTF-8. ***/
  229. // Query the necessary space for the UTF-8 string.
  230. result_len = WideCharToMultiByte(CP_UTF8, 0, unicode, unicode_len, NULL, 0, NULL, NULL);
  231. if (result_len == 0) {
  232. free(unicode);
  233. return NULL;
  234. }
  235. // Allocate the UTF-8 string and convert unicode to UTF-8.
  236. result = (char *) malloc(result_len + 1);
  237. if (WideCharToMultiByte(CP_UTF8, 0, unicode, unicode_len, result, result_len, NULL, NULL) == 0) {
  238. free(unicode);
  239. free(result);
  240. return NULL;
  241. }
  242. result[result_len] = '';
  243. free(unicode);
  244. if (resultLength != NULL) {
  245. *resultLength = result_len;
  246. }
  247. return result;
  248. }
  249. char *
  250. utf8ToCodepage(unsigned int codepage, const char *str, unsigned int len, unsigned int *resultLength) {
  251. WCHAR *unicode;
  252. int unicode_len;
  253. char *result;
  254. int result_len;
  255. unicode = utf8ToWidechar(str, len, &unicode_len);
  256. if (unicode == NULL) {
  257. return NULL;
  258. }
  259. result_len = WideCharToMultiByte(codepage, 0, unicode, unicode_len, NULL, 0, NULL, NULL);
  260. if (result_len == 0) {
  261. free(unicode);
  262. return NULL;
  263. }
  264. result = (char *) malloc(result_len + 1);
  265. if (WideCharToMultiByte(codepage, 0, unicode, unicode_len, result, result_len, NULL, NULL) == 0) {
  266. free(unicode);
  267. free(result);
  268. return NULL;
  269. }
  270. result[result_len] = '';
  271. free(unicode);
  272. if (resultLength != NULL) {
  273. *resultLength = result_len;
  274. }
  275. return result;
  276. }