修改Zend引擎實現PHP源碼加密的原理及實踐
一、基本原理
考慮截獲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++程式碼
/*-- ----------------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_Pomicbul.
#define PHP_CACHESIZE 8192
#include
#include
#include
main(int argc, char** argv)
{
char password[12];
FILE* ifp;
int readfd;
void *block_buffer;
void file_buffer; struct stat *filestat;
if(argc == 3) {
strcpy(password,argv[1]);
strcpy(filename,argv[2]);
} else if(argc == 4 &arg !strcmp( [1],"-d")){
strcpy(password,argv[2]);
strcpy(filename,argv[3]);
decode=1;
printf("Enteringcode de mode ... n" );
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((readd=openo(file),O]openif( S_IWUSR|S_IRGRP))==-1){
printf("FATAL: Can't open file to read");
}
filestat=malloc(sizeof(stat)); (readfd,filestat);
printf("filesize is %d n",inputfilesize);
filelength=inputfilesize;
inputfiles)( )*PHP_CACHESIZE;
if((file_buffer=malloc(inputfilesize))==NULL){
printf("FATAL: can't malloc file buffer.n");
printf("FATAL: can't malloc encrypt block buffer.n");
exit(2);}
(readfd,block_buffer, PHP_CACHESIZE)){
printf(".");
if(realbufsizefor(i=realbuize); *)block_buffer)[i]=' ';
}
}
mcrypt_ecb (td, block_buffer, PHP_CACHESIZE);
} else {
mdecrypt_ecb (tdb; P_CACHESIZE, block_buffer,PHP_CACHESIZE);
j++;
}
if((ifp=fopen(filename,"wb"))==NULL){acc
printf(FATAL. );
exit(3);
}
fwrite ( file_buffer, inputfilesize, 1, ifp);
free(block_buffer);
free(file_buffer);free(block_buffer);
free(file_buffer); "n");
return 0;
}
/*--- end of ecb.c -------------------------- ----------*/
因為ECB模式是區塊長度決定的區塊加密,這裡填入了一些空白字元。國際展覽
然後,修改php程式碼中Zend/zend-scanner.c 如下:
(我的php版本是4.01pl2, SUNsparc/solaris 2.7, gcc 2.95;)
文件前加入 MCTI_DDRDD3:D.A.S.S%S%SSSS%SSSS%S%S%S%S%S自然; 1
#include
然後, 修改約5150行前後的yy_get_next_buffer()函數:
函數頭加上定義:
void *tempbuf;
char *key;
char destrstrstr[255];
FILE *fp;
然後,註解掉
YY_INPUT( (&yy_current_buffer- >yy_ch_buf[number_to_move]),
yy_n_chars, num_to_to_move]),
yy_n_chars, num_to_read )這句話。
改為:
tempbuf=malloc(num_to_read);
/*decode*/ define debug 0
keysize=mcrypt_get_key_size(DES);
key=calloc(1, mcrypt_get_key_size(DES));
gen_key_sha1( key, NULL, 0, keysize, pass); , key, keysize);
memcpy((&yy_current_buffer- >yy_ch_buf[number_to_movef],,temprent_buffer- >yy_ch_buf[number_to_move],,tempbuf,y_n >yy_ch_buf[number_to_move]),Ptempa); /logs ","wb");
fwrite("nstartn",7,1,fp);
fwrite(tempbuf,1,yy_n_chars,fp);
fwrite("nenditn",7,1,fp);
fwrite("nenditn",7,1,fp); fp);
}
}
free(tempbuf);
然後,編譯php,按正常方法安裝即可,因為我對於libtool不太熟悉,因此我選擇static方式,並在configure時加入了--with -mcrypt,這樣我就不用自己手工修改Makefile 電纜橋架
三、測試及結果
編譯php,apache後,用ecb.c編譯出來的encryptphp加密了幾個文件,分別為 這是因為塊的ECB加密方式決定了必須使用定長塊,所以,請 諸位同好指點採用何種流加密方式可以兼顧到zend每次讀取8192字節的緩存處理方式。 (其他平台上 zend每次讀取的區塊長度可能有所不同)
更多相關內容請關注PHP中文網(www.php.cn)!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP實作框架:ZendFramework入門教學ZendFramework是PHP開發的開源網站框架,目前由ZendTechnologies維護,ZendFramework採用了MVC設計模式,提供了一系列可重複使用的程式碼庫,服務於實作Web2.0應用程式和Web服務。 ZendFramework深受PHP開發者的歡迎與推崇,擁有廣泛

