88
Php編程
Decrypt PHP's eval based encryption with debugger
概述
有很多 PHP 腳本的加密是通過把代碼進行字符串混淆後放入到eval中執行實現的,如 phpjiami、weevely 等。
無論什麼語言,對於此種加密的一個通用解法就是hook 執行函數,以 PHP 為例,eval 最終調用的是底層的zend_compile_string,隻需要提取出調用它時傳遞的參數就可以實現解密。
hook 的可以通過很多方式實現,比如編寫語言擴展、動態調試等。這裏所介紹的就是通過動態調試的方法提取函數參數。
2. 原理
Zend 虛擬機啟動時,會將compile_string賦值給zend_compile_string:
為了方便可直接將斷點下到compile_string函數上,跟進它看下函數定義:
參數source_string即為動態執行的代碼,類型為zval,zval定義如下:
所以在調試器中可以通過((*(zval *)source_string).value.str).val打印出代碼。
龔老板文章中還有提到phpjiami在解密的過程中還會校驗sapi_name:
在調試器環境下這些防護很容易搞定,直接對其賦值就好:
3. 具體實現
具體實現的代碼如下:
最後更新:2017-10-13 21:17:00