【问题标题】:Constant folding in the preprocessing stage预处理阶段的恒定折叠
【发布时间】:2013-02-28 15:26:07
【问题描述】:

我有一段 C 代码需要去混淆。它包含一堆棘手的宏。我通过 C 预处理器和缩进运行代码,现在看起来类似于:

switch (9263 + 1505) {
case 1505 + 41131 + 6729 + 2347:
            ...
case 1505 + 41131 + 6729 + 2347 + 1:
            ...
case 1505 + 41131 + 6729 + 2347 + 2:
            ...

为了简化进一步的分析,我正在寻找一些可以折叠代码中所有常量的工具。我知道 C 预处理器无法做到这一点,并且将在编译阶段执行常量折叠优化。但是源代码呢?

Shell 脚本也很受欢迎,因为我怀疑这可能是唯一的方法。

【问题讨论】:

    标签: c gcc scripting deobfuscation constantfolding


    【解决方案1】:

    使用clang编译,使用c后端生成c代码。

    这样的事情应该可以工作:

    clang -emit-llvm source.cpp -o - | llc -march=c
    

    【讨论】:

    • 如我所见,不再支持 C 作为 LLVM 的后端。我尝试改用 C++,但结果与最初的源代码大不相同。
    • 你能从 git 中提取一个较旧的 clang 并自己编译吗? C 后端似乎是最好的方法。尝试 2009 年 12 月左右的版本。否则,您将不得不自己破解 switch case 语句(第 669 行):clang.llvm.org/doxygen/Stmt_8h_source.html
    • 我做到了。好吧,最终的代码远非可读,但它不再那么长和复杂了。因此,在 gdb 的帮助下,我设法对其进行了去混淆处理。谢谢。
    • @PavelZaichenkov 你能把你的发现贴在某个地方吗?
    • @JanusTroelsen,如果您对程序本身感兴趣,here 它是。该程序对数字列表进行排序。您的目标是了解它使用哪种排序算法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 2012-03-05
    • 2019-08-05
    • 2019-02-22
    • 2019-06-18
    相关资源
    最近更新 更多