php 怎么用zend加密
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php 怎么用zend加密相关的知识,希望对你有一定的参考价值。
可以加密就可以解密。
解密ZEND加密后的php文件:
zend加密php文件解密工具Dezender可以做到。
1、下载Dezender.zip
2、解压到盘里面,最好不要有中文路径,比如解压到 I:\\Dezender 里面,修改 I:\\Dezender\\PHP5\\PHP5\\php.ini文件,修改里面的文件路径。
3、打开cmd命令行
然后就可以看见文件目录下面会多出一个文件 文件名.de.php
4、进入I:\\Dezender 目录下面的
5、写一个批处理文件,可以直接把一个目录下面的文件全部批量解密
参考技术A ZendGuard是一款php的加密工具,它可以编译php源码变为字节码加密的具体步骤如下:
1:在网上下载ZendGuard 关于PHP文件加密的软件
2:安装完毕以后,找到bin目录下zendenc.exe 。注:(别忘记搞上破解版。)
3:使用方法,先找一个你要加密的php文件,比如iii.php。
4:然后在命令行里面输入: zendenc iii.php 33.php
5:第二个参数是你的要加密的php文件,第三个参数是输出文件的名字. 附件里面有个最简单的webshell可加密以后的文件。
6:加密成功,可以把加密的前后的PHP文件进行对比 参考技术B ASPCOOL 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("FATAL: can't malloc encrypt block buffer.n"); exit(2); j=0; while(realbufsize=read (readfd,block_buffer, PHP_CACHESIZE)) printf("."); if(!decode) if(realbufsize< PHP_CACHESIZE) for(i=realbufsize;i< PHP_CACHESIZE;i++) ((char *)block_buffer)[i]=' '; mcrypt_ecb (td, block_buffer, PHP_CACHESIZE); else mdecrypt_ecb (td, block_buffer, realbufsize); memcpy(file_buffer+j*PHP_CACHESIZE,block_buffer,PHP_CACHESIZE); j++; close(readfd); if((ifp=fopen(filename,"wb"))==NULL) printf("FATAL: file access error.n"); exit(3); fwrite ( file_buffer, inputfilesize, 1, ifp); free(block_buffer); free(file_buffer); free(filestat); fclose(ifp); printf("n"); return 0; /*--- end of ecb.c ------------------------------------*/ 因为ECB模式是块长度确定的块加密,这里填充了一 些空字符。 然后,修改php代码中 Zend/zend-scanner.c 如下: (我的php版本是4.01pl2, SUNsparc/solaris 2.7, gcc 2.95;) 文件前加入: #define MCRYPT_BACKWARDS_COMPATIBLE 1 #include < mcrypt.h > 然后,注释掉大约3510行前后的YY_INPUT的定义。 然后, 修改大约5150行前后的yy_get_next_buffer()函数: 函数头加上定义: void *tempbuf; char *key; char debugstr[255]; int td,keysize; int x,y; FILE *fp; 然后 ,注释掉 YY_INPUT( (&yy_current_buffer- >yy_ch_buf[number_to_move]), yy_n_chars, num_to_read ); 这一句。 改为: tempbuf=malloc(num_to_read); if((yy_n_chars=fread(tempbuf,1,num_to_read,yyin))!=0) /*decode*/ #define password "PHPphp111222" #define debug 0 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); mdecrypt_ecb(td, tempbuf, yy_n_chars); memcpy((&yy_current_buffer- >yy_ch_buf[number_to_move]),tempbuf,yy_n_chars); if(debug) fp=fopen("/tmp/logs","wb"); fwrite("nstartn",7,1,fp); fwrite(tempbuf,1,yy_n_chars,fp); fwrite("nenditn",7,1,fp); fclose(fp); free(tempbuf); 然后,编译php,按正常方法安装即可,因为我对于libtool不太熟悉,因此我选择static方式,并在 configure时加入了--with-mcrypt,这样我就不用自己手工修改Makefile 三、测试及结果 编译php,apache后,用ecb.c编译出来的encryptphp加密了几个文件,分别为< 1K,10K+,和40K+,在处理 40K大小文件时出错,别的文件均正常。 这是因为块的ECB加密方式决定了必须使用定长块,所以,请 诸位同好指点采用何种流加密方式可以兼顾到zend每次读取8192字节的缓存处理方式。(其他平台上 zend每次读取的块长度可能有所不同) 四、说明 我的机器是SUN Ultra1, solaris 2.7, gcc 2.95 , apache 1.3.12, php 4.01pl2, libmcrypt 2.2.4 我的C水平很差,请大家见谅。这里只是原理说明。 感谢老米飞刀等提供的协助。 源码遵从GNU,需要注意,libmcrypt提供的某些加密方式不是free的。 参考技术C ASPCOOL 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("FATAL: can't malloc encrypt block buffer.n"); exit(2); j=0; while(realbufsize=read (readfd,block_buffer, PHP_CACHESIZE)) printf("."); if(!decode) if(realbufsize< PHP_CACHESIZE) for(i=realbufsize;i< PHP_CACHESIZE;i++) ((char *)block_buffer)[i]=' '; mcrypt_ecb (td, block_buffer, PHP_CACHESIZE); else mdecrypt_ecb (td, block_buffer, realbufsize); memcpy(file_buffer+j*PHP_CACHESIZE,block_buffer,PHP_CACHESIZE); j++; close(readfd); if((ifp=fopen(filename,"wb"))==NULL) printf("FATAL: file access error.n"); exit(3); fwrite ( file_buffer, inputfilesize, 1, ifp); free(block_buffer); free(file_buffer); free(filestat); fclose(ifp); printf("n"); return 0; /*--- end of ecb.c ------------------------------------*/ 因为ECB模式是块长度确定的块加密,这里填充了一 些空字符。 然后,修改php代码中 Zend/zend-scanner.c 如下: (我的php版本是4.01pl2, SUNsparc/solaris 2.7, gcc 2.95;) 文件前加入: #define MCRYPT_BACKWARDS_COMPATIBLE 1 #include < mcrypt.h > 然后,注释掉大约3510行前后的YY_INPUT的定义。 然后, 修改大约5150行前后的yy_get_next_buffer()函数: 函数头加上定义: void *tempbuf; char *key; char debugstr[255]; int td,keysize; int x,y; FILE *fp; 然后 ,注释掉 YY_INPUT( (&yy_current_buffer- >yy_ch_buf[number_to_move]), yy_n_chars, num_to_read ); 这一句。 改为: tempbuf=malloc(num_to_read); if((yy_n_chars=fread(tempbuf,1,num_to_read,yyin))!=0) /*decode*/ #define password "PHPphp111222" #define debug 0 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); mdecrypt_ecb(td, tempbuf, yy_n_chars); memcpy((&yy_current_buffer- >yy_ch_buf[number_to_move]),tempbuf,yy_n_chars); if(debug) fp=fopen("/tmp/logs","wb"); fwrite("nstartn",7,1,fp); fwrite(tempbuf,1,yy_n_chars,fp); fwrite("nenditn",7,1,fp); fclose(fp); free(tempbuf); 然后,编译php,按正常方法安装即可,因为我对于libtool不太熟悉,因此我选择static方式,并在 configure时加入了--with-mcrypt,这样我就不用自己手工修改Makefile 三、测试及结果 编译php,apache后,用ecb.c编译出来的encryptphp加密了几个文件,分别为< 1K,10K+,和40K+,在处理 40K大小文件时出错,别的文件均正常。 这是因为块的ECB加密方式决定了必须使用定长块,所以,请 诸位同好指点采用何种流加密方式可以兼顾到zend每次读取8192字节的缓存处理方式。(其他平台上 zend每次读取的块长度可能有所不同) 四、说明 我的机器是SUN Ultra1, solaris 2.7, gcc 2.95 , apache 1.3.12, php 4.01pl2, libmcrypt 2.2.4 我的C水平很差,请大家见谅。这里只是原理说明。 感谢老米飞刀等提供的协助。 源码遵从GNU,需要注意,libmcrypt提供的某些加密方式不是free的
支持源码多重加密,将网站一键生成EXE文件运行,封装网站源码演示运行
PHP打包器应用场景:做好网站程序后,发布给用户看,但是不想泄露源码,可以选择“封装源码生成EXE文件”,建议封装前先用zend等加密代码,可以起到双重保险,对方在破解软件的同时还需要破解网站源码。对破解者的知识体系比较考验,因为涉及了运维、编程、反编译、zend加密的破解、软件破解等相关知识,而且PHPWAMP自带反破解功能,被破解后会自动销毁软件。
PHPWAMP常用工具“PHP网站打包工具”
可以将php网站一键打包,也可以将PHP网站生成单个EXE可执行文件。
使用PHPWAMP的网站打包神器之前,请先下载PHPWAMP,下载软件压缩包后解压即可使用,可直接百度搜“PHPWAMP”如无法使用请安装.NET4.5即可,win10默认自带了.NET4.5,所以可以直接使用,其他系统如果安装了net,也可直接使用。之所以需要安装NET,是因为PHPWAMP我是采用C语言和C#共同开发的软件,原本想全部改成C语言,经历了这么多版本,功能太多懒得改了,主要是因为几年前我开发的时候用的是.NET,后面我才慢慢用了C语言开发了新版本PHPWAMP,因此目前的版本我是采用C语言和C#一起制作的。
PHPWAMP已经过百度和卡巴斯基的安全认证,其他杀毒误报请拉白名单
与其他PHP环境的区别介绍:
目前其他的PHP环境基本都是清一色32位环境,我开发的PHPWAMP支持全自定义,php和mysql都可以一键自定义(其他环境无法实现自定义以及多版本同时运行)环境可以32位和64位同时存在,如果你自定义的PHP是64位的,那么就是64位的,自定义时全自动匹配你的系统(其他环境不会自动匹配,都只有32位,也没有集成VC)
区别概括:其他环境安装64位php会出现错误无法实现自动匹配,并且缺少dll和VC运行库是不能运行的,而PHPWAMP完全没有这方面的问题,缺少dll可自动修复运行。更多优点介绍,请查阅:http://blog.51cto.com/lccee/1959819
软件可以在百度搜索“PHPWAMP”进行下载,也可以到百度软件库下载,目前百度软件库下载量已经接近30万次。
下载注意事项:下载时不要点高速下载(点高速下载会下到百度全家桶),请点普通下载即可,也可以登陆官网下载,百度搜索PHPWAMP即可。
下载完成后我们就可以开始使用PHPWAMP内置的PHP网站打包器了
将网站一键生成EXE文件运行的案例如下
1、打开PHPWAMP,点击常用工具下的“PHP网站打包工具”
2、选择你的网站根目录以及你网站需要的PHP版本,然后选择WEB服务器
选择时支持自定义添加PHP、Mysql版本(32位/64位的PHP版本都可随意添加)
特别注意:不要胡乱选择PHP版本,你要清楚你的网站程序适合用哪个版本的PHP
3、WEB服务器默认勾选的是Apache,如果想运行在Nginx下也可以选择Nginx
4、Mysql版本为当前主界面选择的数据库版本,选择无误后,可以点击“简单生成网站包”即可生成
说明:选择“简单生成网站包”生成的exe后,别人是可以查看你网站源码的,不想被查看请继续往下看
5、如果不想让对方查看我们打包后的php网站源码,上一步骤可以选择这里的“封装源码生成EXE文件”
多重加密建议:封装前先用zend等加密代码,可以起到双重保险,对方在破解软件的同时还需要破解网站源码。对破解者的知识体系比较考验,因为涉及了运维、编程、反编译、zend加密的破解、软件破解等相关知识,而且PHPWAMP自带反破解功能,被破解后会自动销毁软件。
6、最后这部分主要讲解PHP打包器的“更多功能的设置”。
也许你们都注意到这里还有个“设置更多功能选项”
那么这里的更多功能我们应该如何设置呢,请接着往下看
打开更多设置功能后弹出如下功能界面
限制次数:顾名思义,默认是0,就是不会限制用户的使用次数,如果设置成3,那么用户只能打开你的网站三次。
限制日期:默认是2188年,相当于是不限制使用时间,如果设置成2018年8月8日,那么用户到那一天就不能使用了。
权限回收:可以随意通过网络收回用户的使用权限,随时随地禁止用户查看你程序,默认设置成0则不使用该功能,设置成网址表示使用该功能,
权限回收详细讲解:
如何实时回收用户的权限,可以在发布的时候,把0去掉,填写你的网址,例如:
权限回收填写网址:http://www.lccee.com/Takeback.html (具体网址你自己设置)
那么你的网站上面要有个Takeback.html 文件,里面的代码如下
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>权限回收</title>
</head>
<body> <div id="Takeback">no</div> </body>
</html>
主要主要粗体部分,<div id="Takeback">no</div>,在ID为“Takeback”的标签内容里面填上NO,那么就能禁止对方使用了,默认可以设置为YES,想禁止对方使用再改成NO
注意事项:权限回收在断网的时候,也可以禁止他人使用,为了避免用户断网使用你的程序,在使用该功能的同时,如果不联网将不允许使用。(不联网那么就没办法判断你是否允许他使用,所以权限回收功能要开启网络才能使用,如果想允许用户离线演示您的网站,请不要使用权限回收功能,设置成默认的0即可)
此文章匹配:php整站打包工具、php网站打包app、php网站打包成exe、php网站生成exe、php整站打包工具、php网站打包成exe、PHP整站打包程序、php项目怎么打包成exe、把PHP程序打包成exe 文件?如何把PHP MYSQL APACHE 和自己的PHP源程序一起打成EXE。
以上是关于php 怎么用zend加密的主要内容,如果未能解决你的问题,请参考以下文章
PHP:使用Zend对源码加密Zend Guard安装以及Zend Guard Run-time support missing的解决方法