注意?。。。?!
首先世界上沒有絕對的安全,只有破解代價與利益是否等價
別說啥PHP不安全,其他語言安全。例子:
- windows牛逼不,被破解了
- photoshop牛逼不,被破解了
- 等等等
默認(rèn)加密方式
目前默認(rèn)加密方式是AES_CBC,用的TINY-AES-C實(shí)現(xiàn)。編譯的時候,可以修改自己的密鑰。在源碼中的:
/src/config.h
未處理項(xiàng)目
文件校驗(yàn)
目前加密的文件數(shù)據(jù),僅有代碼數(shù)據(jù)。為了安全用戶可以加上自己的校驗(yàn)數(shù)據(jù)。例如以下結(jié)構(gòu)體
struct {
char *ip
char *mac
char *phpCode
int expire
}
從而實(shí)現(xiàn),機(jī)器的ip、mac地址、還有過期時間限制
未完善
mixed_opcode
static void mixed_opcode(zend_op_array* opline) {
if (NULL != opline) {
for (size_t i = 0; i < opline->last; i++) {
zend_op* orig_opline = &(opline->opcodes[i]);
if (orig_opline->opcode == ZEND_IS_EQUAL) {
orig_opline->opcode = ZEND_IS_IDENTICAL;
zend_vm_set_opcode_handler(orig_opline);
} else if (orig_opline->opcode == ZEND_IS_NOT_EQUAL) {
orig_opline->opcode = ZEND_IS_NOT_IDENTICAL;
zend_vm_set_opcode_handler(orig_opline);
}
}
}
}
目前,對zend_op_array的混淆,僅僅做了簡單處理。這一步是為了防止有人從op code逆向出代碼(編譯原理AST語法樹相關(guān)知識)。
zend_execute等hook
講道理,用戶可以修改編譯自己的php,從而從關(guān)鍵位置拿到數(shù)據(jù),也就是拿內(nèi)存數(shù)據(jù)。為此,
一些關(guān)鍵函數(shù),例如zend_execute等,一定要加入例如Easyswoole Compiler實(shí)例代碼中compile_string
函數(shù)的hook校驗(yàn)
so文件加殼
so文件加殼是避免你加密方法,還有加密文件泄漏的重要方式!?。?!至于加殼方法,百度一大堆,本文不再講述
弊端
PHP的加密之所以困難,原因在于、PHP是開源的,無論你再怎么編譯加密,最終都需要去執(zhí)行opcode。問題在于,我php是開源的,因此、、、我可以在zen_execute等對應(yīng)的方法修改源碼,打印出來opcode數(shù)據(jù)進(jìn)行逆向。為此。。如果需要避免這種方式,那就是我調(diào)用自己聲明的庫。 因此我們可以看到,類似swoole_loader,需要分php版本下載,很大一部分原因,就如我們實(shí)現(xiàn)的原理一樣,我把php對應(yīng)版本zend目錄下的核心文件,提前引入,防止hook
結(jié)束語
講真,寫這個文章來講解原理,也不是為了拆臺,zend的加密器都能被破解,你寫的再牛逼,無非就是利益夠不夠的問題。這是為了幫助大家,更了解深入PHP源碼的加密。不論什么語言,真想破解,一定是有辦法的。因此,最好的方式那就是核心API放自己的服務(wù)器,以SASS方式提供服務(wù)
。
當(dāng)然,加密也并不是意義全無、至少、、、心里都會權(quán)衡一下,看你是要自己開發(fā)劃算、還是破解我的劃算。