破解2C(goto混淆)解密之旅

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

在這裏插入圖片描述

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

if($code){
echo 'code';
}
//反向解密
if(!$code){
echo 'code';
}

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

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

解析elseif語法:如果當前節點的下一個節點爲if語法塊,則進行elseif的還原if 下一個節點也是爲 if 使用if-elseif拼接

//加密混淆代碼
goto ZLIN5; xuT32: GkJl9: goto z0Q1l; qz2Od: echo "\347\254\xac\xe4\xba\214\344\xb8\xaa\151\146"; goto bm5cx; bm5cx: iMbaq: goto wnxep; RqBXL: if ($LDzsz == "\x31") { goto GkJl9; } goto Qx9cj; ogKCJ: goto iMbaq; goto xuT32; Qx9cj: if ($LDzsz == "\62") { goto ol5jq; } goto ogKCJ; BGe9N: ol5jq: goto qz2Od; ZLIN5: echo "\350\277\231\344\270\xaa\346\x98\xaf\151\146\55\145\x6c\x73\145\x69\x66\350\212\x82\347\202\xb9"; goto RqBXL; z0Q1l: echo "\351\234\200\xe8\xa6\x81\xe8\247\xa3\345\xaf\206\357\274\x9a\x31\x38\x33\x37\x35\71\x38\x39\x30\x36"; goto WJ2fG; WJ2fG: goto iMbaq; goto BGe9N; wnxep: echo "\x65\156\144";
//解密後代碼
echo '這個是if-elseif節點';
if($code == '1'){
	echo '需要解密:1837598906';
}elseif($code == '2'){
	echo  '第二個if';
}
echo 'end';

解析else語法:如果遇到的混淆中間節點爲goto的,則認定爲else語句結束點並進行結束處理。
全部解密腳本用了一個多月的時間完成了!!!
暫時就寫這一步,待續

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