MCPcopy Create free account
hub / github.com/acl-dev/acl / GetPayloadSectionFromModule

Function GetPayloadSectionFromModule

lib_fiber/cpp/src/detours/modules.cpp:686–748  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

684}
685
686static PDETOUR_LOADED_BINARY WINAPI GetPayloadSectionFromModule(HMODULE hModule)
687{
688 PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hModule;
689 if (hModule == NULL) {
690 pDosHeader = (PIMAGE_DOS_HEADER)GetModuleHandleW(NULL);
691 }
692
693 __try {
694#pragma warning(suppress:6011) // GetModuleHandleW(NULL) never returns NULL.
695 if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) {
696 SetLastError(ERROR_BAD_EXE_FORMAT);
697 return NULL;
698 }
699
700 PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDosHeader +
701 pDosHeader->e_lfanew);
702 if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) {
703 SetLastError(ERROR_INVALID_EXE_SIGNATURE);
704 return NULL;
705 }
706 if (pNtHeader->FileHeader.SizeOfOptionalHeader == 0) {
707 SetLastError(ERROR_EXE_MARKED_INVALID);
708 return NULL;
709 }
710
711 PIMAGE_SECTION_HEADER pSectionHeaders
712 = (PIMAGE_SECTION_HEADER)((PBYTE)pNtHeader
713 + sizeof(pNtHeader->Signature)
714 + sizeof(pNtHeader->FileHeader)
715 + pNtHeader->FileHeader.SizeOfOptionalHeader);
716
717 for (DWORD n = 0; n < pNtHeader->FileHeader.NumberOfSections; n++) {
718 if (strcmp((PCHAR)pSectionHeaders[n].Name, ".detour") == 0) {
719 if (pSectionHeaders[n].VirtualAddress == 0 ||
720 pSectionHeaders[n].SizeOfRawData == 0) {
721
722 break;
723 }
724
725 PBYTE pbData = (PBYTE)pDosHeader + pSectionHeaders[n].VirtualAddress;
726 DETOUR_SECTION_HEADER *pHeader = (DETOUR_SECTION_HEADER *)pbData;
727 if (pHeader->cbHeaderSize < sizeof(DETOUR_SECTION_HEADER) ||
728 pHeader->nSignature != DETOUR_SECTION_HEADER_SIGNATURE) {
729
730 break;
731 }
732
733 if (pHeader->nDataOffset == 0) {
734 pHeader->nDataOffset = pHeader->cbHeaderSize;
735 }
736 SetLastError(NO_ERROR);
737 return (PBYTE)pHeader;
738 }
739 }
740 SetLastError(ERROR_EXE_MARKED_INVALID);
741 return NULL;
742 }
743 __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?

Callers 2

DetourGetSizeOfPayloadsFunction · 0.85
DetourFindPayloadFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…