閱讀88 返回首頁    go 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

  上一篇:go PHP是最好的語言
  下一篇:go 九張圖讀懂 PHP、Python、Ruby 三大語言的差異