php_screw 1.5:php加密: 安装与使用详解


Posted in PHP onJune 20, 2013

php文件通常以文本格式存贮在服务器端, 很容易被别人读到源代码, 为了对源代码进行保护, 可以采用对源代码进行加密的方式.要实现该功能需要两部分:

一是加密程序,实现对PHP文件的加密. 另一个就是对加密过的PHP文件进行解析, 以得到运行结果. 前者的实现比较简单, 就是一程序而已. 后者的实现大部分都是通过php module的形式来实现的.

php_screw(螺丝钉)可以实现以上的功能.最新版本是1.5,可以在sourceforge上下载.
安装:
安装的目的其实就是产生两个文件:一个是用于加密PHP文件的screw, 另一个就是php加载的解析模块php_screw.so
1.将源代码包展开, 并进入该入目录:
2. 执行phpize, 就会在该目录下产生一个configure
3. 然后,运行configure
4. 再make
这样, 解析用的php_screw.so就生成了. 接下来要得到加密用的screw
1. 进入源码的tools目录
2. make
这样就生成了screw了. 如果要加密一个lx.php文件, 则: screw lx.php, lx.php就变成加密的了, 原来明文的lx.php被改名为lx.php.screw
接下来的任务就应该是加载php_screw.so模块了,
首先, 将该文件COPY到module目录下, 具体是哪个目录,可以参见/etc/php.ini配置文件中的extension_dir项,RHEL 5中为/usr/lib/php/modules
方法一:可以在/etc/php.d目录下新建一个screw.ini文件(文件是可以任意取的),其内容是一句话extension=php_screw.so
方法二:通过修改php.ini文件, 增加了一句extension=php_screw.so, 重启apache后就成功了.
重要说明:
编译的.so文件理论上跟你当前的php版本是相关的,也就是说,如果你是在php 5.1下编译的,就不能拿到php 5.2下去用,因为php的可加载模块总是与其版本相关的.而加密用的screw可执行文件理论上讲无所谓,只有他跟screw.so属于同一个版本就可以
测试:
编写一个hello, world程序,文件名为hello.php如下:

<?phpecho 
"Hello,world";
?>

用php  hello.php测试程序是否能成功显示, 成功显示后, 用screw对其进行加密(screw  helllo.php), 然后cat一下该php文件, 发现已经不是文本的了, 变成了许多乱字符, 说明加秘成功, 然后再php  hello.php, 如果能正常显示hello,world, 则说明加密的解析也没有问题了, 一切就算OK了.否则, 就说明还有不对的地方, 需要再仔细检查.
安装过程中遇到的问题:
1.找不到phpize
phpize是属于php-develp的一个工具, (具体作用请自行解决) 因此, 必须要安装php-develp包. 中间有一些依赖, 如下:
[root@localhost Server]# rpm -ivh php-devel-5.1.6-5.el5.i386.rpm 
 warning: php-devel-5.1.6-5.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
 error: Failed dependencies:
 autoconf is needed by php-devel-5.1.6-5.el5.i386
 automake is needed by php-devel-5.1.6-5.el5.i386
 [root@localhost Server]# rpm -ivh autoconf
 autoconf213-2.13-12.1.noarch.rpm autoconf-2.59-12.noarch.rpm 
 [root@localhost Server]# rpm -ivh autoconf-2.59-12.noarch.rpm 
 warning: autoconf-2.59-12.noarch.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
 error: Failed dependencies:
 imake is needed by autoconf-2.59-12.noarch
 [root@localhost Server]# rpm -ivh imake-1.0.2-3.i386.rpm 
 warning: imake-1.0.2-3.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
 Preparing... ########################################### [100%]
 1:imake ########################################### [100%]
 [root@localhost Server]# rpm -ivh autoconf-2.59-12.noarch.rpm 
 warning: autoconf-2.59-12.noarch.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
 Preparing... ########################################### [100%]
 1:autoconf ########################################### [100%]
 [root@localhost Server]# rpm -ivh automake
 automake14-1.4p6-13.noarch.rpm automake16-1.6.3-8.noarch.rpm automake-1.9.6-2.1.noarch.rpm 
 automake15-1.5-16.noarch.rpm automake17-1.7.9-7.noarch.rpm 
 [root@localhost Server]# rpm -ivh automake-1.9.6-2.1.noarch.rpm 
 warning: automake-1.9.6-2.1.noarch.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
 Preparing... ########################################### [100%]
 1:automake ########################################### [100%]
 [root@localhost Server]# rpm -ivh php-devel-5.1.6-5.el5.i386.rpm 
 warning: php-devel-5.1.6-5.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
 Preparing... ########################################### [100%]
 1:php-devel ########################################### [100%]

