如何从内存加载DLL
本教程介绍了一种技术,该技术可如何从内存中加载动态链接库(DLL)。
文章结尾将给出github地址
Windows可执行文件– PE格式
首先我们先看看pe的结构
DOS headerDOS stub
PE header
Section header
Section 1
Section 2
. . .
Section n
下面给出的所有结构都可以在头文件winnt.h中找到。
DOS header
DOS header 仅用于向后兼容。它位于DOS stub 之前。
Microsoft定义DOS标头如下:
typedef struct _IMAGE_DOS_HEADER {// DOS .EXE标头
WORD e_magic; //Magic number
字e_cblp; //文件最后一页上的字节
字e_cp; //文件中的页面
WORD e_crlc; //Relocations
字e_cparhdr; //段落中header的大小
字e_minalloc; //所需的最少额外段落
字e_maxalloc; //所需的最大额外段落数
WORD e_ss; //初始(相对)SS值
WORD e_sp; //初始SP值
WORD e_csum; //校验和
WORD e_ip; //初始IP值
WORD e_cs; //初始(相对)CS值
字e_lfarlc; //重定位表的文件地址
WORD e_ovno; //覆盖数
WORD e_res [4]; //保留字
WORD e_oemid; // OEM标识符(用于e_oeminfo)
WORD e_oeminfo; // OEM信息;特定于e_oemid
字e_res2 [10]; //保留字
LONG e_lfanew; //新的exe标头的文件地址
} IMAGE_DOS_HEADER,* PIMAGE_DOS_HEADER;
PE header
PE 头包含有关可执行文件内不同部分的信息,这些信息用于存储代码和数据或定义从其他库导入或此库提供的导出。
它的定义如下:
typedef struct _IMAGE_NT_HEADERS {
DWORD签名;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32可选标题;
} IMAGE_NT_HEADERS32,* PIMAGE_NT_HEADERS32;
该FileHeader里描述的physical 文件的格式,如目录符号等信息:
typedef struct _IMAGE_FILE_HEADER {
WORD Machine;
WORD NumberOfSections;
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader;
WORD Characteristics;
} IMAGE_FILE_HEADER,* PIMAGE_FILE_HEADER;
该OptionalHeader里包含的信息逻辑库的格式,包括需要的操作系统版本,内存需求和切入点:
typedef struct _IMAGE_OPTIONAL_HEADER {
//
//标准字段。
//
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
//
// NT其他字段。
//
DWORD ImageBase;
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage;
DWORD SizeOfHeaders;
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32,* PIMAGE_OPTIONAL_HEADER32;
所述DataDirectory目录包含16(IMAGE_NUMBEROF_DIRECTORY_ENTRIES定义库的逻辑组件)条目:
Index
描述
0
导出功能
1
导入功能
2
资源资源
3
异常信息
4
安全信息