_Vine_
Активный
- 154
- 57
В funcAddr можно записать адрес WinApi функции текущего процесса, базовый адрес системных библиотек во процессах(одинаковой архитектуры) одинаковый.Проблемy с разным адресом процедуры из-за релокаций можно решить так
C++:DWORD RVA = ((DWORD_PTR)GetProcAddress(GetModuleHandleA("kernel32.dll"), "CreateRemoteThread") - (DWORD_PTR)GetModuleHandleA("kernel32.dll")); auto ObtainRemoteBase = [](HANDLE hProc, const char *dllName) -> DWORD_PTR { HMODULE hMods[1024]; DWORD cbNeeded; EnumProcessModules(hProc, hMods, sizeof(hMods), &cbNeeded); for (unsigned int i = 0; i < (cbNeeded / sizeof(HMODULE)); i++) { CHAR ModulePath[MAX_PATH + 1]; memset(ModulePath, 0, sizeof(ModulePath)); K32GetModuleFileNameExA(hProc, hMods[i], ModulePath, MAX_PATH + 1); if (strstr(ModulePath, dllName) != nullptr) { return reinterpret_cast<DWORD_PTR>(hMods[i]); } } }; auto FindProcessId = [](char* processName) -> DWORD { char* p = strrchr(processName, '\\'); if (p) processName = p + 1; PROCESSENTRY32 processInfo; processInfo.dwSize = sizeof(processInfo); HANDLE processesSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); if (processesSnapshot == INVALID_HANDLE_VALUE) return 0; Process32First(processesSnapshot, &processInfo); if (!strcmp(processName, processInfo.szExeFile)) { CloseHandle(processesSnapshot); return processInfo.th32ProcessID; } while (Process32Next(processesSnapshot, &processInfo)) { if (!strcmp(processName, processInfo.szExeFile)) { CloseHandle(processesSnapshot); return processInfo.th32ProcessID; } } CloseHandle(processesSnapshot); return 0; }; DWORD procID = GetProcID("имя_процесса.ехе"); if (procID == NULL) return; HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID); if (hProc != NULL) { DWORD_PTR funcAddr = RVA + ObtainRemoteBase(hProc, "kernel32.dll"); CloseHandle(hProc); }
Так же находят адрес LoadLibraryA инжекторы