2.每个加密的文件头部都一个很明显的字符串PM9SCREW, 这样很容易被人猜到是用screw加密的.
这个问题的解决需要在安装的第一步就开始. 该标识串在源码的php_screw.h中. 在编译之前, 可以更改这个字符串, 例如,更改为PeterHu, 相应的下面的长度就不再是10了, 而是\tPeterHu\t,一共7个了.
#define PM9SCREW        "\tPM9SCREW\t"
#define PM9SCREW_LEN     10

==================================================================================
网上看了好多PHP_SCREW安装文章.也看过好几次源码报里的READEME.
真折腾,要么脚本方式执行不了,要么网页无法显示.经过不屈不挠的折腾终于折腾出来了......分享以下方法...若有大虾知道具体原因不妨指点一二.
PS:CentOS release 5.8 (Final),php5.2.x
下载php-screw-1.5,若是php4用php-screw-1.3
源码包:http://sourceforge.net/projects/php-screw/files/latest/download?source=files
源码包放到/usr/local下,开始安装咯
1.tar -zxvf php_screw-1.5.tar.gz(出来permission之类错误就加sudo)
2.cd php_screw_1.5
3.phpize(执行不了就写phpize的绝对路径,装好了的前提下)
4.vi my_screw.h(里面是密码,想改就改,最好不要超过5位数,若改了要记好,因为重新编译时要用)
5.vi php_screw.h(里面是加密字符串,默认是PM9SCREW,最好改成别的字符串,字符串变了下面长度也要跟着变,改成LOVE的话长度就是6了,字符串要记下)
6. ./configure
7. make && make install
成功了会输出:Installing shared extensions:     /usr/lib64/php/modules/(这个目录是/etc下php.ini里extension_dir指定的目录).php_screw.so文件就在这里,当然编译目录的modules下也有.
8. cd tools/
9. make
这样生成了加密用的程序screw了
10. cp screw /usr/bin下
这样加密的时候可以直接screw 文件名了,不用写screw的路径
11.修改ini
cd /etc/php.d(这里是php.ini加载的各种扩展可以在这写,打开别的文件看看就知道了)
vi php_screw.ini
里面写上extension=php_screw.so保存退出
12.重启apache
在根目录下创建hello.php
<?echo 'hello';?>
php hello.php
输出:hello
screw hello.php
输出:Success Crypting(hello.php),说明加密成功,目录下会多出一个文件hello.php.screw,现在的hello.php已经是加密过的了,而多出的则是源文件的备份.
cat hello.php显示乱码.
php hello.php 输出hello.脚本方式解析加密文件成功了.
在根目录下建立phpinfo,里面若有php_screw扩展相关信息就说明可以通过浏览器访问加密的文件了.不用继续往下看了.我是有两个php.ini,网页跟脚本方式调用的ini不同.
接下来要重新编译一次了,为了可以在网页里正常显示.
1.去编译目录
make clean
然后把目录给删了.
2.tar -zxvf php_screw.1.5.tar.gz重新解压
3. phpize
4. myscrew.h跟php_screw.h里的密码跟字符串记得要跟之前的一样
5. ./configure --with-php-config=php-config路径(php安装目录下有)
6.make && make install
输出:Installing shared extensions:     /var/www/php5/lib/php/extensions/no-debug-non-zts-20060613/
(这次php_screw.so在这个目录下咯)
7.php_screw.so复制到phpinfo里extension_dir指定的目录,我的是/var/www/modules下
8.修改php.ini(php安装目录下的,phpinfo里会显示载入的是哪个ini,就改那个)
 在最下方添加extension=php_scrw.so
