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