20 if (!peconv::validate_ptr(loadedData, loadedSize,
field,
sizeof(
BYTE))) {
55 if (!nt_file_hdr)
return false;
180 if (!
hdr_ptr)
return peconv::fetch_region_size(processHandle, (
PBYTE)modBaseAddr);
205 std::cout <<
"[!] Mismatch: region_base : " << std::hex <<
page_info.AllocationBase <<
" while main base: " <<
main_base <<
"\n";
223 std::cout <<
"Image: " << std::hex << (
ULONGLONG)modBaseAddr <<
" Size:" << std::hex <<
total_size <<
" max_addr: " <<
max_addr << std::endl;
237 if (!data)
return nullptr;
256 if (!memPage.load()) {
264 0x0E, 0x1F, 0xBA, 0x0E, 0x00, 0xB4,
265 0x09, 0xCD, 0x21, 0xB8, 0x01, 0x4C,
269 0xBA, 0x10, 0x00, 0x0E, 0x1F, 0xB4,
270 0x09, 0xCD, 0x21, 0xB8, 0x01, 0x4C,
300 if (!sec_hdr || !sec_count) {
309 for (
size_t i = 0;
i < sec_count;
i++,
curr_sec++) {
310 if (
curr_sec->VirtualAddress == 0)
continue;
318 std::cout << std::hex <<
last_sec_addr <<
" couldn't fetch module info" << std::endl;
324 std::cout <<
"[-] SecBase mismatch: ";
341 ULONGLONG pe_image_base = this->calcPeBase(memPage, sec_hdr);
345 for (
size_t i = 0;
i < sec_count;
i++,
curr_sec++) {
353 bool is_ok = _validateSecRegions(memPage, sec_hdr, sec_count, pe_image_base,
true);
356 is_ok = _validateSecRegions(memPage, sec_hdr, sec_count, pe_image_base,
false);
359 std::cout <<
"[-] Raw failed!\n";
362 std::cout <<
"[+] Raw OK!\n";
368 std::cout <<
"[+] Virtual OK!\n";
376 if (!memPage.load()) {
396 0x00, 0x00, 0x00, 0x00,
397 0x00, 0x00, 0x00, 0x00,
398 0x00, 0x00, 0x00, 0x00,
399 0x20, 0x00, 0x00, 0x60
402 0x00, 0x00, 0x00, 0x00,
403 0x00, 0x00, 0x00, 0x00,
404 0x00, 0x00, 0x00, 0x00,
405 0x40, 0x00, 0x00, 0xC0
444 if (!_validateSecRegions(memPage,
first_sec, count)) {
447 std::cout <<
"[!] section header: " << std::hex << (
ULONGLONG)memPage.
region_start <<
" hdr at: " <<
diff <<
" : validation failed!\n";
482 if (!peconv::validate_ptr(loadedData, loadedSize,
hdr_candidate,
503 if (!loadedData)
return nullptr;
562 if (!memPage.
load()) {
602 if (setMzPe(
aMap, dos_hdr)) {
603 aMap.isMzPeFound =
true;
628 if (
_sec_hdr ==
nullptr)
return false;
635 size_t loadedSize =
aMap.memPage.getLoadedSize();
645 if (!
aMap.nt_file_hdr) {
656 aMap.sec_count = count;
657 if (!
aMap.pe_image_base) {
681 aMap.nt_file_hdr =
nullptr;
683 std::cout <<
"[WARNING] Sections header misaligned with FileHeader." << std::endl;
694 size_t loadedSize =
aMap.memPage.getLoadedSize();
711 if (!
aMap.pe_image_base) {
715 peArt->calculatedImgSize = calcImageSize(memPage,
aMap.sec_hdr,
aMap.pe_image_base);
717 if (
aMap.nt_file_hdr) {
722 aMap.is64bit =
false;
728 aMap.is64bit = this->isProcess64bit;
752 std::cout << std::hex <<
"Page: " <<
aMap.memPage.start_va <<
" Found DOS Header at: " <<
dos_offset <<
"\n";
757 std::cout << std::hex <<
"Page: " <<
aMap.memPage.start_va <<
" Searching NT Header at: " <<
min_offset <<
"\n";
765 if (
aMap.nt_file_hdr) {
777 if (!setSecHdr(
aMap,
aMap.sec_hdr)) {
782 setSecHdr(
aMap, sec_hdr);
791 std::cout <<
"Setting minOffset to SecHdr end offset: " << std::hex <<
min_offset <<
"\n";
799 if (
aMap.dos_hdr && !
aMap.nt_file_hdr) {
803 std::cout <<
"Found PE offset: " << std::hex <<
aMap.dos_hdr->e_lfanew <<
" NT offset: " <<
nt_offset <<
"\n";
811 if (!setSecHdr(
aMap,
aMap.sec_hdr)) {
812 aMap.sec_hdr =
nullptr;
817 if (!
aMap.foundAny())
break;
851 peArt = findArtefacts(*prevMemPage, 0);
864 bool is_shellcode =
false;
865 if (
peArt.peBaseOffset > 0) {
881 ULONGLONG region_start = memPage.region_start;
882 this->artPagePtr = &memPage;
885 if (!
peArt && (region_start > memPage.alloc_base)) {
886 peArt = findInPrevPages(memPage.alloc_base, memPage.region_start);
888 this->artPagePtr = prevMemPage;
889 region_start = prevMemPage->region_start;
899 my_report->protection = memPage.protection;
A report from the artefacts scan, generated by ArtefactScanner.
virtual ArtefactScanReport * scanRemote()
bool hasShellcode(HMODULE region_start, size_t region_size, PeArtefacts &peArt)
size_t calcImageSize(MemPageData &memPage, IMAGE_SECTION_HEADER *hdr_ptr, ULONGLONG pe_image_base)
ULONGLONG _findMZoffset(MemPageData &memPage, LPVOID hdr_ptr)
bool findMzPe(ArtefactsMapping &mapping, const size_t search_offset)
IMAGE_SECTION_HEADER * findSecByPatterns(MemPageData &memPageData, const size_t max_search_size, const size_t search_offset)
ULONGLONG calcPeBase(MemPageData &memPage, LPVOID hdr_ptr)
bool setMzPe(ArtefactsMapping &mapping, IMAGE_DOS_HEADER *_dos_hdr)
bool setNtFileHdr(ArtefactScanner::ArtefactsMapping &aMap, IMAGE_FILE_HEADER *_nt_hdr)
IMAGE_DOS_HEADER * _findDosHdrByPatterns(BYTE *search_ptr, const size_t max_search_size)
bool setSecHdr(ArtefactsMapping &mapping, IMAGE_SECTION_HEADER *_sec_hdr)
bool _validateSecRegions(MemPageData &memPage, LPVOID sec_hdr, size_t sec_count, ULONGLONG pe_image_base, bool is_virtual)
IMAGE_FILE_HEADER * findNtFileHdr(MemPageData &memPage, const size_t start_offset, size_t stop_offset=INVALID_OFFSET)
PeArtefacts * findArtefacts(MemPageData &memPage, size_t start_offset)
IMAGE_DOS_HEADER * findDosHdrByPatterns(MemPageData &memPage, const size_t start_offset, size_t stop_offset=INVALID_OFFSET)
static size_t calcImgSize(HANDLE processHandle, HMODULE modBaseAddr, BYTE *headerBuffer, size_t headerBufferSize, IMAGE_SECTION_HEADER *hdr_ptr=NULL)
PeArtefacts * findInPrevPages(ULONGLONG addr_start, ULONGLONG addr_stop)
PeArtefacts * generateArtefacts(ArtefactsMapping &aMap)
IMAGE_DOS_HEADER * findMzPeHeader(MemPageData &memPage, const size_t search_offset)
BYTE * _findSecByPatterns(BYTE *search_ptr, const size_t max_search_size)
size_t getLoadedSize(bool trimmed=false)
const PBYTE getLoadedData(bool trimmed=false)
bool validatePtr(const LPVOID field_bgn, size_t field_size)
A report about the PE artefact detected in the workingset.
bool validate_hdrs_alignment(MemPageData &memPage, IMAGE_FILE_HEADER *nt_file_hdr, IMAGE_SECTION_HEADER *_sec_hdr)
size_t calc_offset(MemPageData &memPage, LPVOID field)
IMAGE_SECTION_HEADER * get_first_section(BYTE *loadedData, size_t loadedSize, IMAGE_SECTION_HEADER *hdr_ptr)
size_t calc_nt_hdr_offset(MemPageData &memPage, IMAGE_SECTION_HEADER *first_sec, bool is64bit=true)
BYTE * find_pattern(BYTE *buffer, size_t buf_size, BYTE *pattern_buf, size_t pattern_size, size_t max_iter=0)
DWORD(__stdcall *_PssCaptureSnapshot)(HANDLE ProcessHandle
size_t count_section_hdrs(BYTE *loadedData, size_t loadedSize, IMAGE_SECTION_HEADER *hdr_ptr)
size_t calc_sec_hdrs_offset(MemPageData &memPage, IMAGE_FILE_HEADER *nt_file_hdr)
bool is_valid_file_hdr(BYTE *loadedData, size_t loadedSize, BYTE *hdr_ptr, DWORD charact)
size_t fill_iat(BYTE *vBuf, size_t vBufSize, IN const peconv::ExportsMapper *exportsMap, IN OUT IATBlock &iat, IN ThunkFoundCallback *callback)
bool is_valid_section(BYTE *loadedData, size_t loadedSize, BYTE *hdr_ptr, DWORD charact)