基本概念

  函数转发器(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。

DLL系列6.函数转发器相关推荐

  1. ASP系列VB函数大全

    ASP系列VB函数大全 ASP函数大全 ASP函数与VBSCRIPT类似,以下举一些常用的函数 Array() 函数返回一个数组 表达式 Array(list) 允许数据类型: 字符,数字均可 实例: ...

  2. 笨鸟先飞学编程系列之三 函数(转自聚星亭)

    笨鸟先飞学编程系列之三 函数 提及"函数"这个词儿,很多人都像我一样,感觉很恐慌,因为它总让我想起代数里讲的方方面面.这些对于像我这样的笨鸟来说,真的太深奥,总是不敢去考虑它,去琢 ...

  3. dumpbin发现没有入口函数_详解VS2019 dumpbin查看DLL的导出函数

    之前有人问过ViewDLL这些软件在哪下载.实际上使用VS就可以查看DLL的导出接口. 1.先打开VS内部的Power Shell 2.打开以后应该如下图所示,首先输入dumpbin查看下用法: 3. ...

  4. JavaScript进阶系列01,函数的声明,函数参数,函数闭包

    本篇主要体验JavaScript函数的声明.函数参数以及函数闭包. □ 函数的声明 ※ 声明全局函数 通常这样声明函数: function doSth() { alert("可以在任何时候调 ...

  5. C#调用dll中的函数

    C#调用dll中的函数 文章分类:操作系统 文章来源:http://blog.csdn.net/strmagic/archive/2007/11/02/1863462.aspx 大家在实际工作学习C# ...

  6. Delphi 如何解决在DLL的入口函数中创建或结束线程时卡死

    先看一下使用Delphi开发DLL时如何使用MAIN函数, 通常情况下并不会使用到DLL的MAIN函数,因为delphi的框架已经把Main函数隐藏起来 而工程函数的 begin  end 默认就是M ...

  7. csharp通过dll调用opencv函数,图片作为参数

    [blog 项目实战派]csharp通过dll调用opencv函数,图片作为参数          ​一直想做着方面的研究,但是因为这个方面的知识过于小众,也是由于自己找资料的能力比较弱,知道今天才找 ...

  8. 天马行空W:在C++中调用DLL中的函数

    1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...

  9. DLL中导出函数的声明有两种方式

    本文引用自:VC编程时DLL中导出函数的声明有两种方式 一种方式是:在函数声明中加上__declspec(dllexport): 另外一种方式是:采用模块定义(.def)文件声明,(.def)文件为链 ...

  10. 通过GetProcAddress函数动态调用dll中地函数,是否必须通过extern C声明导出函数?(转)...

    通过GetProcAddress函数动态调用dll中的函数,是否必须通过extern "C"声明导出函数? [已结贴,结贴人:darongtou] 如题,网上搜了N多资料,一直找不 ...

最新文章

  1. python和c语言的对比_类C语言与Python负数除法求值间的差异
  2. 【转】排除被冲销的物料凭证
  3. java面向字符的输入流_详细解读Java编程中面向字符的输入流
  4. java移动接口发短信_Java面试零碎知识点
  5. 难以理解的软件工程师:几千行代码能搞定为什么要写几万行?
  6. 惠普g260鼠标宏软件_电竞外设再添新成员,微星DS102电竞鼠标正式发布
  7. 数据中心的容器操作系统--k8s理解
  8. 米斯特白帽培训讲义 漏洞篇 SQL 注入
  9. log4j.properties的配置与详细说明
  10. 计算机网络管理员高级操作技能考核试卷,高级计算机维修工操作技能考核试卷...
  11. 百度地图之添加控件——比例尺、缩略图、平移缩放
  12. Android在程序中浏览网页
  13. web课程设计网页规划与设计 :DW旅游主题网页设计——凤阳智慧旅游官方-地方旅游网站模板html源码HTML+CSS+JavaScript
  14. 如何利用SPSS软件进行数据的描述性分析
  15. jQuery获取兄弟元素
  16. java开发社交网站_仿知乎问答社交平台网站
  17. 【好书推荐】物理、数学和发明的经典科普书籍
  18. word一键生成ppt 分页_PPT插入word自动分页
  19. i12蓝牙耳机怎么设置成中文_windows10的蓝牙怎么打开?如何修复Windows 10中的蓝牙问题...
  20. 开发高并发系统的三把利器

热门文章

  1. java 生成 流程图_几行代码生成流程图
  2. 一款开源的中国象棋人工智能程序
  3. 2020华为软挑总结
  4. CMD常用命令大全(值得收藏)
  5. css html设计网页完整代码,htmlcss完整的网页代码
  6. HIVE SQL 时间函数
  7. c# 中崎_C# 打开钱箱支持北洋、佳博、爱普生
  8. PHP佳音高清图片上传下载源码
  9. TCP/IP协议栈之LwIP(十一)--- LwIP协议栈移植
  10. java 类似 ror的框架_php的ror类似框架, 有精美的视频展示