【问题标题】:Possible to decompile DLL written in C?可以反编译用C编写的DLL吗?
【发布时间】:2012-01-25 22:41:58
【问题描述】:

我想反编译一个我认为是用 C 语言编写的 DLL。我该怎么做?

【问题讨论】:

    标签: c decompiling


    【解决方案1】:

    简答:你不能。

    长答案: C/C++ 的编译过程非常有损。编译器对您的代码进行了大量的高级和低级优化,并且生成的汇编代码通常与您的原始代码完全不同。此外,市场上有不同的编译器(每个都有几个不同的活动版本),每个编译器生成的输出都略有不同。在不知道使用了哪个编译器的情况下,反编译任务变得更加无望。充其量,我听说过一些工具可以为您提供一些部分反编译,并在各处识别出一些 C 代码,但您仍然需要通读大量汇编代码才能理解它。

    顺便说一句,这也是软件复制保护难以破解并需要特殊组装技能的原因之一。

    【讨论】:

    • 注意:.NET 和 Java 是完全不同的野兽,反编译的可能性要大得多(尽管市场上存在可以迷惑反编译器的代码混淆器)。
    • 如果我知道 C DLL 正在访问某个 .jar 文件,那么这些文件肯定需要硬编码到 DLL 中并在反编译中出现?
    • 很难说。可以将任意“资源”添加到 .DLL/.EXE 文件中。如果它以这种方式存储,那么您不需要反编译 - 有资源查看器工具可以为您提取它。然后你可以反编译Java的.jar文件。但是还有其他将文件嵌入到 .dll 文件中的自制方法,如果它使用其中一种方法,那么你就不走运了。也许您可以在程序运行时抓取这些文件并将它们提取到临时文件夹或其他东西中?
    【解决方案2】:

    这是可能的,但非常困难,并且即使您非常精通 C、汇编和该代码应该工作的操作系统的复杂性,也将花费大量时间。

    问题是,优化使编译后的代码很难被人类识别/理解。

    此外,如果反汇编器丢失信息(例如,相同的指令可以以不同的方式编码,并且如果其余代码依赖于许多反汇编器(或其用户)未能考虑到的特定编码),则会出现歧义,由此产生的反汇编变得不完整或不正确)。

    自修改代码也使事情复杂化。

    this question 中查看有关该主题和可用工具的更多信息。

    【讨论】:

    • 自修改代码在 C64 上很流行。当代码修改自身时,现代处理器将出现缓存和多线程问题。我不确定 C/C++ 编译器是否可以生成自修改代码(但你仍然会得到 +1)
    【解决方案3】:

    你可以,但只能在一定程度上:

    1. 优化可能会更改代码
    2. 符号可能已被剥离(DLL 允许通过索引而不是符号来引用驻留在内部的函数)
    3. 某些指令组合可能无法转换为 C
    4. 还有其他一些我可能会忘记的事情......

    【讨论】:

    • 5.编译器有时可能会内联函数。
    猜你喜欢
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多