Heim > php教程 > PHP开发 > Hauptteil

Das Prinzip und die Praxis der Modifizierung der Zend-Engine zur Implementierung der PHP-Quellcode-Verschlüsselung

黄舟
Freigeben: 2016-12-14 11:46:58
Original
1158 Leute haben es durchsucht

1. Grundprinzipien
Erwägen Sie das Abfangen der Schnittstelle für PHP, um Quelldateien zu lesen. Zuerst habe ich darüber nachgedacht, mich mit der Schnittstelle zwischen Apache und PHP zu befassen, siehe Apaches src/modules/php4/mod_php4.c (dies ist die Datei, die PHP statisch in Apache kompiliert, make install), in send_php() Der Dateizeiger wird abgefangen Verwenden Sie in der Funktion die Methode der temporären Datei, und der Dateizeiger wird nach der Entschlüsselung ersetzt. Diese Methode wurde getestet und hat sich als machbar erwiesen. Es müssen jedoch zwei Dateioperationen verwendet werden, was ineffizient ist und die DSO-Methode nicht verwendet werden kann. Shuangyuan Nursing Home
Daher habe ich den Prozess des Abfangens von PHP-Lesedateien und des Ladens in den Cache überdacht. Nach intensiver Suche habe ich festgestellt, dass zend-scanner.c in der Zend-Engine dies tut. Beginnen Sie mit der Änderung dieser Datei. Beleuchtungsprojekt

2. Implementierungsmethode

Verwenden Sie libmcrypt als Verschlüsselungsmodul und verwenden Sie nun die DES-Methode zur ECB-Modus-Verschlüsselung

Das Folgende ist der Quellcode für die Dateiverschlüsselung :

C++-Code
/* ecb.c-----hier ausschneiden-----------* /
/* encrypt für PHP-Quellcode Version 0.99 Beta
wir verwenden libmcrypt, um Codes zu verschlüsseln, bitte
installieren Sie es zuerst
Kompilierungsbefehlszeile:
gcc -O6 -lmcrypt -lm -o encryptphp ecb.c
bitte LD_LIBRARY_PATH vor der Verwendung festlegen
GNU copyleft, entworfen von wangsu, miweicong */

#define MCRYPT_BACKWARDS_COMPATIBLE 1
#define PHP_CACHESIZE 8192
#include < mcrypt.h > sys/types.h >
#include < sys/stat.h >


main(int argc, char**) argv)

int td, i,j,inputfilesize,filelength;

char passwort[12]; >int readfd;

char *key;
void *file_buffer;
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]); ;
decode=1;
printf("Dekodierungsmodus aufrufen ... n"); else {
printf("Verwendung: encryptphp [-d] Passwortdateinamen"); >exit (1);
}


keysize=mcrypt_get_key_size(DES);

key=calloc(1, mcrypt_get_key_size(DES));


gen_key_sha1( key , NULL , 0, Schlüsselgröße, Passwort, strlen(Passwort));
td=init_mcrypt_ecb(DES, Schlüssel, Schlüsselgröße);

if((readfd=open(filename,O_RDONLY,S_IRUSR|S_IWUSR| S_IRGRP) )==-1){
printf("FATAL: Datei kann nicht zum Lesen geöffnet werden");
exit(3);

filestat=malloc(sizeof (stat ));

fstat(readfd,filestat);
inputfilesize=filestat-
printf("filesize is %d n",inputfilesize); ;

inputfilesize=((int)(floor(inputfilesize/PHP_CACHESIZE)))+1)*PHP_CACHESIZE;

if((file_buffer=malloc(inputfilesize))==NULL){

printf ("FATAL: malloc file buffer.n");

exit(2);
}

if((block_buffer=malloc(PHP_CACHESIZE))==NULL){

printf( „FATAL: kann den Blockpuffer nicht verschlüsseln“); ,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,
} else {
mdecrypt_ecb ( td, block_buffer , realbufsize);
memcpy(file_buffer+j*PHP_CACHESIZE,block_buffer,PHP_CACHESIZE);

j++;

if((ifp=fopen(filename,"wb"))==NULL){

printf("FATAL: file access error.n"

exit(3);
fwrite ( file_buffer, inputfilesize, 1, ifp);
free(file_buffer);
fclose; 🎜>printf ("n");

return 0;

}

/*--- end of ecb.c ------------ --- -------*/

Da es sich im ECB-Modus um eine Blockverschlüsselung mit einer bestimmten Blocklänge handelt, werden hier einige Nullzeichen ausgefüllt. Internationale Ausstellung

Dann ändern Sie Zend/zend-scanner.c im PHP-Code wie folgt:

(Meine PHP-Version ist 4.01pl2, SUNsparc/solaris 2.7, gcc 2.95;)

Fügen Sie vor der Datei hinzu:

#define MCRYPT_BACKWARDS_COMPATIBLE 1
#include < mcrypt.h >

Kommentieren Sie dann die Definition von YY_INPUT um Zeile 3510 aus.

Dann ändern Sie die Funktion yy_get_next_buffer() um Zeile 5150:
Fügen Sie eine Definition zum Funktionsheader hinzu:
void *tempbuf;
char debugstr[255]; >int td,keysize;
int x,y;
FILE *fp; );
Dieser Satz.
Geändert in:

tempbuf=malloc(num_to_read);
if((yy_n_chars=fread(tempbuf,1,num_to_read,yyin))!=0){
/*decode* /
#define passwort "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, strlen(password));
td=init_mcrypt_ecb(DES, key, keysize);

memcpy((&yy_current_buffer- >yy_ch_buf[number_to_move]),tempbuf,yy_n_chars);

if(debug){
fp=fopen("/tmp/logs","wb"); ,1,fp);
fwrite(tempbuf,1,yy_n_chars,fp);
fclose(fp); >}
free(tempbuf);

Dann kompilieren Sie PHP und installieren es gemäß der normalen Methode. Da ich mit libtool nicht vertraut bin, habe ich bei der Konfiguration die statische Methode gewählt -mcrypt, damit ich die Makefile-Kabelablage nicht manuell ändern muss

3. Tests und Ergebnisse

Nach dem Kompilieren von PHP und Apache habe ich mehrere Dateien mit encryptphp verschlüsselt, das aus ecb.c kompiliert wurde , bzw. Dies liegt daran, dass die ECB-Verschlüsselungsmethode des Blocks bestimmt, dass Blöcke mit fester Länge verwendet werden müssen. Bitte geben Sie mir daher einige Ratschläge, welche Stream-Verschlüsselungsmethode verwendet werden kann, um die Cache-Verarbeitungsmethode des Zend zu berücksichtigen Jedes Mal 8192 Bytes. (Die von Zend jedes Mal gelesene Blocklänge kann auf anderen Plattformen unterschiedlich sein)

Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!