Advertisement
yasi04

Untitled

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