#pragma once #include "types.h" #include "hashmap.h" // ======================= // ====== windows.h ====== // ======================= typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header u16 e_magic; // Magic number u16 e_cblp; // Bytes on last page of file u16 e_cp; // Pages in file u16 e_crlc; // Relocations u16 e_cparhdr; // Size of header in paragraphs u16 e_minalloc; // Minimum extra paragraphs needed u16 e_maxalloc; // Maximum extra paragraphs needed u16 e_ss; // Initial (relative) SS value u16 e_sp; // Initial SP value u16 e_csum; // Checksum u16 e_ip; // Initial IP value u16 e_cs; // Initial (relative) CS value u16 e_lfarlc; // File address of relocation table u16 e_ovno; // Overlay number u16 e_res[4]; // Reserved words u16 e_oemid; // OEM identifier (for e_oeminfo) u16 e_oeminfo; // OEM information; e_oemid specific u16 e_res2[10]; // Reserved words i32 e_lfanew; // File address of new exe header } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; // // File header format. // typedef struct _IMAGE_FILE_HEADER { u16 Machine; u16 NumberOfSections; u32 TimeDateStamp; u32 PointerToSymbolTable; u32 NumberOfSymbols; u16 SizeOfOptionalHeader; u16 Characteristics; } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; #define IMAGE_SIZEOF_FILE_HEADER 20 // Directory Entries #define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory #define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // Import Directory #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // Resource Directory #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // Exception Directory #define IMAGE_DIRECTORY_ENTRY_SECURITY 4 // Security Directory #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 // Base Relocation Table #define IMAGE_DIRECTORY_ENTRY_DEBUG 6 // Debug Directory // IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 // (X86 usage) #define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7 // Architecture Specific Data #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // RVA of GP #define IMAGE_DIRECTORY_ENTRY_TLS 9 // TLS Directory #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory #define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 // Bound Import Directory in headers #define IMAGE_DIRECTORY_ENTRY_IAT 12 // Import Address Table #define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13 // Delay Load Import Descriptors #define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 // COM Runtime descriptor // // Directory format. // typedef struct _IMAGE_DATA_DIRECTORY { u32 VirtualAddress; u32 Size; } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 typedef struct _IMAGE_OPTIONAL_HEADER64 { u16 Magic; u8 MajorLinkerVersion; u8 MinorLinkerVersion; u32 SizeOfCode; u32 SizeOfInitializedData; u32 SizeOfUninitializedData; u32 AddressOfEntryPoint; u32 BaseOfCode; u64 ImageBase; u32 SectionAlignment; u32 FileAlignment; u16 MajorOperatingSystemVersion; u16 MinorOperatingSystemVersion; u16 MajorImageVersion; u16 MinorImageVersion; u16 MajorSubsystemVersion; u16 MinorSubsystemVersion; u32 Win32VersionValue; u32 SizeOfImage; u32 SizeOfHeaders; u32 CheckSum; u16 Subsystem; u16 DllCharacteristics; u64 SizeOfStackReserve; u64 SizeOfStackCommit; u64 SizeOfHeapReserve; u64 SizeOfHeapCommit; u32 LoaderFlags; u32 NumberOfRvaAndSizes; IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; } IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64; typedef struct _IMAGE_NT_HEADERS64 { u32 Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER64 OptionalHeader; } IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64; // ======================== // ====== !windows.h ====== // ======================== struct module { void* base_addr; u8** functions_name; u32* functions_start; u32* functions_end; u32* functions_unwind; u32 functions_count; u32 functions_capacity; // u32 functions_name_capacity; // u32 function_start_capacity; // u32 function_end_capacity; // u32 function_unwind_capacity; IMAGE_DOS_HEADER dos_header; IMAGE_NT_HEADERS64 nt_header; #ifdef HASHMAP struct hashmap symbols; #endif i8 full_name[256U]; u8 full_name_len; i8* base_name; u8 base_name_len; }; extern struct module modules[64U]; extern u64 modules_list; extern u8 add_module(void); extern void remove_module(u8 index); #ifdef HASHMAP extern struct element* find_function(struct module* module, u32 rip_offset); #else extern u32 find_function(struct module* module, u64 rip_offset); #endif // HASHMAP