我們來做第一步解密處理吧。
PS: 這只是我的解密思路,與大家分享一下,也許你有更好的方法還望分享
$str = file_get_contents("1.php");
// 第一步 替換所有變量
// 正則 \$[a-zA-Z_\x7f-\xff][\w\x7f-\xff]*
preg_match_all('|\$[a-zA-Z_\x7f-\xff][\w\x7f-\xff]*|', $str, $params) or die('err 0.');
$params = array_unique($params[0]); // 去重復
$replace = array();
$i = 1;
foreach ($params as $v) {
$replace[] = '$p' . $i;
tolog($v . ' => $p' . $i); // 記錄到日志
$i++;
}
$str = str_replace($params, $replace, $str);
// 第二步 替換所有函數名
// 正則 function ([a-zA-Z_\x7f-\xff][\w\x7f-\xff]*)
preg_match_all('|function ([a-zA-Z_\x7f-\xff][\w\x7f-\xff]*)|', $str, $params) or die('err 0.');
$params = array_unique($params[1]); // 去重復
$replace = array();
$i = 1;
foreach ($params as $v) {
$replace[] = 'fun' . $i;
tolog($v . ' => fun' . $i); // 記錄到日志
$i++;
}
$str = str_replace($params, $replace, $str);
// 第三步 替換所有不可顯示字符
function tohex($m) {
$p = urlencode($m[0]); // 把所有不可見字符都轉換為16進制、
$p = str_replace('%', '\x', $p);
$p = str_replace('+', ' ', $p); // urlencode 會吧 空格轉換為 +
return $p;
}
$str = preg_replace_callback('|[\x00-\x08\x0e-\x1f\x7f-\xff]|s', "tohex", $str);
// 寫到文件
file_put_contents("1_t1.php", $str);
function tolog($str) {
file_put_contents("replace_log.txt", $str . "\n", FILE_APPEND);
}
?>
(其中有一個記錄到日志的代碼,這個在之后的二次解密時有用。)
執行之后就會得到一個 1_t1.php 文件,打開文件看到類似這樣的代碼
找個工具格式化一下,我用的 phpstorm 自帶了格式化功能,然后代碼就清晰很多了。
進一步整理后得到如下代碼