广告位联系
返回顶部
分享到

PHP代码加密和扩展解密实战

php 来源:转载 作者:秩名 发布时间:2021-04-20 16:35:51 人浏览
摘要

这种方案是通过对代码进行加密,然后利用C语音写解密的PHP扩展。破解难度会有提升,但依然是会被破解的。 从网上找过各种代码加密的开源方案。 一旦开源,就不可能保证安全性。毕竟加密和解密的东西都是公开的。 目前我们没有能力自己去写扩展。还是需要采用

这种方案是通过对代码进行加密,然后利用C语音写解密的PHP扩展。破解难度会有提升,但依然是会被破解的。 
从网上找过各种代码加密的开源方案。 
一旦开源,就不可能保证安全性。毕竟加密和解密的东西都是公开的。 
目前我们没有能力自己去写扩展。还是需要采用开源的方案。 
我找到的比较好用的是php-beast。 
https://github.com/liexusong/php-beast


实战开始

1.下载源码

wget https://github.com/liexusong/php-beast/archive/master.zip

2.解压

unzip master.zip

3.进入源码目录

cd php-beast-master

4.修改自定义文件头header.c

char encrypt_file_header_sign[] = {
    0xe8, 0x16, 0xa4, 0x0c,
    0xf2, 0xb2, 0x60, 0xee
};
 

5.修改默认的加密key

这里选用的是AES加密。因此修改aes_algo_handler.c文件,可以随机生成字符串替换。建议不要使用我测试时随便写的key。部署人员记得修改该key并保存。

 
static uint8_t key[] = {
    0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
    0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c,
};

6.为了安全机制,开启绑定网卡选项

修改networkcards.c文件,将MAC地址加进来。

char *allow_networkcards[] = {   "替换成网卡的MAC地址", NULL,};

开启绑定网卡以后,beast默认的网卡名字是eth0,如果你的网卡名字不是这个,后边需要将你的网卡名字加入到php.ini里。如:beast.networkcard = “eth0,eth1,eth2”。

使用phpize添加扩展 
phpize 
./configure 
make install 
如果有一步报找不到php-config错误的话,手动加上php-config的路径编译。

安装完成后,修改php.ini 
extension=beast.so 
重启php-fpm

到此为止,扩展安装完成。

加密代码

安装完 php-beast 扩展后,可以使用 tools 目录下的 encode_files.php 来加密你的项目。使用 encode_files.php 之前先修改 tools 目录下的 configure.ini 文件,如下:

; source path
src_path = ""

; destination path
dst_path = ""

; expire time
expire = ""

; encrypt type (selection: DES, AES, BASE64)
encrypt_type = "AES"
 

src_path 是要加密项目的路径,dst_path 是保存加密后项目的路径,expire 是设置项目可使用的时间 (expire 的格式是:YYYY-mm-dd HH:ii:ss)。encrypt_type是加密的方式,选择项有:DES、AES、BASE64。 修改完 configure.ini 文件后就可以使用命令 php encode_files.php 开始加密项目。

注意事项

步骤很多,但都是命令行。敲完命令就行了。 
4,5,6是为了安全要做的。 
绑定MAC地址以后,如果非绑定的MAC地址,重启php-fpm会无法启动,报错信息为NOTICE: PHP message: PHP Fatal error: Unable to start beast module in Unknown on line 0 
failed 
必须在绑定的网卡里才能加载生成的beast.so扩展。


部署安装方式

  1. 在目标机上安装扩展。装完扩展以后把php-beast-master目录的东西全部删除。
  2. 在部署的机子上也就是jenkins服务器上安装的扩展的目录不用删除,删除也行,记得备份第5步自定义的key。
  3. 在构建阶段执行自动化脚本执行php encode_files.php 加密代码。
  4. 在部署阶段将加密后的代码发布到目标机上。

优缺点

安全性

  1. 客户直接从目标机down下来代码,因为客户机上不知道加密的key,所以是无法正常解密和阅读的。
  2. 客户从目标机上down下来代码+beast.so扩展,因为绑定MAC地址的缘故,也是无法正常启动php-fpm的。基本上可以保证基本的安全

缺点

  1. 代码执行过程需要解密,有略微的性能损失。
  2. 自定义加密逻辑,可能有难度。毕竟C语音忘得差不多了。

可破解的方案

