Advertisement
yasi04

Untitled

Jan 22nd, 2025
38
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.50 KB | None | 0 0
  1. #include <windows.h>
  2. #include <tlhelp32.h>
  3. #include <fstream>
  4. #include <iostream>
  5. #include <string>
  6. #include <vector>
  7. #include <psapi.h>
  8.  
  9. // Определения структур и констант
  10. #define IMAGE_REL_BASED_DIR64 10
  11. typedef ULONGLONG QWORD;
  12.  
  13. typedef struct _BASE_RELOCATION_ENTRY {
  14.     USHORT Offset : 12;
  15.     USHORT Type : 4;
  16. } BASE_RELOCATION_ENTRY, *PBASE_RELOCATION_ENTRY;
  17.  
  18. struct MANUAL_MAPPING_DATA {
  19.     PVOID ImageBase;
  20.     PVOID EntryPoint;
  21. };
  22.  
  23. // Глобальные настройки
  24. const std::wstring TARGET_PROCESS = L"RainbowSix_DX11.exe";
  25. const std::string DLL_PATH = "C:\\Downloads\\d3d11hook_[unknowncheats.me]_.dll";
  26. const std::string LOG_FILE = "C:\\Downloads\\injector.log";
  27.  
  28. // Функция логирования
  29. void Log(const std::string& message) {
  30.     std::ofstream log(LOG_FILE, std::ios::app);
  31.     if (log) {
  32.         log << "[" << __TIME__ << "] " << message << std::endl;
  33.     }
  34. }
  35.  
  36. // Проверка прав администратора
  37. bool IsElevated() {
  38.     HANDLE hToken;
  39.     if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
  40.         return false;
  41.  
  42.     TOKEN_ELEVATION elevation;
  43.     DWORD cbSize = sizeof(TOKEN_ELEVATION);
  44.     bool result = GetTokenInformation(hToken, TokenElevation, &elevation, sizeof(elevation), &cbSize);
  45.     CloseHandle(hToken);
  46.     return result && elevation.TokenIsElevated;
  47. }
  48.  
  49. DWORD GetProcessIdByName(const std::wstring& processName) {
  50.     DWORD processId = 0;
  51.     HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  52.    
  53.     if (snapshot == INVALID_HANDLE_VALUE) {
  54.         Log("Snapshot error: " + std::to_string(GetLastError()));
  55.         return 0;
  56.     }
  57.  
  58.     PROCESSENTRY32W entry = { sizeof(PROCESSENTRY32W) };
  59.     if (Process32FirstW(snapshot, &entry)) {
  60.         do {
  61.             if (processName == entry.szExeFile) {
  62.                 processId = entry.th32ProcessID;
  63.                 break;
  64.             }
  65.         } while (Process32NextW(snapshot, &entry));
  66.     }
  67.    
  68.     CloseHandle(snapshot);
  69.     return processId;
  70. }
  71.  
  72. void ApplyRelocations(PIMAGE_NT_HEADERS64 pNtHeaders, PVOID base, ULONGLONG delta) {
  73.     if (delta == 0) return;
  74.  
  75.     auto dir = &pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC];
  76.     if (dir->Size == 0) return;
  77.  
  78.     auto reloc = (PIMAGE_BASE_RELOCATION)((ULONGLONG)base + dir->VirtualAddress);
  79.     while (reloc->VirtualAddress > 0) {
  80.         ULONGLONG relocAddr = (ULONGLONG)base + reloc->VirtualAddress;
  81.         UINT numEntries = (reloc->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(WORD);
  82.         auto entries = (PBASE_RELOCATION_ENTRY)(reloc + 1);
  83.  
  84.         for (UINT i = 0; i < numEntries; i++) {
  85.             if (entries[i].Type == IMAGE_REL_BASED_DIR64) {
  86.                 ULONGLONG* patchAddr = (ULONGLONG*)(relocAddr + entries[i].Offset);
  87.                 *patchAddr += delta;
  88.             }
  89.         }
  90.         reloc = (PIMAGE_BASE_RELOCATION)((ULONGLONG)reloc + reloc->SizeOfBlock);
  91.     }
  92. }
  93.  
  94. bool ResolveImports(HANDLE hProcess, PIMAGE_NT_HEADERS64 pNtHeaders, PVOID base) {
  95.     auto dir = &pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
  96.     if (dir->Size == 0) return true;
  97.  
  98.     auto importDesc = (PIMAGE_IMPORT_DESCRIPTOR)((ULONGLONG)base + dir->VirtualAddress);
  99.     while (importDesc->Name) {
  100.         char* moduleName = (char*)((ULONGLONG)base + importDesc->Name);
  101.         HMODULE hModule = GetModuleHandleA(moduleName);
  102.         if (!hModule) {
  103.             hModule = LoadLibraryA(moduleName);
  104.             if (!hModule) return false;
  105.         }
  106.  
  107.         auto thunk = (PIMAGE_THUNK_DATA64)((ULONGLONG)base + importDesc->FirstThunk);
  108.         while (thunk->u1.AddressOfData) {
  109.             if (IMAGE_SNAP_BY_ORDINAL64(thunk->u1.Ordinal)) {
  110.                 auto proc = GetProcAddress(hModule, (LPCSTR)IMAGE_ORDINAL64(thunk->u1.Ordinal));
  111.                 if (!proc) return false;
  112.                 thunk->u1.Function = (ULONGLONG)proc;
  113.             }
  114.             else {
  115.                 auto import = (PIMAGE_IMPORT_BY_NAME)((ULONGLONG)base + thunk->u1.AddressOfData);
  116.                 auto proc = GetProcAddress(hModule, import->Name);
  117.                 if (!proc) return false;
  118.                 thunk->u1.Function = (ULONGLONG)proc;
  119.             }
  120.             thunk++;
  121.         }
  122.         importDesc++;
  123.     }
  124.     return true;
  125. }
  126.  
  127. HANDLE OpenTargetProcess(DWORD pid) {
  128.     HANDLE hProcess = OpenProcess(
  129.         PROCESS_VM_OPERATION |
  130.         PROCESS_VM_WRITE |
  131.         PROCESS_CREATE_THREAD |
  132.         PROCESS_QUERY_INFORMATION,
  133.         FALSE,
  134.         pid
  135.     );
  136.  
  137.     if (!hProcess) {
  138.         Log("OpenProcess failed: " + std::to_string(GetLastError()));
  139.         return NULL;
  140.     }
  141.  
  142.     // Проверка архитектуры
  143.     BOOL isTargetWow64 = FALSE;
  144.     IsWow64Process(hProcess, &isTargetWow64);
  145.     if (isTargetWow64) {
  146.         Log("Target process is 32-bit");
  147.         CloseHandle(hProcess);
  148.         return NULL;
  149.     }
  150.  
  151.     return hProcess;
  152. }
  153.  
  154. bool ManualMap(HANDLE hProcess, const std::string& dllPath) {
  155.     Log("Starting manual mapping...");
  156.  
  157.     HANDLE hFile = CreateFileA(dllPath.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
  158.     if (hFile == INVALID_HANDLE_VALUE) {
  159.         Log("CreateFile failed: " + std::to_string(GetLastError()));
  160.         return false;
  161.     }
  162.  
  163.     DWORD fileSize = GetFileSize(hFile, NULL);
  164.     std::vector<BYTE> dllData(fileSize);
  165.     DWORD bytesRead;
  166.    
  167.     if (!ReadFile(hFile, dllData.data(), fileSize, &bytesRead, NULL)) {
  168.         Log("ReadFile failed: " + std::to_string(GetLastError()));
  169.         CloseHandle(hFile);
  170.         return false;
  171.     }
  172.     CloseHandle(hFile);
  173.  
  174.     auto pDosHeader = (PIMAGE_DOS_HEADER)dllData.data();
  175.     if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) {
  176.         Log("Invalid DOS header");
  177.         return false;
  178.     }
  179.  
  180.     auto pNtHeaders = (PIMAGE_NT_HEADERS64)((ULONGLONG)dllData.data() + pDosHeader->e_lfanew);
  181.     if (pNtHeaders->Signature != IMAGE_NT_SIGNATURE ||
  182.         pNtHeaders->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR64_MAGIC) {
  183.         Log("Invalid NT header");
  184.         return false;
  185.     }
  186.  
  187.     PVOID remoteBase = VirtualAllocEx(hProcess,
  188.         (PVOID)pNtHeaders->OptionalHeader.ImageBase,
  189.         pNtHeaders->OptionalHeader.SizeOfImage,
  190.         MEM_COMMIT | MEM_RESERVE,
  191.         PAGE_EXECUTE_READWRITE);
  192.    
  193.     if (!remoteBase) {
  194.         remoteBase = VirtualAllocEx(hProcess,
  195.             NULL,
  196.             pNtHeaders->OptionalHeader.SizeOfImage,
  197.             MEM_COMMIT | MEM_RESERVE,
  198.             PAGE_EXECUTE_READWRITE);
  199.        
  200.         if (!remoteBase) {
  201.             Log("Memory allocation failed: " + std::to_string(GetLastError()));
  202.             return false;
  203.         }
  204.     }
  205.  
  206.     Log("Memory allocated at: 0x" + std::to_string(reinterpret_cast<ULONGLONG>(remoteBase)));
  207.  
  208.     // Запись PE-заголовков
  209.     if (!WriteProcessMemory(hProcess, remoteBase, dllData.data(),
  210.                           pNtHeaders->OptionalHeader.SizeOfHeaders, NULL)) {
  211.         Log("Failed to write headers");
  212.         VirtualFreeEx(hProcess, remoteBase, 0, MEM_RELEASE);
  213.         return false;
  214.     }
  215.  
  216.     // Запись секций
  217.     auto pSection = IMAGE_FIRST_SECTION(pNtHeaders);
  218.     for (WORD i = 0; i < pNtHeaders->FileHeader.NumberOfSections; ++i, ++pSection) {
  219.         PVOID secDest = reinterpret_cast<BYTE*>(remoteBase) + pSection->VirtualAddress;
  220.         if (!WriteProcessMemory(hProcess, secDest,
  221.                               dllData.data() + pSection->PointerToRawData,
  222.                               pSection->SizeOfRawData, NULL)) {
  223.             Log("Failed to write section: " + std::string(reinterpret_cast<char*>(pSection->Name)));
  224.             VirtualFreeEx(hProcess, remoteBase, 0, MEM_RELEASE);
  225.             return false;
  226.         }
  227.     }
  228.  
  229.     // Релокации
  230.     ULONGLONG delta = reinterpret_cast<ULONGLONG>(remoteBase) - pNtHeaders->OptionalHeader.ImageBase;
  231.     ApplyRelocations(pNtHeaders, remoteBase, delta);
  232.  
  233.     // Разрешение импортов
  234.     if (!ResolveImports(hProcess, pNtHeaders, remoteBase)) {
  235.         Log("Import resolution failed");
  236.         VirtualFreeEx(hProcess, remoteBase, 0, MEM_RELEASE);
  237.         return false;
  238.     }
  239.  
  240.     // Установка защиты памяти
  241.     pSection = IMAGE_FIRST_SECTION(pNtHeaders);
  242.     for (WORD i = 0; i < pNtHeaders->FileHeader.NumberOfSections; ++i, ++pSection) {
  243.         DWORD oldProtect;
  244.         DWORD protect = 0;
  245.        
  246.         if (pSection->Characteristics & IMAGE_SCN_MEM_EXECUTE) {
  247.             protect = (pSection->Characteristics & IMAGE_SCN_MEM_WRITE)
  248.                     ? PAGE_EXECUTE_READWRITE
  249.                     : PAGE_EXECUTE_READ;
  250.         }
  251.         else if (pSection->Characteristics & IMAGE_SCN_MEM_WRITE) {
  252.             protect = PAGE_READWRITE;
  253.         }
  254.         else {
  255.             protect = PAGE_READONLY;
  256.         }
  257.        
  258.         VirtualProtectEx(hProcess,
  259.                        reinterpret_cast<BYTE*>(remoteBase) + pSection->VirtualAddress,
  260.                        pSection->Misc.VirtualSize,
  261.                        protect,
  262.                        &oldProtect);
  263.     }
  264.  
  265.     // Создание потока
  266.     MANUAL_MAPPING_DATA mappingData = {
  267.         remoteBase,
  268.         reinterpret_cast<PVOID>(reinterpret_cast<ULONGLONG>(remoteBase) +
  269.                               pNtHeaders->OptionalHeader.AddressOfEntryPoint)
  270.     };
  271.  
  272.     HANDLE hThread = CreateRemoteThread(hProcess,
  273.                                       NULL,
  274.                                       0,
  275.                                       reinterpret_cast<LPTHREAD_START_ROUTINE>(mappingData.EntryPoint),
  276.                                       mappingData.ImageBase,
  277.                                       0,
  278.                                       NULL);
  279.    
  280.     if (!hThread) {
  281.         Log("Thread creation failed: " + std::to_string(GetLastError()));
  282.         VirtualFreeEx(hProcess, remoteBase, 0, MEM_RELEASE);
  283.         return false;
  284.     }
  285.  
  286.     WaitForSingleObject(hThread, INFINITE);
  287.     CloseHandle(hThread);
  288.    
  289.     Log("Manual mapping completed successfully");
  290.     return true;
  291. }
  292.  
  293. int main() {
  294.     if (!IsElevated()) {
  295.         MessageBoxA(NULL, "Запустите программу от имени администратора", "Ошибка", MB_ICONERROR);
  296.         return 1;
  297.     }
  298.  
  299.     // Вариант 1: Запуск через инжектор
  300.     STARTUPINFOW si = { sizeof(si) };
  301.     PROCESS_INFORMATION pi;
  302.     if (CreateProcessW(
  303.         L"D:\\Games\\Tom Clancy's Rainbow Six Siege\\RainbowSix_DX11.exe",
  304.         NULL, NULL, NULL, FALSE,
  305.         CREATE_SUSPENDED,
  306.         NULL, NULL, &si, &pi))
  307.     {
  308.         Log("Process created in suspended state");
  309.        
  310.         if (ManualMap(pi.hProcess, DLL_PATH)) {
  311.             Log("Resuming main thread");
  312.             ResumeThread(pi.hThread);
  313.             CloseHandle(pi.hThread);
  314.             CloseHandle(pi.hProcess);
  315.             return 0;
  316.         }
  317.     }
  318.  
  319.     // Вариант 2: Инжекция в уже запущенный процесс
  320.     DWORD pid = GetProcessIdByName(TARGET_PROCESS);
  321.     if (!pid) {
  322.         Log("Process not found");
  323.         return 1;
  324.     }
  325.  
  326.     HANDLE hProcess = OpenTargetProcess(pid);
  327.     if (!hProcess) {
  328.         return 1;
  329.     }
  330.  
  331.     if (!ManualMap(hProcess, DLL_PATH)) {
  332.         Log("Injection failed");
  333.         CloseHandle(hProcess);
  334.         return 1;
  335.     }
  336.  
  337.     CloseHandle(hProcess);
  338.     Log("Injection succeeded");
  339.     return 0;
  340. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement