為了保護 PHP 專案的核心業務邏輯不被直接閱讀,開發者常需對原始碼進行加密混淆。本文介紹一種基於 Base64 編碼與字元置換的輕量級加密方案,並提供完整的加密腳本實作,可生成可直接執行的加密 PHP 檔案。
file_get_contents() 獲取目標檔案內容$T_k1、$T_k2)對 Base64 字串進行字元級置換(strtr())eval() 結構中,運行時自動解密並執行<?php
/**
* PHP 原始碼加密工具
* 生成可直接執行的加密 PHP 檔案
*/
// 隨機字串生成器(作為置換密鑰)
function RandAbc($length = "") {
$str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
return str_shuffle($str);
}
// 目標檔案路徑
$filepath = 'index.php';
$path_parts = pathinfo($filepath);
$filename = $path_parts["basename"];
// 生成雙密鑰
$T_k1 = RandAbc(); // 密鑰1
$T_k2 = RandAbc(); // 密鑰2
// 讀取並加密
$vstr = file_get_contents($filename);
$v1 = base64_encode($vstr);
$c = strtr($v1, $T_k1, $T_k2); // 字元置換
// 組裝:密鑰1 + 密鑰2 + 加密內容
$c = $T_k1 . $T_k2 . $c;
// 構建解密執行代碼(經過多層編碼混淆)
$q1 = "O00O0O";
$q2 = "O0O000";
$q3 = "O0OO00";
$q4 = "OO0O00";
$q5 = "OO0000";
$q6 = "O00OO0";
$s = '$' . $q6 . '=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");';
$s .= '$' . $q1 . '=$' . $q6 . '{3}.$' . $q6 . '{6}.$' . $q6 . '{33}.$' . $q6 . '{30};';
$s .= '$' . $q3 . '=$' . $q6 . '{33}.$' . $q6 . '{10}.$' . $q6 . '{24}.$' . $q6 . '{10}.$' . $q6 . '{24};';
$s .= '$' . $q4 . '=$' . $q3 . '{0}.$' . $q6 . '{18}.$' . $q6 . '{3}.$' . $q3 . '{0}.$' . $q3 . '{1}.$' . $q6 . '{24};';
$s .= '$' . $q5 . '=$' . $q6 . '{7}.$' . $q6 . '{13};';
$s .= '$' . $q1 . '.=$' . $q6 . '{22}.$' . $q6 . '{36}.$' . $q6 . '{29}.$' . $q6 . '{26}.$' . $q6 . '{30}.$' . $q6 . '{32}.$' . $q6 . '{35}.$' . $q6 . '{26}.$' . $q6 . '{30};';
$s .= 'eval($' . $q1 . '("' . base64_encode('$' . $q2 . '="' . $c . '";eval(\'?>\'.$' . $q1 . '($' . $q3 . '($' . $q4 . '($' . $q2 . ',' . $q5 . '*2),$' . $q4 . '($' . $q2 . ',' . $q5 . ',' . $q5 . '),$' . $q4 . '($' . $q2 . ',0,' . $q5 . '))));') . '"));';
$s = '<?php ' . $s . ' ?>';
// 輸出加密後的檔案
echo $s;
// 寫入檔案
!is_dir('create/') && mkdir('create/');
$fpp1 = fopen('create/' . $filename, 'w');
fwrite($fpp1, $s) or die('寫檔案錯誤');
echo '加密成功!';
?>
加密後的檔案包含:
urldecode())strtr、base64_decode 等)eval() 執行解密後的原始碼<?php
// 加密檔案執行時的邏輯(簡化版)
$encoded = "雙密鑰 + Base64加密內容"; // 從檔案讀取
$k1 = substr($encoded, 0, 52); // 提取密鑰1
$k2 = substr($encoded, 52, 52); // 提取密鑰2
$payload = substr($encoded, 104); // 提取加密載荷
// 逆向置換
$base64 = strtr($payload, $k2, $k1);
// Base64 解碼
$code = base64_decode($base64);
// 執行原始碼
eval('?>' . $code);
?>
| 維度 | 評估 |
|---|---|
| 防逆向難度 | 低~中等(熟手可通過動態調試獲取解密後代碼) |
| 效能影響 | 每次請求需解密執行,有額外開銷 |
| 適用場景 | 簡單授權控制、非核心邏輯保護、學習研究 |
| 不適用場景 | 高安全需求、核心演算法、商業授權系統 |
.so / .dll 擴展,PHP 呼叫。