DLL
Dynamic Link Library(DLL),内存映射
Windows操作系统提供了数量庞大的库函数,包括进程、内存、窗口、消息、文件、网络等。同时运行多个程序时,每个进程都包含相同的库,严重浪费内存。
IMAGE_EXPORT_DIRECTORY
EAT是DLL的核心机制
- 不同的程序可以调用库文件中提供的函数
- 通过EAT,得到库文件导出函数的入口地址
- Name:库文件名字符串地址
- NumberOfFunctions:实际Export函数的个数
- NumberOfNames:Export函数中具有名字的函数个数
- AddressOfFunctions:Export函数地址数组
- AddressOfNmaes:函数名称地址数组
- AddressOfNameOrdinals:Ordinals地址数组
GetProcAddress()操作原理
如何通过EAT获得函数地址?
从库中获得函数地址的API为GetProcAddress()
函数。
AddressOfNames
定位“函数名称地址数组”- 在“函数名称地址数组”中,通过比较字符串(strcmp),查找指定的函数名称。此时的数组索引称为
name_index
。 - 利用
AddressOfNameOridinals
成员,定位ordinal
数组 - 在
ordinal
数组中,通过name_index
查找相应的ordinal
值 - 利用
AddressOfFunctions
成员,定位“函数地址数组”(EAT) - 在函数地址数组中,利用
ordinals
值作为索引,获得指定函数的起始地址
如果函数是以序号导出的,那么查找的时候直接用序号减去Base,得到的值就是函数在AddressOfFunctions中的下标。