Maison php教程 PHP开发 修改Zend引擎实现PHP源码加密的原理及实践

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

Dec 14, 2016 am 11:46 AM

一、基本原理 
  考虑截获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模式加密,

下面是文件加密的源代码:

C++代码 
/* 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每次读取的块长度可能有所不同)

更多相关内容请关注PHP中文网(www.php.cn)!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Changements dans le paysage moteur : les moteurs à trois cylindres remettent en question la domination des six et huit cylindres Changements dans le paysage moteur : les moteurs à trois cylindres remettent en question la domination des six et huit cylindres Oct 08, 2023 pm 10:57 PM

Selon les informations du 8 octobre, le marché automobile américain subit un changement sous le capot. Les moteurs à six et huit cylindres, autrefois appréciés, perdent progressivement leur domination, tandis que les moteurs à trois cylindres font leur apparition. Les informations du 8 octobre ont montré que le marché automobile américain subit actuellement un changement sous le capot. Les moteurs à six et huit cylindres bien-aimés du passé perdent progressivement leur domination et le moteur à trois cylindres commence à émerger. Dans l'esprit de la plupart des gens, les Américains aiment les modèles de grande cylindrée et le « gros V8 américain ». a toujours été synonyme de voitures américaines. Cependant, selon des données récemment publiées par des médias étrangers, le paysage du marché automobile américain subit d’énormes changements et la bataille sous le capot s’intensifie. Il est entendu qu'avant 2019, les États-Unis

Rendu super réaliste ! L'expert en technologie Unreal Engine explique le système d'éclairage global Lumen Rendu super réaliste ! L'expert en technologie Unreal Engine explique le système d'éclairage global Lumen Apr 08, 2023 pm 10:21 PM

L'éclairage global en temps réel (Real-time GI) a toujours été le Saint Graal de l'infographie. Au fil des années, l’industrie a proposé diverses méthodes pour résoudre ce problème. Les méthodes courantes incluent la contrainte du domaine du problème en utilisant certaines hypothèses, telles que la géométrie statique, une représentation approximative de la scène ou le suivi de sondes approximatives, et l'interpolation de l'éclairage entre les deux. Dans Unreal Engine, la technologie globale du système d'éclairage et de réflexion Lumen a été fondée par Krzysztof Narkowicz et Daniel Wright. L'objectif était de créer une solution différente de ses prédécesseurs, capable d'un éclairage uniforme et d'une qualité d'éclairage semblable à celle d'un four. Récemment, au SIGGRAPH 2022, Krzysztof Narko

Comment utiliser l'ACL (Access Control List) pour le contrôle des autorisations dans Zend Framework Comment utiliser l'ACL (Access Control List) pour le contrôle des autorisations dans Zend Framework Jul 29, 2023 am 09:24 AM

Comment utiliser l'ACL (AccessControlList) pour le contrôle des autorisations dans Zend Framework Introduction : Dans une application Web, le contrôle des autorisations est une fonction cruciale. Il garantit que les utilisateurs ne peuvent accéder qu'aux pages et fonctionnalités auxquelles ils sont autorisés à accéder et empêche tout accès non autorisé. Le framework Zend fournit un moyen pratique d'implémenter le contrôle des autorisations, en utilisant le composant ACL (AccessControlList). Cet article explique comment utiliser l'ACL dans Zend Framework.

Test réel du moteur de jeu NVIDIA AI : chat en temps réel avec des PNJ, le chinois est courant Test réel du moteur de jeu NVIDIA AI : chat en temps réel avec des PNJ, le chinois est courant Mar 04, 2024 am 09:40 AM

Le PNJ intelligent créé par l'académicien Huang dans « Cyberpunk 2077 » parle déjà chinois ? L'expérience directe de Qubit, voir des PNJ converser couramment en chinois et en anglais, avec des expressions et des mouvements naturels, et des formes de bouche assorties... S'il n'y avait pas d'écran devant moi, j'aurais vraiment l'impression d'y être. Lors du salon CES de cette année, Nvidia a utilisé son moteur intelligent Avatar Cloud Engine (ACE) pour rendre les PNJ du jeu « vivants », ce qui a provoqué un véritable choc. △Le PNJ intelligent présenté au CES utilise ACE. Les personnages du jeu peuvent avoir des conversations vocales réalistes avec les joueurs, tout en montrant des expressions et des mouvements corporels vifs sans avoir à préparer un script à l'avance. Au moment de ses débuts, il y avait Ubisoft, Tencent, NetEase, MiHoYo et d'autres pays.

Framework d'implémentation PHP : Tutoriel de mise en route de Zend Framework Framework d'implémentation PHP : Tutoriel de mise en route de Zend Framework Jun 19, 2023 am 08:09 AM

Framework d'implémentation PHP : tutoriel d'introduction à ZendFramework ZendFramework est un framework de site Web open source développé par PHP et actuellement maintenu par ZendTechnologies. ZendFramework adopte le modèle de conception MVC et fournit une série de bibliothèques de code réutilisables pour servir l'implémentation d'applications Web2.0 et Web Serve. ZendFramework est très populaire et respecté par les développeurs PHP et propose une large gamme de

Redmi G Pro 2024 Rendez-vous le 4 mars, avec refroidissement par glace et support de la version PC du moteur violent Redmi G Pro 2024 Rendez-vous le 4 mars, avec refroidissement par glace et support de la version PC du moteur violent Mar 02, 2024 pm 12:19 PM

Redmi a officiellement annoncé aujourd'hui que le nouveau Redmi GPro 2024 sortira officiellement le 4 mars. En d’autres termes, la semaine prochaine, nous aurons la sortie de ce nouveau produit passionnant. RedmiGPro2024 fait ses débuts en tant que produit phare de l'e-sport, intégrant profondément les capacités de l'industrie de la téléphonie mobile dans le secteur des ordinateurs portables, présentant une version super performante de 210 W et les performances de Redmi atteignant un nouveau sommet. Equipé d'un processeur i9-14900HX et d'une carte graphique RTX4060, il allie parfaitement e-sport et création pour réaliser une double évolution. De ce point de vue, les performances de ce nouveau produit seront encore améliorées et l'effet réel est passionnant. Il a été mentionné lors de l'échauffement officiel que le nouveau Redmi G Pro 2024 apporte la version PC du moteur violent. Autonomisation de la technologie de téléphonie mobile, trois facteurs majeurs conduisent

Comment configurer l'environnement Window2003 IIS+MySQL+PHP+Zend Comment configurer l'environnement Window2003 IIS+MySQL+PHP+Zend Jun 02, 2023 pm 09:56 PM

Le package d'installation de Windows 2003 comprend Zend, PHP5.2.17, PHPWind8.7 et PHPMyadmin3.5.2. Vous pouvez télécharger le package d'installation directement pour gagner du temps dans la recherche de ressources. Cependant, comme MySQL a dépassé la limite de téléchargement, vous devez vous rendre sur le site officiel de MySQL pour télécharger. Ensuite, décompressez et copiez sur le lecteur D, comme indiqué ci-dessous : MySQLinDdisk Installez et configurez WindowsIIS+FTP Cliquez sur Démarrer>Panneau de configuration>Ajouter ou supprimer des programmes.Ajout ou suppression d'un PG Cliquez sur Ajouter/Supprimer des composants Windows (A). Ajout d'une commande

PHP ne reconnaît pas ZendOptimizer, comment le résoudre ? PHP ne reconnaît pas ZendOptimizer, comment le résoudre ? Mar 19, 2024 pm 01:09 PM

PHP ne reconnaît pas ZendOptimizer, comment le résoudre ? Dans le développement PHP, vous pouvez parfois rencontrer une situation dans laquelle PHP ne peut pas reconnaître ZendOptimizer, ce qui entraînera un mauvais fonctionnement de certains codes PHP. Dans ce cas, nous devons prendre certaines mesures pour résoudre le problème. Certaines solutions de contournement possibles sont décrites ci-dessous, ainsi que des exemples de code spécifiques. 1. Confirmez si ZendOptimizer est installé correctement : Tout d'abord, nous devons confirmer que ZendOptimizer

See all articles