PHP Packer是一種通用的工具,可將PHP腳本進(jìn)行代碼轉(zhuǎn)換和壓縮,而這種轉(zhuǎn)換不會影響腳本本身的功能,同時(shí)還大大減少了腳本的大小。但有時(shí)候,我們需要將已經(jīng)壓縮的PHP腳本解壓縮,進(jìn)行分析和調(diào)試。本文將介紹如何解壓PHP Packer壓縮的文件,同時(shí)伴隨著詳細(xì)的代碼說明和舉例。
首先,了解一下PHP Packer的原理,PHP Packer生成的壓縮包一般是包含了兩部分內(nèi)容:第一部分是解碼函數(shù),主要負(fù)責(zé)對第二部分加密的PHP腳本進(jìn)行解密;第二部分是加密的PHP腳本。那么如何解壓PHP Packer打包成的文件呢?
解壓PHP Packer打包成的文件,其實(shí)就是執(zhí)行第一部分解碼函數(shù),將第二部分的加密的PHP腳本進(jìn)行解密。解碼函數(shù)通常都是固定的,我們通過查找反混淆的手法,可以找到解碼函數(shù)的具體位置,手工將函數(shù)提取成一個(gè)獨(dú)立的PHP文件。例如,下面這個(gè)PHP Packer壓縮的腳本:
其中,eval()函數(shù)中的一串Base64編碼的字符就是加密的PHP腳本,那么我們需要將這段加密的PHP腳本解密出來。在這種情況下,我們需要首先將加密的PHP腳本解密成明文,然后再將明文通過eval()函數(shù)進(jìn)行執(zhí)行。
解密加密的PHP腳本,可以通過以下代碼實(shí)現(xiàn):
其中,$packed變量中是第二部分加密的PHP腳本。我們首先使用base64_decode()函數(shù)將Base64編碼的字符串解碼成原始的二進(jìn)制數(shù)據(jù),而后再使用gzinflate()函數(shù)將二進(jìn)制數(shù)據(jù)解壓為明文PHP代碼。
下面,我們舉一個(gè)示例,演示如何解壓一個(gè)PHP Packer打包的腳本:
其中,decode()函數(shù)就是PHP Packer的解碼函數(shù),通過解碼函數(shù)可以將加密的PHP腳本轉(zhuǎn)換成明文PHP腳本。函數(shù)中使用preg_replace()函數(shù),將\x和\\兩種形式的轉(zhuǎn)義字符解碼成二進(jìn)制數(shù)據(jù),并使用myeval()函數(shù)執(zhí)行所有的eval()函數(shù),最后輸出解密后的PHP腳本。
總之,PHP Packer雖然可以有效地保護(hù)PHP代碼的安全,但在需要調(diào)試或進(jìn)行分析時(shí),需要使用解碼函數(shù)將加密的PHP腳本解密出來。本文簡單介紹了如何使用PHP代碼將加密的 PHP腳本解密出來。
首先,了解一下PHP Packer的原理,PHP Packer生成的壓縮包一般是包含了兩部分內(nèi)容:第一部分是解碼函數(shù),主要負(fù)責(zé)對第二部分加密的PHP腳本進(jìn)行解密;第二部分是加密的PHP腳本。那么如何解壓PHP Packer打包成的文件呢?
解壓PHP Packer打包成的文件,其實(shí)就是執(zhí)行第一部分解碼函數(shù),將第二部分的加密的PHP腳本進(jìn)行解密。解碼函數(shù)通常都是固定的,我們通過查找反混淆的手法,可以找到解碼函數(shù)的具體位置,手工將函數(shù)提取成一個(gè)獨(dú)立的PHP文件。例如,下面這個(gè)PHP Packer壓縮的腳本:
eval(gzinflate(base64_decode('HrMNas ... ')));
其中,eval()函數(shù)中的一串Base64編碼的字符就是加密的PHP腳本,那么我們需要將這段加密的PHP腳本解密出來。在這種情況下,我們需要首先將加密的PHP腳本解密成明文,然后再將明文通過eval()函數(shù)進(jìn)行執(zhí)行。
解密加密的PHP腳本,可以通過以下代碼實(shí)現(xiàn):
$packed = 'HrMNas ...'; $code = gzinflate(base64_decode($packed)); eval($code);
其中,$packed變量中是第二部分加密的PHP腳本。我們首先使用base64_decode()函數(shù)將Base64編碼的字符串解碼成原始的二進(jìn)制數(shù)據(jù),而后再使用gzinflate()函數(shù)將二進(jìn)制數(shù)據(jù)解壓為明文PHP代碼。
下面,我們舉一個(gè)示例,演示如何解壓一個(gè)PHP Packer打包的腳本:
function myeval($code){ return eval($code); } <br> function decode($packed){ $code = gzinflate(base64_decode($packed)); $code = preg_replace(array('{\\\x([0-9a-fA-F]{2})}', '{\\\([0-7]{3})}'), array('chr(hexdec("$1"))', 'chr(octdec("$1"))'), $code); <br> if (strpos($code, 'eval(') !== false){ $code = preg_replace_callback('#eval\((.*)\)#i', function($m){ $packed = $m[1]; $packed = strtr($packed, array('\\\\' => '\\')); return 'myeval(decode("'.$packed.'"))'; }, $code); } return $code; } <br> $packed = 'HrMNas ...'; echo decode($packed);
其中,decode()函數(shù)就是PHP Packer的解碼函數(shù),通過解碼函數(shù)可以將加密的PHP腳本轉(zhuǎn)換成明文PHP腳本。函數(shù)中使用preg_replace()函數(shù),將\x和\\兩種形式的轉(zhuǎn)義字符解碼成二進(jìn)制數(shù)據(jù),并使用myeval()函數(shù)執(zhí)行所有的eval()函數(shù),最后輸出解密后的PHP腳本。
總之,PHP Packer雖然可以有效地保護(hù)PHP代碼的安全,但在需要調(diào)試或進(jìn)行分析時(shí),需要使用解碼函數(shù)將加密的PHP腳本解密出來。本文簡單介紹了如何使用PHP代碼將加密的 PHP腳本解密出來。