Advertisement
Broihon

Untitled

Sep 11th, 2016
476
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "Injection.h"
  2. #include <iostream>
  3. #include <string>
  4.  
  5. bool SetDebugPrivilege(bool Enable)
  6. {
  7.     HANDLE hToken = nullptr;
  8.     if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken))
  9.         return false;
  10.  
  11.     TOKEN_PRIVILEGES TokenPrivileges = { 0 };
  12.     TokenPrivileges.PrivilegeCount = 1;
  13.     TokenPrivileges.Privileges[0].Attributes = Enable ? SE_PRIVILEGE_ENABLED : 0;
  14.  
  15.     if (!LookupPrivilegeValueA(nullptr, "SeDebugPrivilege", &TokenPrivileges.Privileges[0].Luid))
  16.     {
  17.         CloseHandle(hToken);
  18.         return false;
  19.     }
  20.  
  21.     if (!AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), nullptr, nullptr))
  22.     {
  23.         CloseHandle(hToken);
  24.         return false;
  25.     }
  26.  
  27.     CloseHandle(hToken);
  28.  
  29.     return true;
  30. }
  31.  
  32. bool Is64BitProcess(HANDLE hProc)
  33. {
  34.     bool Is64BitWin = false;
  35.     BOOL Out = 0;
  36.     IsWow64Process(GetCurrentProcess(), &Out);
  37.     if (Out)
  38.         Is64BitWin = true;
  39.  
  40.     if (!IsWow64Process(hProc, &Out))
  41.         return false;
  42.    
  43.     if (Is64BitWin && !Out)
  44.         return true;
  45.  
  46.     return false;
  47. }
  48.  
  49. int main(UINT argc, char * argv[])
  50. {
  51.     if (argc < 5)
  52.         return 0;
  53.    
  54.     bool ThreadHijacking = false;
  55.     bool Unlink = false;
  56.    
  57.     char * szDll = nullptr;
  58.     DWORD PID = 0;
  59.  
  60.     DWORD HeaderOption = 0;
  61.     DWORD InjectionMethod = 0;
  62.  
  63.     for (UINT i = 1; i < argc; ++i)
  64.     {
  65.         if (!lstrcmpA(argv[i], "/p"))
  66.         {
  67.             if (i + 1 < argc)
  68.                 PID = strtoul(argv[i + 1], nullptr, 10);
  69.             else
  70.                 return 0;
  71.  
  72.             i++;
  73.         }
  74.         else if (!lstrcmpA(argv[i], "/f"))
  75.         {
  76.             if (i + 1 < argc)
  77.                 szDll = argv[i + 1];
  78.             else
  79.                 return 0;
  80.  
  81.             i++;
  82.         }
  83.         else if (!lstrcmpA(argv[i], "/m"))
  84.         {
  85.             if (i + 1 < argc)
  86.             {
  87.                 DWORD val = strtoul(argv[i + 1], nullptr, 10);
  88.                 if (val <= 2)
  89.                     InjectionMethod = val;
  90.                 else
  91.                     InjectionMethod = 0;
  92.             }
  93.             else
  94.                 return 0;
  95.  
  96.             i++;
  97.         }
  98.         else if (!lstrcmpA(argv[i], "/h"))
  99.         {
  100.             if (i + 1 < argc)
  101.             {
  102.                 DWORD val = strtoul(argv[i + 1], nullptr, 10);
  103.                 if (val <= 2)
  104.                     HeaderOption = val;
  105.                 else
  106.                     HeaderOption = 0;
  107.             }
  108.             else
  109.                 return 0;
  110.  
  111.             i++;
  112.         }
  113.         else if (!lstrcmpA(argv[i], "/t"))
  114.         {
  115.             ThreadHijacking = true;
  116.         }
  117.         else if (!lstrcmpA(argv[i], "/u"))
  118.         {
  119.             Unlink = true;
  120.         }
  121.     }
  122.    
  123.     INJECTION_MODE im = (INJECTION_MODE)InjectionMethod;
  124.     DWORD Flags = 0;
  125.     if (Unlink)
  126.         Flags = INJ_UNLINK_FROM_PEB;
  127.     Flags |= HeaderOption;
  128.  
  129.     SetDebugPrivilege(true);
  130.    
  131.     if (PID)
  132.     {
  133.         HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
  134.         if (!hProc)
  135.             return 0;
  136.  
  137.         #ifndef _WIN64
  138.  
  139.         if(!Is64BitProcess(hProc))
  140.             InjectDLL(szDll, hProc, im, ThreadHijacking, Flags);
  141.         else
  142.         {
  143.             std::string AllArgs("\"GH Injector - x64.exe\" ");
  144.             for (UINT i = 1; i != argc; ++i)
  145.             {
  146.                 if (!strcmp(argv[i], "/f"))
  147.                 {
  148.                     AllArgs += argv[i];
  149.                     AllArgs += ' ';
  150.                     AllArgs += '"';
  151.                     AllArgs += argv[i + 1];
  152.                     AllArgs += '"';
  153.                     AllArgs += ' ';
  154.                     ++i;
  155.                     continue;
  156.                 }
  157.                 AllArgs += argv[i];
  158.                 AllArgs += ' ';
  159.             }
  160.  
  161.             PROCESS_INFORMATION pi{ 0 };
  162.             STARTUPINFO si{ 0 };
  163.             si.cb = sizeof(STARTUPINFO);
  164.  
  165.             if (!CreateProcessA(nullptr, const_cast<char*>(AllArgs.c_str()), nullptr, nullptr, FALSE, 0, nullptr, nullptr, &si, &pi))
  166.                 return 0;
  167.  
  168.             CloseHandle(pi.hProcess);
  169.             CloseHandle(pi.hThread);
  170.  
  171.         }
  172.  
  173.         #else
  174.         InjectDLL(szDll, hProc, im, ThreadHijacking, Flags);
  175.         #endif
  176.         CloseHandle(hProc);
  177.     }
  178.     return 0;
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement