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

2016-01-29 15:22 44 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

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

延伸阅读
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/...
摘 要 Java规则引擎是一种嵌入在Java程序中的组件,它的任务是把当前提交给引擎的Java数据对象与加载在引擎中的业务规则进行测试和比对,激活那些符合当前数据状态下的业务规则,根据业务规则中声明的执行逻辑,触发应用程序中对应的操作。 引言 目前,Java社区推动并发展了一种引人注目的新技术Java规则引擎(Rule Engine)。利用它就可...
标签: Web开发
使用PHP的人都知道,Zend Encode是一个脚本编程工具,用它写的程序,必须以源码的形式放置在Web服务器上,所以我们无法保护自己的源代码。大家都知道任何一个脚本程序的执行效率同具有相同功能的编译好的二进制代码相比较,它的执行效率都是比较低的。那么要是有一个工具能够帮我们把用PHP写的程序编译成二进制代码就好了,这样不但执行效率...
标签: PHP
最近一段时间对PHP文件处理方面很感兴趣,因此在许多站点上看了许多的文件处理的文章,但是国内许多的站点上的PHP文件处理方面的知识大多数是你抄我的我抄你的,用baidu.com或者是google.com搜索出来的东西多是重复的。最近在国外一个站点上盾了一篇文章感觉很不错,因此推荐给大家阅读。 首先我们有必要说明一下文件上传的操作...
标签: Web开发
看到这个题目,或许有人会提出疑问,JavaScript代表客户端,而Session代表的是服务器(不知道这样说大家是否能够理解)。 先说一下需求,我在做一个权限管理的时候,需要在点击某个模块时,Session中相应的改变模块代号,而实现这个操作的是一个a标签,当然我不知道 一个linkbutton是否可以同时将跳转页面和修改Session做了,个人感觉应该是可...

经验教程

231

收藏

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