Assembly 代码如何知道API函数的地址?

Assembly 代码如何知道API函数的地址?,assembly,dll,portable-executable,relocation,Assembly,Dll,Portable Executable,Relocation,再一次为这个糟糕的标题感到抱歉 所以我上周一直在研究体育课的形式,但我没有得到什么东西。当进程加载时,所有DLL都映射到内存中。我不明白的是,因为DLL可以在随机的基址上加载,所以.exe文件的代码如何能够知道API函数的地址?是否有一些“启动代码”用于查找Kernel32.dll或其他内容?我知道进程很容易找到带有GetProcAddress的函数,但它如何获得GetProcAddress的地址?所有Windows.EXE文件(以及依赖于其他.DLL文件的所有.DLL文件)都有一个所谓的导入表

再一次为这个糟糕的标题感到抱歉

所以我上周一直在研究体育课的形式,但我没有得到什么东西。当进程加载时,所有DLL都映射到内存中。我不明白的是,因为DLL可以在随机的基址上加载,所以.exe文件的代码如何能够知道API函数的地址?是否有一些“启动代码”用于查找Kernel32.dll或其他内容?我知道进程很容易找到带有GetProcAddress的函数,但它如何获得GetProcAddress的地址?

所有Windows.EXE文件(以及依赖于其他.DLL文件的所有.DLL文件)都有一个所谓的导入表

此表包含DLL和所需函数的列表以及函数地址数组

当.EXE文件加载到内存中时,Windows将在内部为所有DLL调用LoadLibrary,并为该.EXE文件所需的所有API函数调用GetProcAddress。它将用GetProcAddress返回的值填充imports表中的数组

如果GetProcAddress返回NULL,则该值不会写入数组,但加载.EXE文件将失败

所有Windows.EXE文件(以及依赖于其他.DLL文件的所有.DLL文件)都有一个所谓的导入表

此表包含DLL和所需函数的列表以及函数地址数组

当.EXE文件加载到内存中时,Windows将在内部为所有DLL调用LoadLibrary,并为该.EXE文件所需的所有API函数调用GetProcAddress。它将用GetProcAddress返回的值填充imports表中的数组


如果GetProcAddress返回NULL,则该值不会写入数组,但加载.EXE文件将失败

导入的地址是否始终相同?它将如何获得这个地址?另外,每个加载的DLL是否有不同的导入表,或者只有一个导入表,每个DLL的所有函数都被加载到其中?DLL知道函数的地址在其空间内的什么位置。操作系统(和dll)知道dll作为一个整体在空间中的位置。应用程序和dll都知道函数的名称,因此应用程序向dll请求每个函数,此时dll和/或操作系统从导入表中知道每个项的位置,并在调用LoadLibrary时通知应用程序,是否自动将地址等添加到IAT?导入的地址是否始终相同?它将如何获得这个地址?另外,每个加载的DLL是否有不同的导入表,或者只有一个导入表,每个DLL的所有函数都被加载到其中?DLL知道函数的地址在其空间内的什么位置。操作系统(和dll)知道dll作为一个整体在空间中的位置。应用程序和dll都知道函数的名称,因此应用程序向dll请求每个函数,此时dll和/或操作系统从导入表中知道每个项的位置,并告知应用程序,所以当我调用LoadLibrary时,它是否会自动将地址等添加到IAT?