記錄一次PHP使用goto混淆加密的解密之旅

最近有朋友找我修復微擎一個模塊小程序的功能,接到文件瀏覽了一遍,原來是goto混淆,最後我是拒絕瞭解密。
這種加密方式已經不是第一次見了,以前也有很多人找我弄過這種,當時也嘗試過去還原,搗鼓了3天左右,不得不說這種加密看起來很簡單,其實還原起來非常喫力,第一次解密以失敗告終。後來遇到這種加密的單子也是直接拒絕了,因爲太難了,如果按照當時的見識和技術去研究的話,直到解密完成起碼要花1-2個月,而且解密這種文件頂多也就收四、五塊錢一個,所以沒有必要浪費這麼多時間去研究。
不過拒絕這個單子後回想,以前看過一些在線的解密,0.3-0.4元/kb,所以過後考慮一天,決定研究去解密。
講解goto加密之前先上幾張樣本圖:

經過研究,這種混淆器的混淆點和解決辦法主要分以下幾點:

if($code){
echo 'code';
}
//反向解密
if(!$code){
echo 'code';
}
$need_to _decode=true;
if($need_to _decode){
echo ‘需要解密,聯繫 qq 1837598906’;
}

單純的if語句:這種單一存在的語句在混淆器中處理後,其中的condition會被反向 也就是條件反向的處理,所以處理if語句前需要遍歷一次語法樹進行condition的反向還原,即de_cond

複雜的if語句:比如if…else…和if…elseif…else等,這種if語句的處理只需正常處理即可

解析elseif語法:如果當前節點的下一個節點爲if語法塊,則進行elseif的還原if 下一個節點也是爲 if 使用if-elseif拼接
解析else語法:如果遇到的混淆中間節點爲goto的,則認定爲else語句結束點並進行結束處理。
全部解密腳本用了一個多月的時間完成了!!!
暫時就寫這一步,待續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章