逆向工程师自动生成C?

时间:2011-03-31 23:18:23

标签: python c reverse-engineering cython

对自动生成的C代码进行逆向工程有多容易?我正在研究一个Python项目,作为我工作的一部分,我正在使用Cython编译代码以加速。

这在速度方面确实有帮助,但是,我担心在我工作的地方,有些人会试图“窥视”代码并弄清楚它的作用。

Cython代码基本上是一个自动生成的C.反向工程很难吗?

是否有任何建议可以使代码更安全,反向工程更难? (我认为只要付出足够的努力,一切都可以逆向设计)。

3 个答案:

答案 0 :(得分:6)

好的 - 尝试更直接地回答您的问题:大多数自动生成的C代码相当丑陋,所以有人需要相当积极地对其进行逆向工程。与此同时,我不相信我从未看过Cython产生的东西,所以我不确定它的外观。

此外,许多自动生成的代码以状态机表等形式完成,大多数程序员发现即使最好也很难遵循。趋势(在许多情况下)是具有通用框架,框架或多或少地在运行时“解释”框架数据。这不一定不可能遵循,但它与大多数人会相当快地放弃它的大多数典型代码有很大不同(如果他们做得太多,他们通常会浪费很多时间来查看框架而不是数据,这在这样的情况下真正重要)。

然而,我会再说一遍,我很确定我没有看过Cython会产生什么,所以我不能用任何真正的确定性来说明这一点。

有(或至少曾经是)商业混淆器,旨在使C源代码难以理解。我怀疑Perl的可用性已经占据了他们的大部分市场份额,但如果你看起来你仍然可以找到并使用它。

如果没有这个,写一个自己的混淆器并不是非常困难,但有效程度可能会随着你愿意付出的努力程度而变化。系统地将任何有意义的变量名称重命名为___之类的内容可以做很多事情(例如,profit = sales - costs;_ = _I_ - _i_;更有意义。然而,根据机器生成的代码,这可能并没有真正实现太多 - 模糊通用框架可能对理解代码的作用没有多大区别 - 如果他们弄清楚你正在遵循的程序,他们可能会能够简单地复制正确的框架代码并将特定于程序的部分移植到未混淆的框架中。

答案 1 :(得分:2)

你应该看看Cython产生的代码。例如,为了帮助调试,它将完整的Python源代码复制到生成的文件中,在为其生成C代码之前标记每个源代码行。这样可以很容易地找到您感兴趣的代码部分。

一个非常好的功能是您可以使用“-a”(annotate)选项编译代码,并且它将在包含带注释的Python代码的C文件旁边吐出一个HTML文件。单击某一行时,您将看到该行的C代码。作为奖励,它标记了以深黄色进行大量Python处理的线条,因此您可以获得一个简单的指示器,在哪里寻找潜在的优化。

现在Cython中还有特殊的gdb支持,所以你可以进行Cython源代码级调试等。

答案 2 :(得分:2)

啊,我想我错过了你所说的编译的模块,而我只是指Cython生成的源代码。我同意Jerry的观点,只要你保持gdb支持被禁用(默认)并去除调试符号,从编译模块中提取有用的东西是相当棘手的。这是因为C编译器将在整个地方进行大量的辅助函数内联,并应用各种低级代码优化,从而使得提取原始宏级代码模式变得更加困难。但是,您将看到对CPython的命名C-API调用,您还将看到自己代码中的函数名称。 Cython不是专为代码混淆而设计的,恰恰相反。但可读的装配肯定不是设计目标。