【问题标题】:Calling an executable's function code调用可执行文件的功能代码
【发布时间】:2010-10-14 14:34:48
【问题描述】:

我有一个可执行文件中存在的特定函数的位置/偏移量。是否可以调用这样的函数(希望同时抑制 CRT 执行可执行文件的入口点)?

【问题讨论】:

    标签: c++ function reverse-engineering call


    【解决方案1】:

    实际上,您可以模拟 Windows 加载程序,假设您在 Windows 下运行,但基本在任何平台上都应该是相同的。参见例如http://msdn.microsoft.com/en-us/magazine/cc301805.aspx

    1. 将文件加载到内存中,
    2. 将加载的可执行文件调用的函数的所有相对地址替换为实际的函数地址。
    3. 将内存页面更改为“可执行”(这是困难且依赖于平台的部分)
    4. 初始化 CRT 以便例如初始化静态变量。
    5. 呼叫。

    但是,正如评论者正确指出的那样,这可能仅作为使用非常简单的函数的练习才实用。如果您不设法模拟完整的操作系统加载程序,就会有很多很多事情出错。

    PS:你也可以问谷歌:http://www.cultdeadcow.com/tools/pewrap.html

    PPS:您还可以在“安全”社区中找到有用的建议:https://www.blackhat.com/presentations/bh-usa-07/Harbour/Whitepaper/bh-usa-07-harbour-WP.pdf

    【讨论】:

    • 很好的描述,我能看到的唯一潜在问题是如果 CRT 没有初始化,调用可能会以有趣的方式失败。
    • @Abyx 我已经在这方面扩展了我的答案。
    【解决方案2】:

    是的,你可以调用它,如果你将初始化这个函数使用的所有全局变量。可能包括 CRT 全局变量。作为替代方式,您可以挂钩和替换被调用者使用的所有 CRT 函数。查看该函数的反汇编以获得正确的解决方案。

    【讨论】:

      【解决方案3】:

      1) 查看LoadLibraryEx() API。它有一些标志可以完成 Sebastian 描述的所有脏活。

      2) 编辑可执行文件。几个修改的字节将完成这项工作。以下是有关文件格式的一些文档:http://docsrv.sco.com:507/en/topics/COFF.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多