| 84 | } |
| 85 | |
| 86 | std::string GetVersionFromMemoryScan() { |
| 87 | HMODULE hModule = GetModuleHandleA(NULL); |
| 88 | if (!hModule) |
| 89 | return ""; |
| 90 | MODULEINFO modInfo = { 0 }; |
| 91 | if (!GetModuleInformation(GetCurrentProcess(), hModule, &modInfo, sizeof(modInfo))) |
| 92 | return ""; |
| 93 | char* baseAddr = reinterpret_cast<char*>(modInfo.lpBaseOfDll); |
| 94 | size_t moduleSize = modInfo.SizeOfImage; |
| 95 | if (!baseAddr || moduleSize == 0) |
| 96 | return ""; |
| 97 | std::vector<std::string> markers = { "Unreal Engine 4.", "Unreal Engine 5.", "FEngineVersion", "EngineVersion" }; |
| 98 | for (const auto& marker : markers) { |
| 99 | size_t markerLen = marker.length(); |
| 100 | for (size_t i = 0; i < moduleSize - markerLen; i++) { |
| 101 | if (memcmp(baseAddr + i, marker.c_str(), markerLen) == 0) { |
| 102 | std::string found(marker); |
| 103 | size_t maxExtra = 32; |
| 104 | size_t j = i + markerLen; |
| 105 | while (j < moduleSize && (j - (i + markerLen)) < maxExtra && isprint(baseAddr[j])) { |
| 106 | found.push_back(baseAddr[j]); |
| 107 | j++; |
| 108 | } |
| 109 | return found; |
| 110 | } |
| 111 | } |
| 112 | } |
| 113 | return ""; |
| 114 | } |
| 115 | |
| 116 | std::string GetVersionFromProcessMemory(HANDLE hProcess) { |
| 117 | HMODULE hMod; |
no outgoing calls
no test coverage detected