9.重启apache
10.在phpinfo里看看有木有php_screw相关信息,有的话就ok了~
至此,安装结束了,虽然有点点头绪,但我还是没太搞明白为什么得这样编译两次才行......
PS:编译过程中碰见的几个问题如下(解决方法)
1。 /root/php_screw-1.5/php_screw.c: In function ‘pm9screw_compile_file':
解决方法:
需要修改php_screw.c
把第78,84,93行的org_compile_file(file_handle, type);
修改为:
org_compile_file(file_handle, type TSRMLS_CC);
然后再make就成功了。
2. /opt/soft/php_screw-1.5/php_screw.c: In function ‘zm_startup_php_screw':/opt/soft/php_screw-1.5/php_screw.c:124: 错误:‘zend_compiler_globals' 没有名为 ‘extended_info' 的成员/opt/soft/php_screw-1.5/php_screw.c: In function ‘zm_shutdown_php_screw':/opt/soft/php_screw-1.5/php_screw.c:133: 错误:‘zend_compiler_globals' 没有名为 ‘extended_info' 的成员make: *** [php_screw.lo] 错误 1
解决方法:
需要修改php_screw.c
把CG(extended_info) = 1;
修改为:
CG(compiler_options) |= ZEND_COMPILE_EXTENDED_INFO;
php_screw如何对当前目录下,对目录下包含的文件,以及包含目录下的文件进行整体加密
find ./ -name "*.php" -print|xargs -n1 screw //加密所有的.php文件
find ./ -name "*.screw" -print/xargs -n1 rm //删除所有的.php源文件的备份文件
命令都实验过成功的.........应该没什么再补充的咯.....
PHP 相关文章推荐
php header()函数使用说明
Jul 10 PHP
PHP 时间转换Unix时间戳代码
Jan 22 PHP
php 缩略图实现函数代码
Jun 23 PHP
php判断输入不超过mysql的varchar字段的长度范围
Jun 24 PHP
PHP通过session id 实现session共享和登录验证的代码
Jun 03 PHP
PHP中使用虚代理实现延迟加载技术
Nov 05 PHP
php返回字符串中所有单词的方法
Mar 09 PHP
php限制ip地址范围的方法
Mar 31 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
Nov 18 PHP
php 二维数组快速排序算法的实现代码
Oct 17 PHP
分析php://output和php://stdout的区别
May 06 PHP
php实现根据身份证获取精准年龄
Feb 26 PHP
php连接Access数据库错误及解决方法
Jun 20 #PHP
PHP连接Access数据库的方法小结
Jun 20 #PHP
如何使用php判断所处服务器操作系统的类型
Jun 20 #PHP
解析如何在PHP下载文件名中解决乱码的问题
Jun 20 #PHP
解析smarty 截取字符串函数 truncate的用法介绍
Jun 20 #PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
Jun 20 #PHP
IIS+fastcgi下PHP运行超时问题的解决办法详解
Jun 20 #PHP
You might like
DC最新动画电影:《战争之子》为何内容偏激,毁了一个不错的漫画
2020/04/09 欧美动漫
PHP写入WRITE编码为UTF8的文件的实现代码
2008/07/07 PHP
PHP读取RSS(Feed)简单实例
2014/06/12 PHP
destoon实现资讯信息前面调用它所属分类的方法
2014/07/15 PHP
利用laravel搭建一个迷你博客实战教程
2017/08/13 PHP
Yii2框架自定义验证规则操作示例
2019/02/08 PHP
PHP常见字符串操作函数与用法总结
2019/03/04 PHP
javascript中使用css需要注意的地方小结
2010/09/01 Javascript
jquery触发a标签跳转事件示例代码
2013/07/21 Javascript
Javascript之this关键字深入解析
2013/11/12 Javascript
jquery制作LED 时钟特效
2015/02/01 Javascript
jQuery树形下拉菜单特效代码分享
2015/08/15 Javascript
vue.js入门教程之绑定class和style样式
2016/09/02 Javascript
日期时间范围选择插件:daterangepicker使用总结(必看篇)
2017/09/14 Javascript
webpack多页面开发实践
2017/12/18 Javascript
聊聊JS动画库 Velocity.js的使用
2018/03/13 Javascript
js与jQuery实现获取table中的数据并拼成json字符串操作示例
2018/07/12 jQuery
基于node简单实现RSA加解密的方法步骤
2019/03/21 Javascript
小程序分享模块超级详解(推荐)
2019/04/10 Javascript
微信小程序调用天气接口并且渲染在页面过程详解
2019/06/24 Javascript
关于Vue中$refs的探索浅析
2020/11/05 Javascript
[05:36]DOTA2 2015国际邀请赛中国区预选赛第四日TOP10
2015/05/29 DOTA
Python实现随机生成手机号及正则验证手机号的方法
2018/04/25 Python
python虚拟环境完美部署教程
2019/08/06 Python
Python打印特殊符号及对应编码解析
2020/05/07 Python
Python使用jpype模块调用jar包过程解析
2020/07/29 Python
如何将Pycharm中调整字体大小的方式设置为&quot;ctrl+鼠标滚轮上下滑&quot;
2020/11/17 Python
HMV日本官网:全球知名的音乐、DVD和电脑游戏零售巨头
2016/08/13 全球购物
Bugatchi官方网站:男士服装在线
2019/04/10 全球购物
世界上最大的字体市场:MyFonts
2020/01/10 全球购物
传播学专业毕业生自荐信
2013/11/04 职场文书
培训演讲稿范文
2014/01/12 职场文书
图书室管理制度
2014/01/19 职场文书
2014财务年度工作总结
2014/11/11 职场文书
你为什么是穷人?可能是这5个缺点造成
2019/07/11 职场文书
Nginx tp3.2.3 404问题解决方案
2021/03/31 Servers