# php 代码加密-借助 screw plus {#php-代码加密-借助-screw-plus}
本文讲述如何使用 screw plus 对 php 代码进行加密和解密,达到保护 php 代码的目的。screw plus 是一个 php 扩展, 当要解释某个 php 代码文件时, screw 自动判断是否是经过加密的,如果是,则通过事先配置的密钥(是编译扩展的时候指定的,即秘钥已经编译进了扩展程序中)解密, 然后再交给 php 解释器处理。screw plus 总共会输出 2 个程序, 分别是 php 扩展(用于自动解密 php 文件)和可执行文件(手动加密或解密 php 文件)。借助 screw plus, 可以实现按需加密,即仅对需要加密的文件进行加密。
# 1. 安装依赖环境 {#_1-安装依赖环境}
安装 autoconf
提示
执行 phpize 生成扩展的过程中需要 autoconf
yum install autoconf -y
# 2. 下载 screw plus 工程代码 {#_2-下载-screw-plus-工程代码}
git clone https://gitee.com/splot/php-screw-plus.git
# 3. 使用 phpize 动态生成扩展开发环境 {#_3-使用-phpize-动态生成扩展开发环境}
进入 screw plus 工程根目录,执行 phpize。
phpize 的路径替换为当前 php 环境下实际的路径即可。
[root@tadoo001 php-screw-plus]# /usr/local/php/bin/phpize
Configuring for:
PHP Api Version: 20170718
Zend Module Api No: 20170718
Zend Extension Api No: 320170718
# 4. 配置 {#_4-配置}
进入 screw plus 工程根目录,执行./configure --with-php-config=/usr/local/php/bin/php-config
php-config 的路径替换为当前 php 环境下实际的路径即可。
[root@tadoo001 php-screw-plus]# ./configure --with-php-config=/usr/local/php/bin/php-config checking for grep that handles long lines and -e... /usr/bin/grep checking for egrep... /usr/bin/grep -E checking for a sed that does not truncate output... /usr/bin/sed checking for cc... cc checking whether the C compiler works... yes checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... no checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether cc accepts -g... yes checking for cc option to accept ISO C89... none needed checking how to run the C preprocessor... cc -E checking for icc... no checking for suncc... no checking whether cc understands -c and -o together... yes checking for system library directory... lib checking if compiler supports -R... no checking if compiler supports -Wl,-rpath,... yes checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu checking target system type... x86_64-unknown-linux-gnu checking for PHP prefix... /usr/local/php checking for PHP includes... -I/usr/local/php/include/php -I/usr/local/php/include/php/main -I/usr/local/php/include/php/TSRM -I/usr/local/php/include/php/Zend -I/usr/local/php/include/php/ext -I/usr/local/php/include/php/ext/date/lib checking for PHP extension directory... /usr/local/php/lib/php/extensions/no-debug-non-zts-20170718 checking for PHP installed headers prefix... /usr/local/php/include/php checking if debug is enabled... no checking if zts is enabled... no checking for re2c... no configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers. checking for gawk... gawk checking for php_screw_plus support... yes, shared checking whether to enable php_screw_plus support... yes, shared checking for ld used by cc... /usr/bin/ld checking if the linker (/usr/bin/ld) is GNU ld... yes checking for /usr/bin/ld option to reload object files... -r checking for BSD-compatible nm... /usr/bin/nm -B checking whether ln -s works... yes checking how to recognize dependent libraries... pass_all checking for ANSI C header files... yes checking for sys/types.h... yes checking for sys/stat.h... yes checking for stdlib.h... yes checking for string.h... yes checking for memory.h... yes checking for strings.h... yes checking for inttypes.h... yes checking for stdint.h... yes checking for unistd.h... yes checking dlfcn.h usability... yes checking dlfcn.h presence... yes checking for dlfcn.h... yes checking the maximum length of command line arguments... 1572864 checking command to parse /usr/bin/nm -B output from cc object... ok checking for objdir... .libs checking for ar... ar checking for ranlib... ranlib checking for strip... strip checking if cc supports -fno-rtti -fno-exceptions... no checking for cc option to produce PIC... -fPIC checking if cc PIC flag -fPIC works... yes checking if cc static flag -static works... no checking if cc supports -c -o file.o... yes checking whether the cc linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes checking whether -lc should be explicitly linked in... no checking dynamic linker characteristics... GNU/Linux ld.so checking how to hardcode library paths into programs... immediate checking whether stripping libraries is possible... yes checking if libtool supports shared libraries... yes checking whether to build shared libraries... yes checking whether to build static libraries... no
creating libtool appending configuration tag "CXX" to libtool configure: creating ./config.status config.status: creating config.h [root@tadoo001 php-screw-plus]#
# 5. 编译解密扩展 {#_5-编译解密扩展}
解密扩展指的是 php screw .so 扩展文件。
编译解密程序之前, 先自定义用于加密 php 文件的 key(CAKEY 常量的值)
[root@tadoo001 php-screw-plus]# cat ./php_screw_plus.h
#define CAKEY "FwWpZKxH7twCAG4JQMO"
//如果只允许执行加过密的php文件 设置STRICT_MODE为1
//set STRICT_MODE to 1 if you only want the crypted php files to be executed
#define STRICT_MODE 0
#define STRICT_MODE_ERROR_MESSAGE "ACCESS DENIED"
const int maxBytes = 1024*1024*2;[root@tadoo001 php-screw-plus]#
php-screw-plus 根目录下,执行 make 命令, 编译解密扩展。
生成路径:./modules/php_screw_plus.so
[root@tadoo001 php-screw-plus]# ll ./modules/
总用量 72
-rw-r--r-- 1 root root 830 8月 24 17:16 php_screw_plus.la
-rwxr-xr-x 1 root root 68816 8月 24 17:16 php_screw_plus.so
[root@tadoo001 php-screw-plus]#
复制扩展文件到 php 扩展目录
提示
实际上在执行 phpize 的时候,已经自动生成了扩展文件到扩展目录,但是默认生成的扩展文件可能无法使用,且没有集成自定义加密 key, 所以此处需要做覆盖操作。
cp ./modules/php_screw_plus.so /usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/php_screw_plus.so
修改 php.ini 文件,配置扩展路径
提示
实际上在执行 phpize 的时候,已经自动配置了 php.ini 文件。此处您只需确认下即可。
[SCREW]
extension=php_screw_plus.so;
重启 php-fpm 服务
提示
重启 php-fpm 服务, php.ini 的配置修改才会生效。
# 6. 编译加密或解密程序 {#_6-编译加密或解密程序}
提示
加密和解密程序是同一个二进制文件。
安装依赖
yum install zlib-devel -y
进入 php-screw-plus/tools 目录, 执行 make,生成加密程序 screw。
[root@tadoo001 tools]# ll
总用量 44
-rw-r--r-- 1 root root 94 8月 24 15:24 Makefile
-rw-r--r-- 1 root root 4707 8月 24 15:24 screw.c
[root@tadoo001 tools]# make
gcc -o screw screw.c -lz
[root@tadoo001 tools]# ll
总用量 44
-rw-r--r-- 1 root root 94 8月 24 15:24 Makefile
-rwxr-xr-x 1 root root 31488 8月 24 17:22 screw
-rw-r--r-- 1 root root 4707 8月 24 15:24 screw.c
[root@tadoo001 tools]#
# 7. 加密 php 文件 {#_7-加密-php-文件}
命令格式: ./screw 目录或文件的路径
[root@tadoo001 tools]# ./screw /var/www/viyun/viyun_backend/app/controllers/LearnedController.php
Success Crypting - /var/www/viyun/viyun_backend/app/controllers/LearnedController.php
[root@tadoo001 tools]#
查看加密后的文件内容
[root@tadoo001 tools]# cat /var/www/viyun/viyun_backend/app/controllers/LearnedController.php a57f658413a1a0672612]��M��&��~▒����_�W b����Az.Zzԁi������t�D+�(t��N�`h�o<u۔�Z v�a8��ʸj1�ɝb(G�Q��&Thm��dHk6�9�+r�^B��Ϸ�R����ݵ����Q�J��� 5▒����G�����%W�H�xb������ګ�q��y���O^&�j\K�oF7�l�03�s�>)g �<Ө[����~l�x��jC˭�f�x���6��'��m�1Z(;�>���O �m;f{�|�+�'Z�WfpM!�������3�nM�=�|▒� �a ��Um��1/,�K��Dy&#�h@�a�j>��%�fIx�;�]�0��W�= �;?�,L�=��Z▒5�(Qnxɮ�����iO� \▒�?L/L�!��Bo�NF��<�+I���� � ޗ���|��a�W���A�ʂ� �<����y:%4����#OE����k}�wG@▒3�_Xɡ�P��{r��������Y?g�l�I�s���nL�t�:y��~�R�rZO�Y㑧�;�PRhxBV�����▒�E]dL�'IRe1�?Nj������%#G?;i���Y������}��E��K=��$��~W��[D�} '��By�\�7 c��K%����e9Oi�/<���2�H�wy0�[F�u�u �{�ؤ�'�����������'Ԛ���#a��_���;�?m'�ED죃��M����6�[;bAM�|�(���^�4�+��[�[YS�����.0q ��[6��Z�J�Wbly�\�� �����Gq�}b�o4��d��³�Il" ��َ���8|�▒����m��QS���&X��-6'ʁ�Q v��2�>�kw���%u����\SȪO��}4 H�K�E�s��A1��x���;�(Q].M����*.G9�[���b�u���wԙf���8��������▒�?)�ho�-J��uۑ�L(�����M?���ʈ ��dWu[���q�Y!�bÞB��Fc��7ގ��Ċ�,Xٝ��.g��d[�? �▒d��7�nb�����X�H t�}V%,��)+��x��M�!�<��������< �bU�A���
�������?�x▒87x�a r5�o2�����Ҥ-0>�MZQ�M��VA�� ��:hL�l�vB��LE��G!�C�3w�X��\�q��Av�v�� ,'�Њ�R�-栅�4f��D+c��9��p+t(݈ /��l��.�(M������T�)6x�s���f ���B�T����-%�X����� |�tl�q�=/�s[���H���D��.��"� cƫ�Fc%�l�a��o�����ɉti����s���ݷ �,�~1\��]��8�C9[f(����dۓW{���r��� �F� 7.��f{ ��+�i FG��x⌌K�uS��^��m� �.�\�#���u(���|X�J�F��� �䛸5*�=s���< >��� 6aj$�������t-���Ѓwu�@���2��_J8@d��U��
O�S$��_���k�o����4:U�F�����߉�G# �M'#�S\F�x���ǵh�%�+U����N� K* l���j�L��z��YW���Y�U�f�Y��Y� ��b�G{�z��9n�T<f}��Rw�����? �)�i*i�����g�#C*���:�OEn�cZ7{�0��e2��g��E��&�����d-) (z��a&�h��q�iX9�n�6�0�� ����#7�qr���Y�[?�q淖��UX?�/L��*���5d��ڥ��$��^�G_ɈT@���� OC��yh �uY�6��0<s�GX��Q�eB-��mM#��x�XK���Р�V�j 2c�tZ�@Ź����5Ѫf�� B���ڟvc�ςjo���咾r ��[�;8�����>�\9�n��Y�+�Ʊ~Ԁ�_���һC�����TѾ� lEV�z��▒~2�t��˯S�2��|we�▒�CW�0��&�b�{l�LJ' ��P���~���6g�3
�W��[n�.��K���n[$56��%erKgSW�4 ���$e�3J�:� �P��~����O8e �&QDp�g▒W���!S�l l▒y!b������ Ό�ܛ������=Ő��$� >|Jh�p��&�Dp�B�o��/?�sk,���▒}���,&�ɷ��~z�i^�A0ZVA�)W[ao=�B�պ�g� [root@tadoo001 tools]#
# 8. 解密 php 文件 {#_8-解密-php-文件}
加密的命令后面加个-d 参数, 即代表解密。
命令格式: ./screw 目录或文件的路径 -d
[root@tadoo001 tools]# ./screw /var/www/viyun/viyun_backend/app/controllers/LearnedController.php -d
Success Decrypting - /var/www/viyun/viyun_backend/app/controllers/LearnedController.php
[root@tadoo001 tools]#
发现经过加密的文件已经被解密为明文。