background image

修改 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;