运行时可加载内核模块如何知道核心内核功能的地址?

问题描述

| 我会对Linux和NT(或与此有关的任何其他产品)的答案感兴趣 编辑: 感谢Laurion的回答。 此处的更多信息: http://www.symantec.com/connect/articles/dynamic-linking-linux-and-windows-part-one http://www.symantec.com/connect/articles/dynamic-linking-linux-and-windows-part-two     

解决方法

        在加载模块时,运行时加载器通常会修复对导入功能的引用。它查看导入的函数表并放入正确的地址。该模块通过间接表使用导入的功能。     ,        之前已经为两个Windows内核(和Windows用户空间)编写了一个加载器:其工作方式相同。基本上所有二进制文件都有一个称为IAT的东西(例如,http://msdn.microsoft.com/zh-cn/magazine/cc301808.aspx,这是永恒的经典论文)。当加载程序为DLL分配内存时,它将在其中复制DLL,并读取DLL的IAT以获取其所需的所有符号(按名称),然后在Windows核心DLL的export部分中查找名称(例如, ,kernel32.dll),并用读取的地址填充它。在DLL可以继续执行之前,必须读取所有需要的文件并进行地址填充。 Linux也以相同的方式工作.....无论是用户空间还是内核。 ELF结构将其称为重定位表。 http://www.bravegnu.org/gnu-eprog/linker.html 希望对您有所帮助:-)(x86 arch的详细信息与此类似)。