| 684 | } |
| 685 | |
| 686 | static 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 ? |
no outgoing calls
no test coverage detected
searching dependent graphs…