用Cython生成的可执行文件真的没有源代码吗?

用Cython生成的可执行文件真的没有源代码吗?,第1张

用Cython生成的可执行文件真的没有源代码吗?

该代码位于exe旁边的原始pyx文件中。删除/不与您的exe一起分发此pyx文件。


查看生成的C代码时,您将看到可执行文件显示错误消息的原因:

对于出现的错误,Cython将发出类似于以下内容的代码:

__PYX_ERR(0, 11, __pyx_L3_error)

其中

__PYX_ERR
在宏定义为:

#define __PYX_ERR(f_index, lineno, Ln_error) {   __pyx_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; }

并且该变量

__pyx_f
定义为

static const char *__pyx_f[] = {  "test.pyx",  "stringsource",};

基本上

__pyx_f[0]
告诉可以在哪里找到原始代码。现在,当引发异常时,(嵌入式)Python解释器将查找原始的pyx文件并找到相应的代码(可以
__Pyx_AddTraceback
在出现错误时在其中查找该代码)。

一旦这个pyx文件不存在,原始的源代码将不再为Python解释器/其他任何人所了解。但是,错误跟踪将仍然显示函数的名称和行号,但不再显示任何代码段。

生成的可执行文件(或扩展名,如果有人创建的话,则扩展名)不包含任何字节码(如pyc文件中的内容),并且无法使用以下工具反编译

uncompyle
:将py文件翻译成Python *** 作码后生成字节码,然后在一个巨大的循环
ceval.c
。但是对于内置/
cython模块,则不需要字节码,因为生成的代码直接使用Python的C-API,从而消除了对 *** 作码进行评估的需要-
这些模块跳过了解释,这是它们变得更快的原因。因此,可执行文件中将没有字节码。

但是,有一个重要的注意事项:应该检查链接器是否不包含调试信息(因此,可以在其中找到pyx文件内容的C代码作为注释)。带

/Z7
选项的MSVC就是这样的示例。


但是,可以将生成的可执行文件反汇编到汇编器中,然后可以对生成的C代码进行逆向工程-
因此,虽然cythonizing可以使代码难以理解,但它不是隐藏密钥或安全算法的正确工具。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5645839.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存