修改 Zend 引擎实现 PHP 源码加密的原理及实践
PHP 文件的源码都是明文,这对于某些商业用途来说,并不适合。因此考虑使用加
密的手段保护源码。
实在不耐烦等待 zend
出编译器,而且编译和加密本质上不是一回 事儿。自己动手、
开始修改。
一、基本原理
考虑截获 PHP 读取源文件的接口。一开始,我考虑从 Apache 和 PHP 之间的接口处
处理,参见 apache 的 src/modules/php4/mod_php4.c
(这个是 PHP 用 static 方式编译进 apache,make install 后的文件),在 send_php()函数中截获
文件指针,采用临时文件的方式,解密后替换文件指针。这种方 法经过测试实践,证明
是可行的。但是,必须使用两次文件操作,效率低下,而且对于 DSO 方式不可采用。
由此,重新考虑截获 PHP 读取文件并装载至缓存的过程,经过费力的寻找,发现在
Zend
引擎中 zend-scanner.c 是做此处理的。开始对此文件修改。
二、实现方法示意
采用 libmcrypt
作为加 密模块,现在采用的是 DES 方法 ECB 模式加密,
下面是文件加密的源代码:
/* ecb.c-------------------cut here-----------*/
/* encrypt for php source code version 0.99 beta
we are using libmcrypt to encrypt codes, please
install it first.
compile command line:
gcc -O6 -lmcrypt -lm -o encryptphp ecb.c
please set LD_LIBRARY_PATH before use.
GNU copyleft, designed by wangsu , miweicong */
#define MCRYPT_BACKWARDS_COMPATIBLE 1
#define PHP_CACHESIZE 8192
#include <mcrypt.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
main(int argc, char** argv)
{
int td, i,j,inputfilesize,filelength;
char filename[255];
char password[12];
FILE* ifp;
int readfd;
char *key;