【问题标题】:Deobfuscating C++ source code反混淆 C++ 源代码
【发布时间】:2013-03-24 13:57:07
【问题描述】:

在寻找 c++ 解析器时,我最近偶然发现了下面的项目。其中有一个解析器似乎非常适合我的需求,但是我相信作者故意混淆了一些核心代码,这使得检查代码有点困难。

https://github.com/ArashPartow/math-parser-benchmark-project/blob/master/fparser/fpoptimizer.cc

在文件和作者的网站上有一个关于有一个简单的去混淆版本的描述,但是指示的站点似乎只有一个dead-link,并且尝试联系作者没有结果。

我想知道其他 SOers 是否会知道一种快速简便的方法来反转上述文件中的混淆。

现在我不确定,因为我不是 C++ 专家,但可能有正当的理由让代码变成这样,大概是因为文件名表明它可能是为了性能原因。

【问题讨论】:

  • "注意:此文件包含生成的代码(来自优化器源),不能手动修改。如果要修改优化器,请下载库的开发版本。"
  • @Mysticial:however the indicated site seems to only have a dead-link and attempts to contact the author have been fruitless
  • 同时,我不明白“优化”C++ 如何提高性能。怎么回事?
  • @Mystical:问题说明了情况。
  • @Gerdiner 我想说的基本上是,如果找不到原件,就放弃。我不太相信即使在预处理器替换之后它仍然是可读的。

标签: c++ parsing math optimization obfuscation


【解决方案1】:

在这种特定情况下,您可以尝试这个指向project page, with the latest devel files 的链接——我刚刚发现是版本错误——链接显示为 4.5,而当前版本为 4.5.2。 他们似乎没有保留旧版本,因此请在那里获取最新版本

【讨论】:

    【解决方案2】:

    大多数编译器都可以选择仅在代码上运行预处理器并生成预处理器输出。这将消除使用#defines 完成的任何混淆。

    例如在 MSVC 中,您可以运行 cl /P fpoptimizer.cc。这将创建一个名为 fpoptimizer.i 的文件,其中包含预处理文件。

    您可以在执行此操作之前删除程序中的#includes - 这样只有程序中的#defines 会被预处理,而不是其他内容。

    gcc 提供了-E 选项来做类似的事情。

    【讨论】:

    • 我试了一下,它生成了一个 1.8MB 的文件,其中包括各种其他内容。有没有办法只包含文件本身中的内容?顺便说一句,它会产生这样的东西,有没有办法通过该命令选项使其格式更清晰? TailCall_cLessOrEq;Ljh:this-> ByteCode.pop_back(); ByteCodePtr-=1; opcode= cLess;;转到 TailCall_cLess;Lji:this-> ByteCode.pop_back(); ByteCodePtr-=1; opcode= cGreaterOrEq;;转到 TailCall_cGreaterOrEq;Ljj:this-> ByteCode.pop_back(); ByteCodePtr-=1; opcode= cGreater;;goto TailCall_cGreater;Ljk:this-> ByteCode.pop_back();
    • @Gerdiner - 正如我所说,在执行此操作之前从文件中删除#includes - 这将确保仅对文件中的#defines 进行预处理。
    猜你喜欢
    • 2013-04-04
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    相关资源
    最近更新 更多