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边学边教》(02.Apache+PHP环境配置――上篇)
Dec 13 PHP
php下过滤html代码的函数 提高程序安全性
Mar 02 PHP
mac环境中使用brew安装php5.5.15
Aug 18 PHP
ThinkPHP添加更新标签的方法
Dec 05 PHP
PHP框架Laravel的小技巧两则
Feb 10 PHP
PHP ajax 异步执行不等待执行结果的处理方法
May 27 PHP
详细解读php的命名空间(一)
Feb 21 PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
May 21 PHP
浅谈laravel数据库查询返回的数据形式
Oct 21 PHP
TP5框架简单登录功能实现方法示例
Oct 31 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 27 PHP
Yii 框架入口脚本示例分析
May 19 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
DOM基础及php读取xml内容操作的方法
2015/01/23 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
2016/01/22 PHP
PHP7多线程搭建教程
2017/04/21 PHP
javascript 通用简单的table选项卡实现
2010/05/07 Javascript
jQuery Validation插件remote验证方式的Bug解决
2010/07/01 Javascript
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
2011/04/12 Javascript
jQuery父级以及同级元素查找介绍
2013/09/04 Javascript
javaScript如何处理从java后台返回的list
2014/04/24 Javascript
用javascript对一个json数组深度赋值示例
2014/07/27 Javascript
JS截取与分割字符串常用技巧总结
2015/11/10 Javascript
Javascript中匿名函数的调用与写法实例详解(多种)
2016/01/26 Javascript
javascript实现瀑布流加载图片原理
2016/02/02 Javascript
AngularJs Managing Service Dependencies详解
2016/09/02 Javascript
微信小程序 倒计时组件实现代码
2016/10/24 Javascript
利用JS做网页特效_大图轮播(实例讲解)
2017/08/09 Javascript
EasyUI Tree树组件无限循环的解决方法
2017/09/27 Javascript
angular基于ng-alain定义自己的select组件示例
2018/02/23 Javascript
vue2.0模拟锚点的实例
2018/03/14 Javascript
node前端开发模板引擎Jade的入门
2018/05/11 Javascript
AngularJS中的作用域实例分析
2018/05/16 Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
2018/10/28 Javascript
关于JavaScript 数组你应该知道的事情(推荐)
2019/04/10 Javascript
JavaScript遍历数组和对象的元素简单操作示例
2019/07/09 Javascript
vue实现购物车结算功能
2020/06/18 Javascript
Python实现数据可视化看如何监控你的爬虫状态【推荐】
2018/08/10 Python
Python设计模式之工厂方法模式实例详解
2019/01/18 Python
python pandas生成时间列表
2019/06/29 Python
python输入多行字符串的方法总结
2019/07/02 Python
pytorch查看torch.Tensor和model是否在CUDA上的实例
2020/01/03 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
2020/02/26 Python
经济系大学生求职信
2013/10/01 职场文书
在校学生职业规划范文
2014/01/08 职场文书
创建市级文明单位实施方案
2014/03/01 职场文书
社区健康教育实施方案
2014/03/18 职场文书
优秀班主任材料
2014/12/16 职场文书
个人更名证明
2015/06/23 职场文书