【问题标题】:Reverse Engineer Auto-Generated C?逆向工程师自动生成的 C?
【发布时间】:2011-07-27 07:46:56
【问题描述】:

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

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

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

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

【问题讨论】:

  • 编译C代码,只分发编译后的版本怎么样?
  • “我担心在我工作的地方,有些人会试图‘窥视’代码并弄清楚它的作用。”您与某人合作,但他们看不到您的源代码?这听起来有点非常不对...
  • Sven:是的,唯一“分发”的版本是编译版本。我只是担心并想知道弄清楚代码的作用有多难。杰瑞:在一些公司中,一些团体相互竞争,每个团体都希望将其专有信息保密。
  • @user54009:也许你应该写一个混淆器——这可能是你简历的好素材,你显然需要更新;找到一份新的/不同的工作显然应该是你的首要任务。
  • @Jerry: +1 同一家公司的间谍活动...我不知道该说什么...

标签: python c reverse-engineering cython


【解决方案1】:

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

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

不过,我要再说一遍,我很确定我还没有研究过 Cython 的产品,所以我不能确切地说出太多。

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

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

【讨论】:

  • 感谢 Jerry 的详细回答。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-14
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 2011-07-24
      • 2023-03-24
      • 1970-01-01
      • 2013-10-11
      相关资源
      最近更新 更多