自动生成的C代码如何进行反向工程?

7
有多难逆向工程一个自动生成的C代码?我正在开发一个Python项目,使用Cython编译代码以提高速度。
这确实有助于提高速度,但我担心在我的工作场所,有些人会试图"偷窥"代码并弄清楚它的作用。
Cython代码基本上是自动生成的C。它很难被逆向工程吗?
是否有任何建议可以使代码更安全且更难逆向工程?(我认为只要付出足够的努力,一切都可以逆向工程)。

1
编译C代码然后只分发编译后的版本如何? - Sven Marnach
13
我担心在我工作的地方,有些人会试图“窥视”我的代码并尝试理解它的作用。你和某个人一起工作,但他们无法看到你的源代码?这听起来非常不对劲... - Jerry Coffin
5
也许你应该写一个混淆器——这可能会成为你简历上的良好素材,而你显然需要更新你的简历;寻找新的/不同的工作应该是你的首要任务。 - Jerry Coffin
你正在问错问题。正确的问题是:你的“对手”有多大动力去反向工程你的代码? - thkala
4
@Jerry: +1 在同一家公司内进行间谍活动...我不知道该说什么了... - thkala
显示剩余9条评论
3个回答

7
好的,为了更直接地回答您的问题:大多数自动生成的C代码都相当丑陋,所以有人需要相当有动力才能进行逆向工程。同时,我不认为我曾经看过Cython生成的内容,所以我不确定它的样子。
此外,许多自动生成的代码以状态机表的形式完成,即使在最好的情况下,大多数程序员也会发现这很难理解。在许多情况下,倾向于使用通用框架,并使用数据表来“解释”框架中的数据。这并不一定难以理解,但与大多数典型代码足够不同,导致大多数人很快就会放弃(如果他们做了很多,他们通常会浪费很多时间查看框架而不是数据,而数据才是真正重要的)。
但是,我要重申的是,我相当确定我没有看过Cython生成的内容,因此我不能确切地说太多关于它的事情。
商业混淆器旨在使C源代码难以理解(或至少曾经存在)。我怀疑Perl的可用性已经占据了它们很大的市场份额,但如果您寻找,可能仍然可以找到并使用它们。
如果没有这样的混淆器,编写自己的混淆器并不是非常困难,但有效性的程度可能会随着您愿意投入的工作量而有所不同。仅将任何有意义的变量名称系统地重命名为像“_”和“__”这样的东西就可以做很多事情(例如,“profit = sales - costs;”比“_ = _I_ - _i_;”更有意义)。然而,根据所涉及的机器生成代码,这可能不会真正起到多大作用-混淆通用框架可能对理解代码所做的贡献不大-如果他们找出了您正在遵循的程序,他们可能能够简单地复制正确的框架代码,并将与您的程序特定部分相对应的部分移植到未混淆的框架中。

感谢杰瑞提供这么详细的答案。 - user3262424

2
您应该仔细查看Cython生成的代码。例如,为了帮助调试,它会将完整的Python源代码复制到生成的文件中,并在生成C代码之前标记每个源行。这使得查找您感兴趣的代码部分非常容易。
一个非常好的功能是,您可以使用“-a”(注释)选项编译您的代码,它会在C文件旁边输出一个包含注释Python代码的HTML文件。当您点击一行时,您将看到该行的C代码。额外的是,它会将大量进行Python处理的代码行标记为深黄色,因此您可以简单地找到潜在优化的位置。
现在Cython还有特殊的gdb支持,因此您可以进行Cython源代码级别的调试等操作。

2
啊,我想我错过了你谈论的编译模块的部分,而我只是在提到Cython生成的源代码。我同意Jerry的观点,如果您保持gdb支持禁用(默认情况下),并剥离调试符号,从编译模块中提取有用信息将相当棘手。这是因为C编译器会在各个地方进行许多辅助函数的内联和应用各种低级别的代码优化,从而使提取原始宏级代码模式更加困难。但是,您将看到命名的C-API调用到CPython,您还将看到来自您自己代码的函数名称。Cython并非专门设计用于代码混淆,恰恰相反。但可读的汇编从未是设计目标。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接