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 *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);
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){
exit(2);
}
printf( „FATAL: kann den Blockpuffer nicht verschlüsseln“); ,block_buffer, PHP_CACHESIZE)){
printf(".");
if(!decode){
if(realbufsize< PHP_CACHESIZE){
((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);
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;
}
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"
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);
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)!