反向工程自动生成的C代码?

7 投票
3 回答
3377 浏览
提问于 2025-04-16 14:51

反向工程一个自动生成的C代码有多简单呢?我正在做一个Python项目,作为工作的一部分,我使用Cython来编译代码,以提高速度。

这样确实能提升速度,但我担心我工作地方的一些人会试图“偷看”代码,弄清楚它的功能。

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

有没有什么建议可以让代码更安全,反向工程变得更困难呢?(我想,只要付出足够的努力,任何东西都能被反向工程)。

3 个回答

2

哦,我想我之前没注意到你说的是编译过的模块,而我只提到了Cython生成的源代码。我同意Jerry的看法,从编译后的模块中提取有用的信息会比较棘手,特别是当你保持gdb支持关闭(默认是关闭的)并且去掉调试符号的时候。这是因为C编译器会在很多地方进行辅助函数的内联处理,并应用各种底层的代码优化,这样就会让我们更难提取出原始的宏观代码模式。不过,你会看到一些命名的C-API调用到CPython,还有你自己代码中的函数名。Cython并不是专门为了让代码难以理解而设计的,恰恰相反。但可读的汇编代码从来就不是它的设计目标。

2

你真的应该看看Cython生成的代码。为了帮助调试,比如说,它会把完整的Python源代码复制到生成的文件里,并在生成C代码之前标记每一行源代码。这样一来,你就很容易找到你感兴趣的代码部分。

一个很不错的功能是,你可以用“-a”(注释)这个选项来编译你的代码,这样它会在C文件旁边生成一个HTML文件,里面包含了带注释的Python代码。当你点击某一行时,就能看到那一行对应的C代码。作为额外的好处,它会用深黄色标记出那些进行大量Python处理的行,这样你就能简单地知道在哪里可以进行优化。

现在Cython还特别支持gdb,这样你就可以进行Cython源代码级的调试等操作。

7

好的,来直接回答你的问题:大多数自动生成的C代码看起来都比较丑陋,所以要有人有足够的动力去逆向工程它。同时,我也不太确定自己有没有看过Cython生成的代码,所以对它的样子不太了解。

另外,很多自动生成的代码通常是以状态机表的形式出现,这种代码即使对大多数程序员来说也很难理解。一般来说,这种代码会有一个通用的框架,框架会在运行时“解释”一些数据表。这种方式并不是完全不可理解,但它和大多数常见代码有很大不同,很多人可能会很快放弃去理解(而且如果他们花太多时间在框架上,反而会浪费时间,因为真正重要的是数据本身)。

不过我再强调一下,我很确定自己没有看过Cython生成的代码,所以对它的了解有限。

以前有一些商业的混淆工具,目的是让C源代码难以理解。我猜现在有了Perl,这些工具的市场份额可能减少了,但如果你找找,可能还是能找到并使用一个。

如果没有这些工具,自己写一个混淆器其实也不是特别难,但效果的好坏可能和你愿意投入的精力有关。比如,把有意义的变量名系统地改成像___这样的名字,就能起到一定的混淆效果(例如,profit = sales - costs;_ = _I_ - _i_;更容易理解)。不过,具体效果还得看你处理的机器生成代码是什么,有时候混淆一个通用框架并不会对理解代码的功能有太大帮助。如果别人搞清楚了你遵循的流程,他们可能会简单地复制正确的框架代码,然后把你程序特有的部分放到未混淆的框架里。

撰写回答