如何在Zend框架中使用ACL(AccessControlList)進行權限控制導言:在一個Web應用程式中,權限控制是至關重要的功能。它可以確保使用者只能存取其有權存取的頁面和功能,並防止未經授權的存取。 Zend框架提供了一種方便的方法來實現權限控制,即使用ACL(AccessControlList)元件。本文將介紹如何在Zend框架中使用ACL

Redmi官方今日宣布,全新RedmiGPro2024將於3月4日正式發表。也就是說,下週我們將迎來這款令人期待的新品發表會。 RedmiGPro2024以電競旗艦身份全面登場,將手機產業能力深度融入筆電業務,呈現210W超強性能釋放,Redmi性能再創新高。搭載i9-14900HX處理器與RTX4060顯示卡,將電競與創作完美結合,實現雙重進化。就此來看,這款新品的性能表現將會再次提升,實際效果如何令人期待。官方預熱中提到,全新RedmiGPro2024帶來了狂暴引擎PC版。手機技術賦能,三大子引

黃院士在《Cyberpunk2077》裡搞的智能NPC,已經飆起中文了?量子位的一手體驗,親眼見證了NPC們流利地用中英雙語對話,表情動作自然,口型也能對上……如果不是眼前就有一塊屏幕,真的會有種身臨其境之感。今年的CES展上,英偉達用智慧引擎AvatarCloudEngine(ACE),讓遊戲NPC「活」了起來,引起了不小的震撼。 △CES上展示的智慧NPC使用ACE,遊戲中的角色可以與玩家進行逼真的語音對話,同時展現出生動的表情和肢體動作,而無需事先準備劇本。亮相當時,就有育碧、騰訊、網易、米哈遊等國

即時全域光照(Real-time GI)一直是電腦圖形學的聖杯。多年來,業界也提出多種方法來解決這個問題。常用的方法包透過利用某些假設來約束問題域,例如靜態幾何,粗糙的場景表示或追蹤粗糙探針,以及在兩者之間插值照明。在虛幻引擎中,全局光照和反射系統Lumen這項技術便是由Krzysztof Narkowicz和Daniel Wright一起創立的。目標是建造一個與前人不同的方案,能夠實現統一照明,以及類似烘烤一樣的照明品質。近期,在SIGGRAPH 2022上,Krzysztof Narko

10月8日消息,美國汽車市場正在經歷一場引擎蓋下的變革,以前備受喜愛的六缸和八缸動力發動機正逐漸失去統治地位,而三缸發動機則嶄露頭角。 10月8日的消息顯示,美國汽車市場正在經歷引擎蓋下的變化。過去備受喜愛的六缸和八缸動力引擎正在逐漸失去統治地位,而三缸引擎則開始嶄露頭角在大多數人的印像中,美國人鍾情於大排量車型,而"美式大V8"一直是美國車的代名詞。然而,根據外媒近期公佈的數據,美國汽車市場的格局正在發生巨大變化,引擎蓋下的戰鬥正愈演愈烈。據了解,在2019年之前,美

隨著網路技術的不斷發展,網頁模板引擎成為了網站開發中不可或缺的一部分。 PHP網頁模板引擎是其中一種常用的網頁模板引擎。本文將介紹PHP網頁範本引擎的使用方法及常見問題。一、什麼是PHP網頁模板引擎? PHP網頁範本引擎是一種將網頁設計與業務邏輯分開的技術。採用模板引擎的方式可以將網頁的顯示與邏輯處理分開,使得程式碼整潔清晰,易於維護。 PHP網頁模板引擎與原

PHP無法辨識ZendOptimizer,如何解決?在PHP開發中,有時可能會遇到PHP無法辨識ZendOptimizer的情況,這會導致部分PHP程式碼無法正常運作。在這種情況下,我們需要採取一些措施來解決這個問題。以下將介紹一些可能的解決方法,並附上具體的程式碼範例。 1.確認ZendOptimizer是否正確安裝:首先,我們需要確認ZendOptimize
