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源文件的備份文件
命令都實驗過成功的.........應該沒什麼再補充的咯.....