Python 代码不能加密?

2017-03-19 14:16:06 +08:00
 jh623
廖雪峰说 Python 代码不能加密,转换成 exe 加壳不算加密么?
如果不算,那怎么把转换的 exe 里的源码提取出来呢?
10922 次点击
所在节点    Python
23 条回复
wevsty
2017-03-19 14:22:57 +08:00
Python 不能直接编译成二进制文件,所谓的转换成 exe ,其实就是跟压缩软件打包一样,把代码打包在一起罢了。
loading
2017-03-19 14:24:04 +08:00
你用记事本打开看看,然后看一下其他语言编译的。
ty89
2017-03-19 14:42:24 +08:00
自己翻一下书、 google 一下就能搞明白的事情
a87150
2017-03-19 15:00:43 +08:00
pyc
liantian
2017-03-19 15:12:14 +08:00
可以用 pyminifier 混淆代码
https://pypi.python.org/pypi/pyminifier
clino
2017-03-19 15:20:08 +08:00
我们一个工具因为怕被解密改用 go 写了,感觉不错
jh623
2017-03-19 15:20:33 +08:00
@wevsty 那怎么解包呢?
jh623
2017-03-19 15:21:24 +08:00
@a87150 pyc 就看到几行无关紧要的代码
jh623
2017-03-19 15:23:21 +08:00
@loading 我小白不懂啊,打开 exe 是十六进制的
wevsty
2017-03-19 15:36:09 +08:00
@jh623 那取决于你的打包方式
xialdj
2017-03-19 16:06:28 +08:00
@jh623 exe 文件是可以解压的 本质上也是压缩包
phrack
2017-03-19 16:24:22 +08:00
可以。

我专门研究过这个问题, python 代码加密甚至可以做到比用汇编手写混淆,用 c 手写混淆更加难以解密。具体做法略复杂仅简单说个过程。

第一级别是源码级别的混淆,用 ast 和 astor ,再自己手写一个混淆器,三五百行的脚本直接混淆到几万行,整个文件面目全非,基本可以做到就算直接放脚本给你拿去逆,除非你再写出来一个逆向前面的混淆算法的脚本来逆(在熟悉 python 的情况下需要花几天,且不说需要了解程序构造原理),手动去调试脚本几乎达到不可行的地步(话费时间再乘以 2 )

第二级别是个性化定制 pyinstaller , pyinstaller 会打包所有需要的库,将脚本也包含进打包的 exe ,但是, pyinstaller 有一个 stub ,相当于一个启动器,需要由这个启动器来解密脚本和导入模块,外面有直接导出脚本的工具,但是那是针对 pyinstaller 自带的启动器做的,完全可以自己修改这个启动器再编译,这样逆向者就必须手动调试找到 main 模块。配合第一级别加密,呵呵,中国就算是最顶尖的逆向专家也要花个一两周,来破解我们的程序逻辑了,就我所知,实际上国内对于 py 程序的逆向研究不多。

第三级别是再上一层,将 py 翻译为 c 再直接编译 c 为 dll ,配合第一阶段先混淆再转 c 再编译,在第一步混淆之后,会产生非常多垃圾(中间层)函数,这些中间层函数在 c 这里会和 py 解释器互相调用,脚本和二进制之间交叉运行,本身混淆之后的源码就极难复原,再混合这一层,想逆向,难。

第四级别是利用 py 的动态特性,绝大多数逆向者都是 c ,汇编出身,对于程序的第一直觉就是,程序就是一条一条的指令,后一条指令必然在这一条指令后面,然而, py 的动态特性可以让代码逻辑根本就不在程序里面,这一点不想多讲,涉及到我一个项目里的深度加密。

第五级别,数学做墙。了解过比特币原理的知道要想用挖比特币就得提供大量算力去帮网络计算 hash ,这个成为 pow ,那么既然已经采用 py 了估计已经不考虑太多 cpu 利用率了,那就可以采用 pow (还有其他的手段)确保程序运行时拥有大量算力,如果程序被单步调试,呵呵,一秒钟你也跑不出来几个 hash 直接拉黑这个 ip (这个说法可能比较难理解,因为我第四层的加密没有说明,不过意思就是拒绝执行就对了)
phrack
2017-03-19 16:32:44 +08:00
以上讨论基于 windows py2.7 ,不过基本具有通用性,其他平台和版本处理步奏一样。
Daniel65536
2017-03-19 18:20:02 +08:00
https://zhuanlan.zhihu.com/p/25850970

改 opcode 也是一个思路
PythonAnswer
2017-03-19 21:04:59 +08:00
一般来说,混淆一下,然后 cython 编译,基本够用了。
Allenqjy
2017-03-19 21:08:53 +08:00
@PythonAnswer 请问 python 编译过后性能和未编译过是否有区别?当然是在都不好的基础上。
HowardMei
2017-03-19 21:21:59 +08:00
@phrack 好复杂的样子, Google 的 Grumpy 可以把一般的 python 程序转译到 Go
PythonAnswer
2017-03-19 21:30:25 +08:00
@Allenqjy 计算密集型的过程,会加速,因为变成 c 代码编译了。你就当顺便提了个速。
loading
2017-03-19 21:50:04 +08:00
关键代码还是建议换语言写,然后调用。普通的程序无所谓了,你把 python 的空格搅乱我就不想看了……
woodrat
2017-03-19 22:01:31 +08:00
15 楼的方法亲测可行,而且成本比较低,写个脚本每次从源码生成 ELF 。不过代码里不能动态加路径到 sys.path ,记得 cython 好像不会处理这种情况,不知道是不是记错了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/348602

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX