在上一篇博客中说了导入表,所谓的导入表,其实相当于记录程序所依赖的函数库信息,类似于你要调用外部函数,总得记录下这个函数在哪个库中,名字或者序号是什么。有了这些信息后,我们就可以LoadLibrary和GetProcAddress获取函数地址了
那么,操作系统是如何来获取函数地址呢,也就是GetProcAddress的实现,这里就涉及到了导出表。导出表,会记录这个库函数的地址是多少,所以简单来说GetProcAddress就是查导出表来获取地址,如何查就是下面的话题了。
导出意味着需要提供API给他人使用,一般来说会是一些DLL之类的,所以,我们先来写一个DLL,再来分析其PE格式
.386
.model flat, stdcall ;32 bit memory model
option casemap :none ;case sensitive
include windows.inc
include user32.inc
includelib user32.lib
public g_nTest
.data
g_nTest dd 87654321h
.code
ShowMsg proc szText:LPSTR,szTitle:LPSTR
invoke MessageBox,NULL,szText,szTitle,MB_OK
ret
ShowMsg endp
MySub proc x:UINT,y:UINT
mov eax,x
sub eax,y
MySub endp
MyAdd proc x:UINT,y:UINT
mov eax,x
add eax,y
MyAdd endp
DllMain proc hinstDLL:HINSTANCE,fdwReason:DWORD,lpvReserved:LPVOID
mov eax,TRUE
ret
DllMain endp
end DllMain
def文件描述
EXPORTS
ShowMsg @11
MySub @5 noname
MyAdd @7
g_nTest @8
这里我们先用Depends来观察一下导出情况
其中序号为5,7,8,9的就是我们自己导出的,那么剩余的是什么,下面就可以通过导入表来解释了
首先先来说一下如何定位到导入表,导入表位于数据目录的第一项
2060这里转FA的话就是660,所以文件地址从660开始,大小为77,这一整块是导入表信息的总大小,这里