MCPcopy Create free account
hub / github.com/NoMercy-ac/NoMercy / ScanModuleHeader

Function ScanModuleHeader

Source/Client/NM_Engine/IModuleScanner.cpp:191–258  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

189
190
191bool ScanModuleHeader(HANDLE hProcess, const std::string & szModuleName, DWORD64 pModuleBase, std::size_t cbModuleSize)
192{
193 SCANNER_LOG(LL_SYS, "Module header scan started! Target process: %p(%u) Module name: %s Module data: %p-%u",
194 hProcess, g_winapiApiTable->GetProcessId(hProcess), szModuleName.c_str(), pModuleBase, cbModuleSize);
195
196 auto bRet = false;
197 auto ntStat = DWORD64(0x0);
198#ifdef _M_X64
199 auto dwReadByteCount = 0ULL;
200#else
201 auto dwReadByteCount = 0UL;
202#endif
203 auto dwReadSize = (cbModuleSize < 0x10000) ? cbModuleSize : 0x10000;
204 auto dwPEHeaderSize = 0UL;
205
206 auto pModuleDump = g_nmApp->DynamicWinapiInstance()->NTHelper()->Alloc(dwReadSize, __FUNCTION__);
207 if (!pModuleDump)
208 {
209 SCANNER_LOG(LL_ERR, "Memory can NOT allocated! Error: %u", g_winapiApiTable->GetLastError());
210 goto _Complete;
211 }
212
213 ntStat = ReadProcessMemory64(hProcess, pModuleBase, pModuleDump, dwReadSize, &dwReadByteCount);
214 if (!NT_SUCCESS(ntStat))
215 {
216 SCANNER_LOG(LL_ERR, "ReadProcessMemory64 fail! Target process: %p Status: %p", hProcess, ntStat);
217 goto _Complete;
218 }
219
220 dwPEHeaderSize = CPEFunctions::GetPEHeaderSize((DWORD)pModuleDump);
221 if (!dwPEHeaderSize)
222 {
223 SCANNER_LOG(LL_ERR, "PE Header size find fail!");
224 goto _Complete;
225 }
226
227 SCANNER_LOG(LL_SYS, "Module dump succesfully created! Base: %p Size: %u", pModuleDump, dwPEHeaderSize);
228
229 if (false == CheckModulePEHeaderDestroy(hProcess, szModuleName, pModuleBase, cbModuleSize))
230 {
231 SCANNER_LOG(LL_ERR, "PE Header was destroyed!");
232 goto _Complete;
233 }
234 if (false == CheckModulePEHeaderWipe(hProcess, szModuleName, pModuleDump, dwPEHeaderSize))
235 {
236 SCANNER_LOG(LL_ERR, "PE Header was wiped!");
237 goto _Complete;
238 }
239 if (false == CheckModulePEHeaderFill(hProcess, szModuleName, pModuleDump, dwPEHeaderSize))
240 {
241 SCANNER_LOG(LL_ERR, "PE Header was fill'd with fake data!");
242 goto _Complete;
243 }
244 if (false == CheckModulePEHeaderHash(hProcess, szModuleName, pModuleDump, dwPEHeaderSize))
245 {
246 SCANNER_LOG(LL_ERR, "PE Header hash blacklisted!");
247 goto _Complete;
248 }

Callers 1

ScanModuleMethod · 0.85

Calls 10

ReadProcessMemory64Function · 0.85
CheckModulePEHeaderWipeFunction · 0.85
CheckModulePEHeaderFillFunction · 0.85
CheckModulePEHeaderHashFunction · 0.85
GetProcessIdMethod · 0.80
NTHelperMethod · 0.80
DynamicWinapiInstanceMethod · 0.80
AllocMethod · 0.45
FreeMethod · 0.45

Tested by

no test coverage detected