Open treemonster opened 7 years ago
是的,这个加密原理的确是劫持compile_file的,所以可以通过这种方法来解密。但是我们这个扩展的意图是提供一个加密的框架,具体还需要自己去定制一下,因为开源的问题,所以加密是不会完全安全的。我建议是使用者可以自己定制compile_file函数,这样就可以避免把明文被抠出来。最好的方案是连execute钩子也定制一下。
直接定制compile_file用插件岂不是多余了?完全可以在zend内部做加密解密,虽然那样也可以反编译找解密口破解。。
学习了
marker
个人认为所述解密方法是基于动态加载so模块,虽然不需要得到加密插件的源代码或者key,但必须在获得so后才能成功。 如果静态重编译PHP而不暴露beast扩展,应该就无法解密了。 @liexusong @treemonster
@safly 真的要破解办法还是比较多的。就算静态编译我一样可以直接打开二进制文件找到密钥字符串。假如加壳的话,那就运行之后再读取内存中的数据。。反正这套么也就糊弄一下啥都不懂的人,会破解的人根本都懒得去破解这个东西,破了也没钱拿。。
IDA直接能暴漏出16位的key和8位的key_1。使用这个扩展要想安全就得定制,定制就得写C代码。相比这个扩展而言。php-screw倒是提供了一个简洁的框架。就扩展二次开发而言。php-screw比这个项目简单很多。
我在查看您的代码时发现解密之行是通过劫持 zend_compile_file 方法,在其执行之前用明文代码替换了原本的密文字符串。为了验证这个猜测,我在compile_file(compile_file位于zend_language_scanner.c,是zend_compile_file的实体方法)这个方法中加了几行代码用于输出测试文件:
然后我重新编译php,使用以下命令生成加密文件: /php56/bin/php /php-beast-master/tools/encode_file.php --oldfile test.php --newfile test2.php --encrypt DES --expire "2017-10-10 10:10:10"
查看test2.php已是加密的乱码了。
启动php-fpm,并访问一次test2.php。
然后 cat /tmp/mytest.log
得到结果为
确实是一开始的明文代码。
因此这个破解的方式并不需要得到加密插件的源代码或者key。
太轻易的破解让我感觉这个加密太水了。。又或者是我使用的方式不对?