DLL系列6.函数转发器

基本概念

  函数转发器(function forwarder)是DLL输出段中的一个条目,用来将一个函数调用转发到另一个DLL中的另一个函数。例如,如果用Visual C++的DumpBin工具来查看Windows的Kernel32.dll,那么我们会看到类似下面的输出:

C:\Windows\System32>DumpBin -Exports Kernel32.dll (some output omitted)
75 49 CloseThreadpoolIo (forwarded to NTDLL.TpReleaseIoCompletion)
76 4A CloseThreadpoolTimer (forwarded to NTDLL.TpReleaseTimer)
77 4B CloseThreadpoolWait (forwarded to NTDLL.TpReleaseWait)
78 4C CloseThreadpoolWork (forwarded to NTDLL.TpReleaseWork)
(remainder of output omitted)

  这个输出显示了四个被转发的函数。如果应用程序调用了CloseThreadpoolIo 、CloseThreadpoolTimer 、CloseThreadpoolWait 或CloseThreadpoolWork ,那么我们的可执行文件会被动态地链接到Kernel32.dll。当可执行文件运行的时候,加载程序会载入Kernel32.dll并发现被转发的函数实际上是在NTDLL.dll中,然后它会将NTDLL.dll模块也一并载入。当可执行文件调用CloseThreadpoolIo 的时候,它实际上调用的NTDLL,dll中TpReleaseIoCompletion函数。CloseThreadpoolIo函数在系统中根本不存在的。
  如果我们调用CloseThreadpoolIo,那么GetProcAddress会先在Kernel32的导出段中查找,并发现CloseThreadpoolIo 是一个转发函数,于是它递归调用GetProcAddress,在NTDLL.dll的导出段中查找TpReleaseIoCompletion。

示例演示

   我们也可以在自己的DLL模块使用函数转发器。最简单的方法是使用pragma指示符,如下面所示。

// Function forwarders to functions in DllWork
#pragma comment(linker, "/export:SomeFunc=DllWork.SomeOtherFunc")

  这个pragma告诉链接器,正在编译的DLL应该输出一个名为SomeFunc的函数,但实际实现SomeFunc的是另一个名为SomeOtherFunc的函数,该函数被包含在另一个名为DllWork.dll的模块中。我们必须为每一个想要转发的函数单独创建一行program。

猜你喜欢

转载自blog.csdn.net/webzhuce/article/details/105870866