7

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

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

Cython 代码基本上是自动生成的 C。逆向工程很难吗?

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

4

3 回答 3

6

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

此外,许多自动生成的代码是以状态机表之类的形式完成的,大多数程序员发现即使充其量也很难遵循。趋势(在许多情况下)是拥有一个通用框架,其中包含框架或多或少在运行时“解释”的数据表。这不一定是不可能遵循的,但它与大多数典型的代码有足够的不同,大多数人会很快放弃它(如果他们做得很多,他们通常会浪费大量时间查看框架而不是数据,这在这种情况下才是真正重要的)。

但是,我要重复一遍,我很确定我没有看过 Cython 产生的东西,所以我不能肯定地说太多。

有(或至少曾经有)商业混淆器旨在使 C 源代码难以理解。我怀疑 Perl 的可用性已经从他们那里夺走了很多市场份额,但如果你仔细观察,你可能仍然能够找到并使用它。

如果没有这一点,编写自己的混淆器并不难,但有效性的程度可能会随着你愿意投入的努力而有所不同。只需系统地将任何有意义的变量名称重命名为_and__就可以做很多事情(例如,profit = sales - costs;比 更有意义_ = _I_ - _i_;)。然而,根据所讨论的机器生成代码,这可能不会真正完成太多——混淆一个通用框架可能对理解你的代码的作用没有太大影响——如果他们弄清楚你正在遵循的过程,他们可能能够简单地复制正确的框架代码并将特定于您的程序的部分移植到未混淆的框架中。

于 2011-03-31T23:51:16.037 回答
2

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

一个非常好的功能是您可以使用“-a”(注释)选项编译您的代码,它会在包含注释的 Python 代码的 C 文件旁边生成一个 HTML 文件。单击一行时,您将看到该行的 C 代码。作为奖励,它用深黄色标记了执行大量 Python 处理的行,以便您获得一个简单的指示符,可以在哪里寻找潜在的优化。

Cython 现在也有特殊的 gdb 支持,因此您可以进行 Cython 源代码级调试等。

于 2011-04-16T14:38:38.450 回答
2

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

于 2011-04-16T14:55:32.590 回答