修改Zend引擎实现PHP源码加密的原理及实践

2016-01-29 15:22 48 1 收藏

修改Zend引擎实现PHP源码加密的原理及实践,修改Zend引擎实现PHP源码加密的原理及实践

【 tulaoshi.com - 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;
  void *block_buffer;
  void *file_buffer;
  int keysize;
  int decode=0;
  int realbufsize=0;
  struct stat *filestat;
  
  
  if(argc == 3) {
  strcpy(password,argv[1]);
  strcpy(filename,argv[2]);
  } else if(argc == 4 && !strcmp(argv[1],"-d")){
  strcpy(password,argv[2]);
  strcpy(filename,argv[3]);
  decode=1;
  printf("Entering decode mode ... n");
  } else {
  printf("Usage: encryptphp [-d] password filenamen");
  exit(1);
  }
  
  
  keysize=mcrypt_get_key_size(DES);
  key=calloc(1, mcrypt_get_key_size(DES));
  
  gen_key_sha1( key, NULL, 0, keysize, password, strlen(password));
  td=init_mcrypt_ecb(DES, key, keysize);
  
  if((readfd=open(filename,O_RDONLY,S_IRUSR|S_IWUSR|S_IRGRP))==-1){
  printf("FATAL: Can't open file to read");
  exit(3);
  }
  
  filestat=malloc(sizeof(stat));
  
  fstat(readfd,filestat);
  inputfilesize=filestat->st_size;
  printf("filesize is %d n",inputfilesize);
  filelength=inputfilesize;
  
  inputfilesize=((int)(floor(inputfilesize/PHP_CACHESIZE))+1)*PHP_CACHESIZE;
  
  if((file_buffer=malloc(inputfilesize))==NULL){
  printf("FATAL: can't malloc file buffer.n");
  exit(2);
  }
  if((block_buffer=malloc(PHP_CACHESIZE))==NULL){
  printf("FA

来源:http://www.tulaoshi.com/n/20160129/1495728.html

延伸阅读
摘 要 Java规则引擎是一种嵌入在Java程序中的组件,它的任务是把当前提交给引擎的Java数据对象与加载在引擎中的业务规则进行测试和比对,激活那些符合当前数据状态下的业务规则,根据业务规则中声明的执行逻辑,触发应用程序中对应的操作。 引言 目前,Java社区推动并发展了一种引人注目的新技术Java规则引擎(Rule Engine)。利用它就可...
mysql+httpd+gd+php+zend的安装 安装mysql shell> groupadd mysql shell> useradd -g mysql mysql shell> cd /usr/local shell> gunzip ln -s FULL-PATH-TO-MYSQL-VERSION-OS mysql shell> cd mysql shell> scripts/mysql_install_db --user=mysql shell> chown -R root . shell> chown -R mysql data shell> chgrp -R mysql . shell> bin/...
标签: Web开发
使用PHP的人都知道,Zend Encode是一个脚本编程工具,用它写的程序,必须以源码的形式放置在Web服务器上,所以我们无法保护自己的源代码。大家都知道任何一个脚本程序的执行效率同具有相同功能的编译好的二进制代码相比较,它的执行效率都是比较低的。那么要是有一个工具能够帮我们把用PHP写的程序编译成二进制代码就好了,这样不但执行效率...
本周一,甲骨文(Oracle)与Zend公司联合对外宣布,正式推出“Zend Core for Oracle”的beta版本,这是一项将甲骨文的数据库与Zend的PHP开发环境整合为一体的技术。 “Zend Core for Oracle”技术使得PHP的用户能够在Oracle环境下开发应用软件。这两家公司的官方消息称,beta版本现在已经能够通过双方的Web站点下载试用,其最终版本有望在今年...
给word设置密码,不仅可以防止别人乱修改我们的文档,也能是我们的文档更加安全,在有些时候是非常必要的。现在本文以word 2003为例,给大家讲讲word设置密码的方法(其它版本类似),不会的朋友可以参考下。 word 2003设置密码图文教程 在菜单栏找到“工具”。 选择“工具”——“选项”。 ...

经验教程

309

收藏

68
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部