zend反編譯-dezender 使用

網上找了一圈,各種名字的zend反編譯軟件,核心就是 40,960 字節 的 php.exe。

當時我是從 mmscn.org 上下載到的。論壇上說,php.exe 原創就是 mmscn.org,後來被俄國人偷去了,改名換姓,說是俄國人首發的。作者說的:

原理其實比較簡單,網上也有很多介紹。

主要是在php源代碼的基礎上,在zend_execute_scripts函數中,zend_compile_file與zend_execute之間插入我們的函數,然後把EG(active_op_array)解密並且反編譯成源代碼。當然,這項工作是比較繁雜的。因爲zend optimizer對這個指令數組處理過(主要是優化和加密),並且我們只能通過php源代碼和測試案例推測它的處理規律。


 

php.exe 讀入zend 過的 php 文件,經過處理,還原出了源碼,但是如果 文件 在zend加密的時候選擇了變量、函數、類名 混淆,那麼php.exe得到的就是混淆後的名字,一般都是亂碼(含有回車、換行等字符),php.exe 爲了讓還原後的代碼可視化,統一把那些混淆的名字進行了base64_encode 處理,處理後的名字有三個字符:= + / 不符合php變量名規範,於是把 = 替換成 \xFF ,把 / 替換成 \x7F ,把 + 替換成 _ 。 大家用winhex 打開 dezend後的文件,就會看到這3個字符。

----------------
 

config.ini 的原理:

Zend Engine v2.3.0 之前 函數、類、變量的混淆函數算法 是固定的。所以在 config.ini 裏放入一些 php的內部函數等字符串, php.exe 執行的時候,從 config.ini 讀取這些字符串,然後按照混淆算法處理,得到了其對應的混淆後的值; php.exe 在反編譯理的時候,得到了一個混淆的名字,就可以對應找出其 明文。 這跟其他的字典破解密碼的方法一樣。


 

上面是我猜測的,當時在論壇沒有看到這方面的說法。 爲了驗證這點,我把 header 從config.ini 裏刪掉,然後反編譯,文件裏對應 header 的位置變成了 _obfuscate_d1x0cApj ,再加回去,再反編譯一次,對應位置又變成了 header 。經過測試, config.ini 裏的字串大小些沒有影響,字串Header,反編譯後文件裏對應位置是 Header ;字串是 header,dezend文件裏對應位置就是 header。
 

所以收集到的 config.ini 裏的字符串越多, 反編譯出來的 源碼裏的 _obfuscate_ 名字就會越少。

----------------

Mr.Dezend 那個 GUI 在解單個文件時,挺好的,但是如果文件夾裏文件數較多時,他就不能列出文件來,待解文件裏就一片空白。 用 php 寫個程序,遍歷全部文件,然後調用php.exe命令行來dezend。

  1. system("d:/dezend/php.exe $file /i /f /tab /stack:160 /string:40960 /level:10-1 /config:d:\\dezend\\config.ini");  

/i /f 2個參數一起用,纔會讀入 config.ini。 說明文檔裏沒有,我是用 文件監視器,監視php.exe運行時,配上不同參數,最後發現加上這 2個參數時, php.exe纔讀取了 config.ini。

----------------

關於怎麼得到更多 config.ini 裏字串的一個想法:

1、把 反編譯後文件裏 _obfuscate_ 這樣的字串提取出來

2、把 混淆算法弄成 exe文件,輸入一個 字符串文件,每行一個字符,然後程序把混淆後的值跟 我們要求解的進行對比,纔有窮舉的辦法。

3、這樣似乎沒什麼必要,有那麼個力氣,自己去改個變量名就足夠了。
----------------

作者還說:

據我所知,Zend提供的混淆函數(zend_obfuscate_class_name)有Bug,不是嚴格的一一對應,也就是說不同的函數名混淆後的名字可能是相同的,我就發現一個。這個文件可能就是這個問題,php說有函數重定義,編譯階段就停止了,反編譯就進行不了了。

要是人爲了製造這樣的情況,那麼處理後的文件,目前流出來的這個php.exe 就不能被反編譯了。 黑刀 提供php的防反編譯服務,說是把源碼給他,經他處理後,就可以防止被反編譯了,不知道是不是利用的這個原理。 

 
  1. header( "content-type:text/html;charset=UTF-8" );  
  2. session_start( );  
  3. set_time_limit( 0 );  
  4. error_reporting( E_ALL ^ E_NOTICE );  
  5.  
  6. [exception occured]  
  7.  
  8. ================================  
  9. Exception code[ C0000005 ]  
  10. Compiler[ 009A2DA0 ]  
  11. Executor[ 009A2820 ]  
  12. OpArray[ 00AABEB8 ]  
  13. File< E:\index.php > 
  14. Class< main > 
  15. Function< main > 
  16. Stack[ 00145AD0 ]  
  17. Step[ 7 ]  
  18. Offset[ 17 ]  
  19. LastOffset[ 284 ]  
  20.     17  ADD                          [-]   0[0] $Tmp_4 - $Tmp_1 - $Tmp_6 
如果加上 /r 參數,可以看到 raw op code ,就是純執行流程,雖然不能還原源碼,但是可以看到一些算法。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章