其實網上早就有人分析過這個了,而且寫成了工具、但是我測試了很多個,沒一個能用,所以決定自己從頭分析一遍。
打開神盾加密過后的源碼,可以看到這樣的代碼
上面寫著廣告注釋,而且不能刪除,因為文件末尾有個md5效驗碼,以驗證代碼是否被修改過,如圖、
再仔細看代碼部分,發現里面都是亂碼,其實這都是障眼法,
// 第一步 替換所有變量
// 第三步 替換所有不可顯示字符
// 寫到文件
function tolog($str) {
它利用了php變量擴充到 latin1 字符范圍,其變量匹配正則是 \$[a-zA-Z_\x7f-\xff][\w\x7f-\xff]* 這樣的格式。
這個前幾天天已經分析過了,最終也在官網找到了答案,請看《
<?php
$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);
file_put_contents("replace_log.txt", $str . "\n", FILE_APPEND);
}
?>