簡體   English   中英

ionCube如何在內部工作?

[英]How does ionCube work internally?

ionCube以加密格式存儲php文件,它作為php擴展安裝,但我想知道的是當我從非加密的php文件請求加密的php文件時,php編譯器如何執行它。

它是否將加密文件發送到ionCube服務器並獲取原始文件並編譯該文件或其他內容。

表示我們的服務器和ionCube之間的通信方式。 我想這是通過卷曲但我想知道它是如何工作的。

正如您現在所了解的那樣,永遠不會獲得原始代碼,並且處理基於字節碼。

以下是一些可能有用的高級信息。

PHP擴展

PHP有兩種類型的擴展, 模塊擴展,如CURL,通常包裝外部API並通過新的PHP函數和PHP 引擎擴展來公開它們的功能。 雖然這種區別並非一成不變,但引擎擴展往往會與PHP的編譯器和執行引擎進行交互,盡管它們也可能會添加新的PHP函數。 ionCube是一個引擎擴展,它還為其API添加了PHP函數,也支持ionCube24,但也可以使用dl()安裝為模塊擴展。 兩種模塊都是共享庫,php.ini文件的一行用於向PHP添加擴展,PHP利用OS函數將庫動態鏈接到正在運行的進程。

PHP有內部鈎子,允許擴展來攔截源文件處理的編譯和執行階段。 擴展可能只是在常規處理之前或之后執行其他步驟,或完全替換常規處理。 ionCube Loader使用編譯鈎子在PHP引擎編譯之前檢查文件,如果它是ionCube文件,則接管處理文件的任務。 讀取ionCube文件或正常編譯的結果最終是字節碼,但是ionCube字節碼是非標准的,並且對於版本9,在初始處理文件之后,由於其他原因,它仍然可能被加密或不可用。 由於標准執行引擎無法處理ionCube字節碼,因此如果從ionCube編碼文件中讀取,則Loader還使用執行掛鈎來接管已編譯代碼的執行。 Loader的另一項任務是允許為某些較舊版本的PHP生成的文件在較新版本上運行,並且必要時Loader會對已編譯代碼執行快速轉換,以使其可在任何正在運行的PHP版本上使用。 PHP內部會不時發生顯着變化,最近一次,最重要的是在PHP 5和7之間,這使得這對於最終用戶體驗來說是一項具有挑戰性但卻很重要的任務。

處理ionCube文件不需要與外部服務器通信,但是從版本9開始,代碼可以使用加密密鑰進行保護,加密密鑰僅在PHP應用程序本身在運行時創建時才存在,並且應用程序開發人員可以編寫外部調用的PHP代碼。在需要時獲得用於構造解密密鑰的數據。

編碼文件

就文件本身而言,這種類型的早期PHP編碼工具實質上編譯為字節碼並將此表單直接序列化為文件。 一般來說,開發人員對PHP內部知識和興趣不大,這種方法提供了良好的保護和出色的性能。 當興趣首次出現在中國黑客組織生成的字節碼反編譯器中,稱為“藍風”時,2006年左右,簡單地編譯為字節碼顯然已不再可接受。 在不同程度上,諸如ionCube之類的工具在字節碼周圍添加了更多保護,從而妨礙了成功逆向工程的任務。 盡管可以采取措施來限制反編譯的有效性,即使字節碼恢復,代碼保護的成功仍然基本上取決於隱藏必要的解碼密鑰的能力,並且這種類型的所有編碼工具都存儲這樣的密鑰在編碼文件本身。

在為ionCube版本9開發代碼保護時,一個挑戰是解決存儲密鑰的限制,並且加密代碼而不任何地方靜態存儲必要的解密密鑰的能力是明顯且必要的下一步。 這被添加為名為“動態密鑰”的功能。

希望能夠深入了解ionCube以及某些方面類似工具的工作原理。 有關引擎擴展實現的更詳細知識,我建議查看PHP OpCache的源代碼以及Derick Rethans Xdebug。

披露:我與ionCube有關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM