【问题标题】:(Dependency Walker) missing explicit type on function(Dependency Walker)缺少函数的显式类型
【发布时间】:2013-10-05 02:32:34
【问题描述】:

对于菜鸟的错误,请提前道歉。这是我在这里的第一个问题。首先,一些背景:

我正在尝试为一个程序创建一个模块,该模块使用依赖遍历器在我没有 lib 或任何源代码的 .dll 中查找 C++ 函数。您也可以假设我无法从原始开发人员那里获得支持。基本上,我检查了另一个访问它的文件,以查看使其工作的最小功能。这是输出的未修饰名称的示例:

void foo::bar::baz(float)
float foo::bar::qux(void)
foo::bar::bar(void)
class foo::bar & foo::bar::operator=(class foo::bar const &)

上面的两个函数显然接受float 或void 并返回float 或void。我得到了一个类似的功能,使用类似的东西:

HINSTANCE THEDLL = LoadLibrary("C:\\dllFolder\\theDll.dll");
typedef float (*quxType)(void);
quxType qux = (quxType)GetProcAddress(THEDLL, "quxMangledName");

所以这些都不是问题。

现在,列表中的第三个看起来像另一个接受 void 的函数,但它没有明确的返回类型。这是否意味着我应该只使用隐式类型,它是无效的,还是不是真正的函数?如果不是,那是什么?

我不知道如何处理第四个。甚至可以在没有关联的 .h 文件的情况下处理吗?

我环顾四周,但找不到任何关于当函数看起来不像具有显式返回类型的普通函数时该怎么做的信息。尽管使用了与在类似 .dll 中工作的函数基本相同的代码,但当我在这里尝试使用函数 #2 时,我仍然遇到访问冲突崩溃(我真的只需要函数 #2)。所以我猜测 .dll 需要更多信息或者需要先初始化一些东西,这就是为什么我对列表中的其他内容感兴趣。

我意识到这是一个复杂的问题,所以可能不会有一个“正确答案”的解决方案来让它工作,但如果我犯了任何明显的错误,或者如果有任何关于如何攻击问题(甚至是依赖walker的替代品),请告诉我。

【问题讨论】:

    标签: c++ dependency-walker


    【解决方案1】:

    第三个是bar的默认构造函数。 第4个是bar的复制赋值运算符。

    我认为您需要先实例化该类,才能调用第二种方法。否则,将使用导致访问冲突的无效“this”调用该方法。

    问题是你如何实例化它? 如果在DLL中能找到返回bar的工厂函数,可以尝试使用。

    如果您没有看到工厂函数并且没有 lib 文件,您可以在此处参考有关如何从 DLL 创建 lib 的答案:How to make a .lib file when have a .dll file and a header file

    您还需要为类创建头文件,其中包含正确的成员顺序和类型。这样您就不必使用 LoadLibrary 和 GetProcAddress,只需照常使用该类即可。

    您仍然可以在没有 lib 和标头的情况下使用 LoadLibrary 和 GetProcAddress,此博客展示了如何手动分配内存、调用构造函数、获取对象并将该对象传递给调用方法:http://recxltd.blogspot.com/2012/02/working-with-c-dll-exports-without.html

    【讨论】:

    • 好的,谢谢。这听起来像问题。我猜 Dependency Walker 文档只是希望用户更熟悉通用 C++。我将深入研究函数列表,看看那里是否有工厂函数。 (另外,我也尝试过投票,但我的名声太低了。)
    • @RainbowDash,我添加了一个关于如何仅使用 LoadLibary 和 GetProcAddress 调用构造函数的链接。没关系投票:)
    • 这表示要避免像“谢谢”这样的 cmets,但第二个链接正是问题的解决方案。在花了这么多小时试图弄清楚如何让它工作之后,一次又一次的崩溃,想知道它是否可能......然后基本上只是从那个博客中复制这个例子并让它在第一次完美地工作...语言无法表达这种感觉。
    • @RainbowDash,很高兴它有帮助,我也一路学习。博客作者值得称赞。
    猜你喜欢
    • 2016-07-14
    • 2016-05-15
    • 1970-01-01
    • 2011-02-03
    • 2014-02-23
    • 2018-10-06
    • 2012-09-13
    • 2014-09-06
    • 1970-01-01
    相关资源
    最近更新 更多