| 189 | |
| 190 | |
| 191 | bool 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 | } |
no test coverage detected