| 867 | } |
| 868 | } |
| 869 | DWORD GetExecutableFunction(LPBYTE image, LPCSTR functionName) |
| 870 | { |
| 871 | BOOL is64Bit; |
| 872 | if (IsExecutable64Bit(image, &is64Bit)) |
| 873 | { |
| 874 | PIMAGE_EXPORT_DIRECTORY exportDirectory; |
| 875 | if (is64Bit) |
| 876 | { |
| 877 | PIMAGE_NT_HEADERS64 ntHeaders = (PIMAGE_NT_HEADERS64)(image + ((PIMAGE_DOS_HEADER)image)->e_lfanew); |
| 878 | exportDirectory = (PIMAGE_EXPORT_DIRECTORY)(image + RvaToOffset(image, ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress)); |
| 879 | } |
| 880 | else |
| 881 | { |
| 882 | PIMAGE_NT_HEADERS32 ntHeaders = (PIMAGE_NT_HEADERS32)(image + ((PIMAGE_DOS_HEADER)image)->e_lfanew); |
| 883 | exportDirectory = (PIMAGE_EXPORT_DIRECTORY)(image + RvaToOffset(image, ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress)); |
| 884 | } |
| 885 | |
| 886 | LPDWORD nameDirectory = (LPDWORD)(image + RvaToOffset(image, exportDirectory->AddressOfNames)); |
| 887 | LPWORD nameOrdinalDirectory = (LPWORD)(image + RvaToOffset(image, exportDirectory->AddressOfNameOrdinals)); |
| 888 | |
| 889 | for (DWORD i = 0; i < exportDirectory->NumberOfNames; i++) |
| 890 | { |
| 891 | if (StrStrA((PCHAR)(image + RvaToOffset(image, *nameDirectory)), functionName)) |
| 892 | { |
| 893 | return RvaToOffset(image, *(LPDWORD)(image + RvaToOffset(image, exportDirectory->AddressOfFunctions) + *nameOrdinalDirectory * sizeof(DWORD))); |
| 894 | } |
| 895 | |
| 896 | nameDirectory++; |
| 897 | nameOrdinalDirectory++; |
| 898 | } |
| 899 | } |
| 900 | |
| 901 | return 0; |
| 902 | } |
| 903 | DWORD RvaToOffset(LPBYTE image, DWORD rva) |
| 904 | { |
| 905 | PIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS)(image + ((PIMAGE_DOS_HEADER)image)->e_lfanew); |
no test coverage detected