dll导出函数参数可以是引用吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dll导出函数参数可以是引用吗相关的知识,希望对你有一定的参考价值。

参考技术A 1、注释由“;” 指定,注释不能与语句在同一行。
2、“LIBRARY”语句说明.def文件相应的DLL;
3、“EXPORTS”说明要导出函数的名称。“@ 1”,表示要导出函数的序号为1(在函数调用时,可以用到这个序号)
因此,Simple.def文件的解释是:生成Simple.DLL的动态链接库,其导出ShowMessage函数,该函数的序号为1。

是否有任何本机 DLL 导出函数查看器? [复制]

【中文标题】是否有任何本机 DLL 导出函数查看器? [复制]【英文标题】:Is there any native DLL export functions viewer? [duplicate] 【发布时间】:2010-12-05 15:20:57 【问题描述】:

是否有任何免费的本地 Windows DLL 导出函数查看器,它显示函数名称及其参数列表?

【问题讨论】:

【参考方案1】:

您可以使用Dependency Walker 查看函数名称。 只有经过修饰才能看到函数的参数。 阅读常见问题解答中的以下内容:

如何查看函数的参数和返回类型? 对于大多数功能,此信息根本不存在于模块中。 Windows 的模块文件格式仅提供单个文本字符串来标识每个函数。没有结构化的方式来列出参数的数量、参数类型或返回类型。但是,有些语言会做一些称为函数“装饰”或“修饰”的事情,这是将信息编码到文本字符串中的过程。例如,像 int Foo(int, int) 这样用简单修饰编码的函数可能会导出为 _Foo@8。 8 是指参数使用的字节数。如果使用C++修饰,函数会导出为?Foo@@YGHHH@Z,可以直接解码回函数的原始原型:int Foo(int, int)。 Dependency Walker 通过使用 Undecorate C++ Functions 命令支持 C++ 取消修饰。

【讨论】:

谢谢,但是当我尝试打开任何 DLL 时,它会在日志窗口中显示:错误:由于隐式依赖模块中缺少导出函数,至少一个模块具有未解析的导入。错误:发现具有不同 CPU 类型的模块。警告:至少没有找到一个延迟加载依赖模块。警告:由于延迟加载依赖模块中缺少导出功能,至少有一个模块存在未解析的导入。 我使用的是 Windows 7 x64 Final。 @Alon: 好吧,你的应用程序很混乱 :) 第一个错误表明你的一些 dll 是为 32 位系统编译的,一些是为 64 位系统编译的。您只能在同一进程中加载​​具有相同 CPU 架构的 dll。只要应用程序正在处理其他两个错误,您就可以忍受它们。 顺便说一句,这些错误不应该打扰您查看相关 DLL 的导出函数。您只需单击此 DLL,它的导出函数就会显示在右侧窗口中。 @Alon:对于我看过的每个 DLL,我也会遇到这些错误。忽略它们。【参考方案2】:

如果你没有源代码和API文档,只有机器码,你需要使用IDA Pro之类的反汇编dll库,另一个选择是使用PE Explorer的试用版。

PE Explorer 提供了一个反汇编器。只有一种方法可以计算出参数:运行反汇编程序并读取反汇编输出。不幸的是,这个界面逆向工程任务不能自动化。

PE Explorer 捆绑了 39 个不同库的描述,包括核心 Windows® 操作系统库(例如 KERNEL32、GDI32、USER32、SHELL32、WSOCK32)、关键图形库(DDRAW、OPENGL32)等等。

(来源:heaventools.com)

【讨论】:

这与 Nirsoft DLL Export Viewer 有何不同?【参考方案3】:

dumpbin 来自 Visual Studio 命令提示符:

dumpbin /exports csp.dll

输出示例:

Microsoft (R) COFF/PE Dumper Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file csp.dll

File Type: DLL

  Section contains the following exports for CSP.dll

    00000000 characteristics
    3B1D0B77 time date stamp Tue Jun 05 12:40:23 2001
        0.00 version
           1 ordinal base
          25 number of functions
          25 number of names

    ordinal hint RVA      name

          1    0 00001470 CPAcquireContext
          2    1 000014B0 CPCreateHash
          3    2 00001520 CPDecrypt
          4    3 000014B0 CPDeriveKey
          5    4 00001590 CPDestroyHash
          6    5 00001590 CPDestroyKey
          7    6 00001560 CPEncrypt
          8    7 00001520 CPExportKey
          9    8 00001490 CPGenKey
         10    9 000015B0 CPGenRandom
         11    A 000014D0 CPGetHashParam
         12    B 000014D0 CPGetKeyParam
         13    C 00001500 CPGetProvParam
         14    D 000015C0 CPGetUserKey
         15    E 00001580 CPHashData
         16    F 000014F0 CPHashSessionKey
         17   10 00001540 CPImportKey
         18   11 00001590 CPReleaseContext
         19   12 00001580 CPSetHashParam
         20   13 00001580 CPSetKeyParam
         21   14 000014F0 CPSetProvParam
         22   15 00001520 CPSignHash
         23   16 000015A0 CPVerifySignature
         24   17 00001060 DllRegisterServer
         25   18 00001000 DllUnregisterServer

  Summary

        1000 .data
        1000 .rdata
        1000 .reloc
        1000 .rsrc
        1000 .text

【讨论】:

注意不要意外执行'dumpbin /export'(最后没有's'),这是一个完全不同的命令。 @NikitaG。这个命令不存在了【参考方案4】:

NirSoft 的DLL Export Viewer 可用于在 DLL 中显示导出的函数。

此实用程序显示所有导出函数的列表及其 指定 DLL 文件的虚拟内存地址。您可以轻松 复制所需函数的内存地址,将其粘贴到您的 调试器,并为此内存地址设置断点。当这 函数被调用,调试器将在此开始处停止 功能。

【讨论】:

Nirsoft 的应用程序没有显示无名函数 :-( 浏览 DLL 按钮对我来说已完成损坏,也不显示 dll 中的任何功能。我使用的是 Windows 10(64 位) @TCS “未命名函数现在以 Ordinalxxx 格式显示。(当“显示未命名函数”选项打开时)”自 1.45 版起

以上是关于dll导出函数参数可以是引用吗的主要内容,如果未能解决你的问题,请参考以下文章

怎么调用别人的dll文件

我们可以从 dll 中导入和导出函数吗

为啥有的dll里没有导出函数?

MFC Dll 导出函数

寻找如何在 VS 9 中调试到导出的 dll 函数。可能吗?

使用 ctypes 列出从 dll 导出的函数