Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<windows.h>
- #include<winternl.h>
- #include<dbghelp.h>
- #include<tchar.h>
- #include<iostream>
- int gtfo(const char* text = "")
- {
- printf("gtfo! (%s)\n", text);
- return -1;
- }
- int main(int argc, char* argv[]) {
- DWORD bytesRead = NULL;
- HANDLE hFile = CreateFileA(argv[1], GENERIC_ALL, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
- DWORD fileSize = GetFileSize(hFile, NULL);
- LPVOID lpFile = HeapAlloc(GetProcessHeap(), 0, fileSize);
- ReadFile(hFile, lpFile, fileSize, &bytesRead, NULL);
- printf("\n\n[*] PE PATH : \"%s\" \n",argv[1]);
- printf("\n ----------------------------------------------------------\n");
- printf("| DOS HEADER |\n");
- printf(" ----------------------------------------------------------\n");
- IMAGE_DOS_HEADER* dosHeader = (IMAGE_DOS_HEADER*)lpFile;
- printf("e_magic:\t%x\t\tSIZE : WORD\n", dosHeader->e_magic);
- printf("e_cblp:\t\t%x\t\tSIZE : WORD\n", dosHeader->e_cblp);
- printf("e_cp:\t\t%x\t\tSIZE : WORD\n", dosHeader->e_cp);
- printf("e_crlc:\t\t%x\t\tSIZE : WORD\n", dosHeader->e_crlc);
- printf("e_minalloc:\t%x\t\tSIZE : WORD\n", dosHeader->e_minalloc);
- printf("e_maxalloc:\t%x\t\tSIZE : WORD\n", dosHeader->e_maxalloc);
- printf("e_ss:\t\t%x\t\tSIZE : WORD\n", dosHeader->e_ss);
- printf("e_sp:\t\t%x\t\tSIZE : WORD\n", dosHeader->e_sp);
- printf("e_csum:\t\t%x\t\tSIZE : WORD\n", dosHeader->e_csum);
- printf("e_ip:\t\t%x\t\tSIZE : WORD\n", dosHeader->e_ip);
- printf("e_cs:\t\t%x\t\tSIZE : WORD\n", dosHeader->e_cs);
- printf("e_lfarlc:\t%x\t\tSIZE : WORD\n", dosHeader->e_lfarlc);
- printf("e_ovno:\t\t%x\t\tSIZE : WORD\n", dosHeader->e_ovno);
- printf("e_res1: \t%x\t\tSIZE : WORD\n", dosHeader->e_res[0]);
- printf(" \t%x\t\tSIZE : WORD\n", dosHeader->e_res[1]);
- printf(" \t%x\t\tSIZE : WORD\n", dosHeader->e_res[2]);
- printf(" \t%x\t\tSIZE : WORD\n", dosHeader->e_res[3]);
- printf("e_oemid:\t%x\t\tSIZE : WORD\n", dosHeader->e_oemid);
- printf("e_oeminfo:\t%x\t\tSIZE : WORD\n", dosHeader->e_oeminfo);
- printf("e_res2:\t\t%x\t\tSIZE : WORD\n", dosHeader->e_res2[0]);
- printf(" \t\t%x\t\tSIZE : WORD\n", dosHeader->e_res2[1]);
- printf(" \t\t%x\t\tSIZE : WORD\n", dosHeader->e_res2[2]);
- printf(" \t\t%x\t\tSIZE : WORD\n", dosHeader->e_res2[3]);
- printf(" \t\t%x\t\tSIZE : WORD\n", dosHeader->e_res2[4]);
- printf(" \t\t%x\t\tSIZE : WORD\n", dosHeader->e_res2[5]);
- printf(" \t\t%x\t\tSIZE : WORD\n", dosHeader->e_res2[6]);
- printf(" \t\t%x\t\tSIZE : WORD\n", dosHeader->e_res2[7]);
- printf(" \t\t%x\t\tSIZE : WORD\n", dosHeader->e_res2[8]);
- printf(" \t\t%x\t\tSIZE : WORD\n", dosHeader->e_res2[9]);
- printf("e_lfanew:\t%x\t\tSIZE : LONG\n", dosHeader->e_lfanew);
- IMAGE_NT_HEADERS* ntHeaders = (IMAGE_NT_HEADERS*)((DWORD_PTR)lpFile + (DWORD)dosHeader->e_lfanew);
- printf("\n ----------------------------------------------------------\n");
- printf("| NT HEADER |\n");
- printf(" ----------------------------------------------------------\n");
- printf("Signature:\t%x\t\t\tSIZE : DWORD\n", ntHeaders->Signature);
- printf("FileHeader:\n");
- printf("\tMachine:\t\t%x\t\tSIZE: WORD\n", ntHeaders->FileHeader.Machine);
- printf("\tNumberOfSections:\t%d\t\tSIZE: WORD\n", ntHeaders->FileHeader.NumberOfSections);
- printf("\tTimeDateStamp:\t\t%x\tSIZE: DWORD\n", ntHeaders->FileHeader.TimeDateStamp);
- printf("\tPointerToSymbolTable:\t%x\t\tSIZE: DWORD\n", ntHeaders->FileHeader.PointerToSymbolTable);
- printf("\tNumberOfSymbols:\t%x\t\tSIZE: DWORD\n", ntHeaders->FileHeader.NumberOfSymbols);
- printf("\tSizeOfOptionalHeader:\t%x\t\tSIZE: WORD\n", ntHeaders->FileHeader.SizeOfOptionalHeader);
- printf("\tCharacteristics:\t%x\t\tSIZE: WORD\n", ntHeaders->FileHeader.Characteristics);
- IMAGE_OPTIONAL_HEADER* imgOptHeader = &ntHeaders->OptionalHeader;
- printf("OptionalHeader:\n");
- printf("\tMagic:\t\t\t%x\t\tSIZE: WORD\n", imgOptHeader->Magic);
- printf("\tMajorLinkerVersion:\t%x\t\tSIZE: BYTE\n", imgOptHeader->MajorLinkerVersion);
- printf("\tMinorLinkerVersion:\t%x\t\tSIZE: BYTE\n", imgOptHeader->MinorLinkerVersion);
- printf("\tSizeOfCode:\t\t%x\t\tSIZE: DWORD\n", imgOptHeader->SizeOfCode);
- printf("\tSizeOfInitializedData:\t%x\t\tSIZE: DWORD\n", imgOptHeader->SizeOfInitializedData);
- printf("\tSizeOfUninitializedData:%x\t\tSIZE: DWORD\n", imgOptHeader->SizeOfUninitializedData);
- printf("\tAddressOfEntryPoint:\t%x\t\tSIZE: DWORD\n", imgOptHeader->AddressOfEntryPoint);
- printf("\tBaseOfCode:\t\t%x\t\tSIZE: DWORD\n", imgOptHeader->BaseOfCode);
- printf("\tImageBase:\t\t%x\tSIZE: DWORD\n", imgOptHeader->ImageBase);
- printf("\tSectionAlignment:\t%x\t\tSIZE: DWORD\n", imgOptHeader->SectionAlignment);
- printf("\tFileAlignment:\t\t%x\t\tSIZE: DWORD\n", imgOptHeader->FileAlignment);
- printf("\tMajorOperatingSystemVersion:\t%x\tSIZE: WORD\n", imgOptHeader->MajorOperatingSystemVersion);
- printf("\tMinorOperatingSystemVersion:\t%x\tSIZE: WORD\n", imgOptHeader->MinorOperatingSystemVersion);
- printf("\tMajorImageVersion:\t%x\t\tSIZE: WORD\n", imgOptHeader->MajorImageVersion);
- printf("\tMinorImageVersion:\t%x\t\tSIZE: WORD\n", imgOptHeader->MinorImageVersion);
- printf("\tMajorSubsystemVersion:\t%x\t\tSIZE: WORD\n", imgOptHeader->MajorSubsystemVersion);
- printf("\tMinorSubsystemVersion:\t%x\t\tSIZE: WORD\n", imgOptHeader->MinorSubsystemVersion);
- printf("\tWin32VersionValue:\t%x\t\tSIZE: DWORD\n", imgOptHeader->Win32VersionValue);
- printf("\tSizeOfImage:\t\t%x\t\tSIZE: DWORD\n", imgOptHeader->SizeOfImage);
- printf("\tSizeOfHeaders:\t\t%x\t\tSIZE: DWORD\n", imgOptHeader->SizeOfHeaders);
- printf("\tCheckSum:\t\t%x\t\tSIZE: DWORD\n", imgOptHeader->CheckSum);
- printf("\tSubsystem:\t\t%x\t\tSIZE: WORD\n", imgOptHeader->Subsystem);
- printf("\tDllCharacteristics:\t%x\t\tSIZE: WORD\n", imgOptHeader->DllCharacteristics);
- printf("\tSizeOfStackReserve:\t%x\t\tSIZE: DWORD\n", imgOptHeader->SizeOfStackReserve);
- printf("\tSizeOfStackCommit:\t%x\t\tSIZE: DWORD\n", imgOptHeader->SizeOfStackCommit);
- printf("\tSizeOfHeapReserve:\t%x\t\tSIZE: DWORD\n", imgOptHeader->SizeOfHeapReserve);
- printf("\tSizeOfHeapCommit:\t%x\t\tSIZE: DWORD\n", imgOptHeader->SizeOfHeapCommit);
- printf("\tLoaderFlags:\t\t%x\t\tSIZE: DWORD\n", imgOptHeader->LoaderFlags);
- printf("\tNumberOfRvaAndSizes:\t%x\t\tSIZE: DWORD\n", imgOptHeader->NumberOfRvaAndSizes);
- printf("\tDataDirectory:\n");
- printf("\t\tMember\t\t\t\t\tValue\t\tSize\n");
- printf("\t\t-------------------------------------------------------------\n");
- printf("\t\tExport Directory RVA\t\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[0].VirtualAddress);
- printf("\t\tExport Directory Size\t\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[0].Size);
- printf("\t\tImport Directory RVA\t\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[1].VirtualAddress);
- printf("\t\tImport Directory Size\t\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[1].Size);
- printf("\t\tResource Directory RVA\t\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[2].VirtualAddress);
- printf("\t\tResource Directory Size\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[2].Size);
- printf("\t\tException Directory RVA\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[3].VirtualAddress);
- printf("\t\tException Directory Size\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[3].Size);
- printf("\t\tSecurity Directory RVA\t\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[4].VirtualAddress);
- printf("\t\tSecurity Directory Size\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[4].Size);
- printf("\t\tRelocation Directory RVA\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[5].VirtualAddress);
- printf("\t\tRelocation Directory Size\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[5].Size);
- printf("\t\tDebug Directory RVA\t\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[6].VirtualAddress);
- printf("\t\tDebug Directory Size\t\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[6].Size);
- printf("\t\tArchitecture Directory RVA\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[7].VirtualAddress);
- printf("\t\tArchitecture Directory Size\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[7].Size);
- printf("\t\tGlobal Pointer Directory RVA\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[8].VirtualAddress);
- printf("\t\tGlobal Pointer Directory Size\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[8].Size);
- printf("\t\tThread Local Storage Directory RVA\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[9].VirtualAddress);
- printf("\t\tThread Local Storage Directory Size\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[9].Size);
- printf("\t\tLoad Configuration Directory RVA\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[10].VirtualAddress);
- printf("\t\tLoad Configuration Directory Size\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[10].Size);
- printf("\t\tBound Import Directory RVA\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[11].VirtualAddress);
- printf("\t\tBound Import Directory Size\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[11].Size);
- printf("\t\tImport Address Table RVA\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[12].VirtualAddress);
- printf("\t\tImport Address Table Size\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[12].Size);
- printf("\t\tDelay Import Table RVA\t\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[13].VirtualAddress);
- printf("\t\tDelay Import Table Size\t\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[13].Size);
- printf("\t\tCOM Descriptor Table RVA\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[14].VirtualAddress);
- printf("\t\tCOM Descriptor Table Size\t\t%x\t\tDWORD\n", imgOptHeader->DataDirectory[14].Size);
- printf("\t\t-------------------------------------------------------------\n");
- IMAGE_SECTION_HEADER* sectionHeader = IMAGE_FIRST_SECTION(ntHeaders);
- printf("\n --------------------------------------------------------------\n");
- printf("| SECTION HEADER |\n");
- printf(" --------------------------------------------------------------\n");
- printf("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n");
- printf("Name\t\tVirtualSize\tVirtualAddress\tRawSize\t\tRawAddress\tRelocAddress\tLinenumbers\tRelocationsNumbers\tLinenumbersNumbers\tCharacteristics\n");
- printf("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n");
- for (int i = 0; i < ntHeaders->FileHeader.NumberOfSections; i++) {
- printf("%s\t\t%x\t\t%x\t\t%x\t\t%x\t\t%x\t\t%x\t\t%x\t\t\t%x\t\t\t%x\n", sectionHeader->Name, sectionHeader->Misc.VirtualSize,sectionHeader->VirtualAddress,sectionHeader->SizeOfRawData,sectionHeader->PointerToRawData,sectionHeader->PointerToRelocations,sectionHeader->PointerToLinenumbers,sectionHeader->NumberOfRelocations,sectionHeader->NumberOfLinenumbers,sectionHeader->Characteristics);
- sectionHeader++;
- }
- printf("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n");
- //map the file
- HANDLE hMappedFile = CreateFileMappingA(hFile, nullptr, PAGE_READONLY | SEC_IMAGE, 0, 0, nullptr);
- if (!hMappedFile)
- return gtfo("CreateFileMappingA");
- //map the sections appropriately
- LPVOID fileMap = MapViewOfFile(hMappedFile, FILE_MAP_READ, 0, 0, 0);
- if (!fileMap)
- return gtfo("MapViewOfFile");
- IMAGE_DATA_DIRECTORY importDir = ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
- printf("\n --------------------------------------------------------------\n");
- printf("| Import Directory |\n");
- printf(" --------------------------------------------------------------\n");
- //printf(" RVA: %08X\n", importDir.VirtualAddress);
- //printf("Size: %08X\n\n", importDir.Size);
- if (!importDir.VirtualAddress || !importDir.Size)
- return gtfo("No Import directory!");
- PIMAGE_IMPORT_DESCRIPTOR importDescriptor = PIMAGE_IMPORT_DESCRIPTOR(ULONG_PTR(fileMap) + importDir.VirtualAddress);
- if (!IsBadReadPtr((char*)fileMap + importDir.VirtualAddress, 0x1000))
- {
- for (; importDescriptor->FirstThunk; importDescriptor++)
- {
- int numberOfimports = 0;
- printf("OriginalFirstThunk: %08X\n", importDescriptor->OriginalFirstThunk);
- printf(" TimeDateStamp: %08X\n", importDescriptor->TimeDateStamp);
- printf(" ForwarderChain: %08X\n", importDescriptor->ForwarderChain);
- if (!IsBadReadPtr((char*)fileMap + importDescriptor->Name, 0x1000))
- printf(" Name: %08X \"%s\"\n", importDescriptor->Name, (char*)fileMap + importDescriptor->Name);
- else
- printf(" Name: %08X INVALID\n", importDescriptor->Name);
- printf(" FirstThunk: %08X\n", importDescriptor->FirstThunk);
- PIMAGE_THUNK_DATA thunkData = PIMAGE_THUNK_DATA(ULONG_PTR(fileMap) + importDescriptor->FirstThunk);
- for (; thunkData->u1.AddressOfData; thunkData++)
- {
- numberOfimports++;
- ULONG_PTR rva = ULONG_PTR(thunkData) - ULONG_PTR(fileMap);
- ULONG data = thunkData->u1.AddressOfData;
- if (data & IMAGE_ORDINAL_FLAG)
- printf(" Ordinal: %08X\n", data & ~IMAGE_ORDINAL_FLAG);
- else
- {
- PIMAGE_IMPORT_BY_NAME importByName = PIMAGE_IMPORT_BY_NAME(ULONG_PTR(fileMap) + data);
- if (!IsBadReadPtr(importByName, 0x1000))
- printf(" Function: %08X \"%s\"\n", data, (char*)importByName->Name);
- else
- printf(" Function: %08X INVALID\n", data);
- }
- }
- printf(" Numbers of imports: %d\n", numberOfimports);
- numberOfimports = 0;
- puts("");
- }
- }
- else
- puts("INVALID IMPORT DESCRIPTOR");
- }
Add Comment
Please, Sign In to add comment