ROALoader.cpp
上传用户:tianheyiqi
上传日期:2010-04-16
资源大小:282k
文件大小:3k
源码类别:

外挂编程

开发平台:

Visual C++

  1. // ROALoader.cpp : Defines the entry point for the application.
  2. //
  3. #include "stdafx.h"
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <Tlhelp32.h>
  7. #include <shellapi.h>
  8. #include "detours.h"
  9. DWORD getROProcessId()
  10. {
  11. HANDLE toolhelp;
  12. PROCESSENTRY32 pe;
  13. pe.dwSize = sizeof(PROCESSENTRY32);
  14. toolhelp = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  15. SetLastError(0);
  16. if (Process32First(toolhelp,&pe)) {
  17. do {
  18. _strupr(pe.szExeFile);
  19. if (strstr(pe.szExeFile, "ROA.EXE") != 0) {
  20. CloseHandle(toolhelp);
  21. return pe.th32ProcessID;
  22. }
  23. } while (Process32Next(toolhelp,&pe));
  24. }
  25. CloseHandle(toolhelp);
  26. return 0;
  27. }
  28. enum
  29. {
  30. eUnknown,
  31. eRagexe,
  32. eSakexe,
  33. eSfExe
  34. };
  35. int APIENTRY WinMain(HINSTANCE hInstance,
  36.                      HINSTANCE hPrevInstance,
  37.                      LPSTR     lpCmdLine,
  38.                      int       nCmdShow)
  39. {
  40.   // TODO: Place code here.
  41. //////////////////////////////////////////////////////////////////////////
  42. STARTUPINFO si;
  43. PROCESS_INFORMATION pi;
  44. CHAR szClient[1024];
  45. CHAR szParam[1024];
  46. CHAR szCommand[2048];
  47. CHAR szFullExe[1024] = "";
  48. PCHAR pszFileExe = NULL;
  49. HKEY hKey = 0;
  50. LONG lRet;
  51. DWORD dwResult = -1;
  52. int nClientType = 0;
  53. ZeroMemory(&si, sizeof(si));
  54. ZeroMemory(&pi, sizeof(pi));
  55. si.cb = sizeof(si);
  56. dwResult = 1;
  57. lRet = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Gravity Soft", &hKey);
  58. if(lRet == ERROR_SUCCESS && hKey != 0)
  59. {
  60. LONG lSize = 1024;
  61. lRet = RegQueryValue(hKey, "LaunchTarget", szFullExe, &lSize);
  62. lSize = 1024;
  63. szClient[0] = NULL;
  64. lRet = RegQueryValue(hKey, "LaunchType", szClient, &lSize);
  65. nClientType = atoi(szClient);
  66. szParam[0] = NULL;
  67. if(nClientType == eSfExe)
  68. {
  69. lSize = 1024;
  70. lRet = RegQueryValue(hKey, "LaunchParam", szParam, &lSize);
  71. }
  72. RegCloseKey(hKey);
  73. dwResult = 2;
  74. }
  75. if((nClientType == eRagexe || nClientType == eSakexe) && strlen(lpCmdLine) == 0)
  76. return(0);
  77. if(strlen(szFullExe) > 0)
  78. {
  79. SetLastError(0);
  80. if(0 == getROProcessId())
  81. {
  82. sprintf(szCommand, "%s %s", szFullExe, lpCmdLine);
  83. STARTUPINFO si = {sizeof(STARTUPINFO)};
  84. PROCESS_INFORMATION pi;
  85. CreateProcess(szFullExe, (LPTSTR)(LPCTSTR)szCommand, NULL, NULL, true, CREATE_DEFAULT_ERROR_MODE,
  86. NULL, NULL, &si, &pi);
  87. // HINSTANCE inst = ShellExecute(GetDesktopWindow(), "open", szFullExe, lpCmdLine, NULL, SW_SHOWNORMAL);
  88. dwResult = 3;
  89. }
  90. else
  91. {
  92. ::DeleteFile("G:\Games\Gravity\RO\ragexe.exe");
  93. DWORD err = GetLastError();
  94. char error[2048];
  95. sprintf(error, "%d", err);
  96. MessageBox(NULL,error, "ERROR", MB_OK);
  97. sprintf(szCommand, "%s %s %s", szFullExe, lpCmdLine, szParam);
  98. if (!DetourCreateProcessWithDll(szFullExe,
  99. szCommand, NULL, NULL, TRUE,
  100. CREATE_DEFAULT_ERROR_MODE, NULL, NULL,
  101. &si, &pi, "ROAInject.dll", NULL)) {
  102. ExitProcess(2);
  103. }
  104.  
  105. WaitForSingleObject(pi.hProcess, INFINITE);
  106. if (!GetExitCodeProcess(pi.hProcess, &dwResult)) {
  107. dwResult = 5;
  108. }
  109. else
  110. {
  111. dwResult = 6;
  112. }
  113. }
  114. }
  115. sprintf(szFullExe, "%d", dwResult);
  116. // MessageBox(NULL, szFullExe, szCommand, MB_OK);
  117. return dwResult;
  118. }