这里我只提供思路,因为加密后的代码需要正常被zend引擎解析,所以在最后zend引擎编译代码在过词法分析器和语法分析器时,代码已经是解密以后的代码。也就是在目标机上的zend引擎编译函数zend_compile_file里是可以得到解密以后的代码,可以修改该函数,在函数里将解密后的代码写入文件,即可拿到源码。 而我们并不需要关注加密的逻辑和加密的key。 
听起来是不是很扯。如果我有了目标机的权限,也就相当于我可以通过修改zend引擎的编译逻辑来拿到源码。这样安全么? 
讲道理,没有绝对的安全。 
php-beast确实也是劫持的zend_compile_file方法,在代码到达zend引擎编译函数之前,完成解密的。 
对于该类写扩展加密的情况,在拥有服务器权限的情况下。破解的难度可能就在于是否熟悉C语音和zend引擎的工作原理。 
想要绝对的安全(绝对的安全应该是不存在的),只能是修改zend_compile_file的编译逻辑,也就是改zend引擎的底层逻辑。也就是swoole complier的思路了。不过swoole complier是对编译以后的opcode作了手脚,也就是zend引擎在执行opcode之前需要完成解密的,或者是在执行过程中动态解密。具体的不太了解swoole complier的思路。不过可以知道的是swoole complier需要技术底蕴深厚的人才能破解。 
这样做就看是否值得了。


更安全一点?

在这样的情况下我们可以开启两层加密,第一层用ascii码127到255中间的乱码混淆PHP代码。第二层对乱码混淆的代码做加密。就是说即使他们登录上服务器修改了zend引擎的解析函数,拿到的也是混淆以后的乱码。想要还原成PHP代码还需要一定的时间。只是增大了破解的难度,但是对于有耐心的人,依然是可以破解,只是时间问题。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/u013705066/article/details/82703940
相关文章
  • PHP数据加密方式的总结

    PHP数据加密方式的总结
    首先我们来了解一下为什么要加密? 在网络通信的过程中攻击者可以伪造请求和返回,从而达到不可告人的目的。如下图所示: 数据加密之
  • PHP四种统计在线人数方式介绍

    PHP四种统计在线人数方式介绍
    1 用表统计方式 用数据表统计在线人数,这种方式只能用在并发量不大的情况下。 首先我们先新建表:user_login 编辑 user_login 表 模拟用户登
  • PHP获取系统毫秒数时间方法
    前言 php中获取时间方法是date(),在php中获取时间戳方法有time()、strtotime(); date():date(format, timestamp),format为格式、timestamp为时间戳(可选
  • PHP中的DI依赖注入的详细介绍
    什么是 DI / 依赖注入 依赖注入DI 其实本质上是指对类的依赖通过构造器完成 自动注入 通俗来说,就是你当前操作一个类,但是这个类的某
  • PHP8.1 Fiber交叉执行多任务(附代码)
    拿平时大家写的 for 循环举例。像 go 你可以写两个go每个里面各写一个循环同时输入,你可以看到输出是交替。在过去的php版本中,如果只开
  • PHP8.0的编译安装与使用的介绍
    安装与配置 本次使用的操作系统Ubuntu 18.04.4 LTS 安装 1.准备必要库 1 2 apt-get install -y autoconf libxml2-dev libsqlite3-dev \ libcurl4-openssl-dev libssl-dev l
  • Mac如何编译PHP 8.0 到MxSrvs工具

    Mac如何编译PHP 8.0 到MxSrvs工具
    开始准备工作 下载 PHP 8.0 PHP 官方下载 https://www.php.net/downloads.php 进入到 MxSrvs 的主程序路径下的/Applications/MxSrvs/bin,根据 Mxsrvs 的命名规则,
  • PHP8 中的 JIT的详细介绍

    PHP8 中的 JIT的详细介绍
    PHP 8 的 JIT(Just In Time)编译器将作为扩展集成到 php 中 Opcache 扩展 用于运行时将某些操作码直接转换为从 cpu 指令。 这意味着使用JIT后,
  • PHP8.2不再支持字符串中用${}插入变量了

    PHP8.2不再支持字符串中用${}插入变量了
    PHP 社区 4 月底通过了一项只有一张反对票的提案,提案内容是在即将发布的 PHP 8.2 中,不再支持使用 ${} 在字符串中插入变量的语法(标记
  • PHP8.2两个新的强类型:null和false的详细介绍

    PHP8.2两个新的强类型:null和false的详细介绍
    PHP 从 7.0 开始不断地在完善强类型,我们可以给方法参数、返回值、类属性等声明类型。 强类型可以让代码更加健壮,易于维护,可读性增
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计