方式一:
| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 | <?php/*** Created by PhpStorm.* User: Yang* Date: 2019/10/16* Time: 10:25*/ class Encipher { private $_sourceFile = '';private $_encodedFile = '';private $_comments = array('Author: Yang','Email: 1017836267@qq.com'); public function __construct($sourceFile, $encodeFile, $comments = array()){!empty($sourceFile) && $this->_sourceFile = $sourceFile;!empty($encodeFile) && $this->_encodedFile = $encodeFile;!empty($comments) && $this->comments = (array)$comments; if (empty($this->_sourceFile) || !file_exists($this->_sourceFile)) {exit("Source file does not exist.");}if (empty($this->_encodedFile) || !file_exists($this->_encodedFile)) {//如果源文件不存在,则创建fopen($this->_encodedFile, "w");}} /*** 返回随机字符串* @return string*/private function createRandKey(){ // 返回随机字符串$str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";return str_shuffle($str);} /*** 加密函数* @return bool*/public function encode() {//随机密匙1$k1 = $this->createRandKey();//随机密匙2$k2 = $this->createRandKey();// 获取源文件内容$sourceContent = file_get_contents($this->_sourceFile);//base64加密$base64 $headers) . "\r\n" . $prefixCode), $enkey, $dekey);$evalEmbedCode = $this->_getEvalEmbedCode($decodeCodeOfHostedCode, $regVars, $enkey, $dekey);/*** eval(base64_decode(* str_replace("\$hookKey", '', strtr($hookKey.$evalEmbedCode, $dekey, $enkey))* ));* $unset;*/$unset = 'unset(' . $funcStrVar;foreach ($regVars as $var) {$unset .= ',' . $var;}$unset .= ');';$evalCode = "@eval(" . $regVars["base64_decode"] . "(" . $regVars["str_replace"] . "(" . $regVars["\$hookKey"] . ",''," . $regVars["strtr"] . "('" . $hookKey . $evalEmbedCode . "','" . $dekey . "','" . $enkey . "'))));" . $unset;$originalEncodedCode = $this->_getPHPEncode($file, $enkey, $dekey);$enCode = implode("\r\n", $headers) . "\r\n" . $prefixCode . $evalCode . "return;?>\r\n" . $originalEncodedCode;$this->_saveEncryptFile($file, $enCode, $enkey, $dekey);} /*** The encoded code needs extra code*/private function _getBaseCodeOfHostedCode(){$code = <<<EOT\$farrs = file(str_replace('\\\\', '/', __FILE__));\$enCode = array_pop(\$farrs);\$phpCode = array_pop(\$farrs);\$fstrs = implode('', \$farrs) . substr(\$phpCode, 0, strrpos(\$phpCode, '@ev'));\$hookKey = md5(\$fstrs);\$farrs = \$phpCode = \$fstrs = NULL;EOT;return $code;} /*** The encoded code needs decode code* if the licence is generated, also need to process it.*/private function _getDecodeCodeOfHostedCode($file, $enkey, $dekey){$code = <<<EOTeval(base64_decode(strtr(\$enCode, '{$dekey}', '{$enkey}')));\$enCode = NULL;EOT;return $code;} private function _getFuncVarDefCode($usedFuncMaps, $funcChars, $funcStrVar){//all the chars of function name$funcStr = implode("", $funcChars); //set variable name's value for each variable of function name$funcVarValArr = $this->_getFuncVarvalArr($usedFuncMaps, $funcChars, $funcStrVar); //encoded code define function name string.$code = $funcStrVar . "='{$funcStr}';";foreach ($usedFuncMaps as $func => $val) {$code .= $val . "= " . $funcVarValArr[$func] . ";\n";}return $code;} private function _getEvalEmbedCode($decodeCodeOfHostedCode, $regVars, $enkey, $dekey){$code = preg_replace("/\r|\n/is", "", strtr($decodeCodeOfHostedCode, $regVars));//replace multi space to one, and encode it via base64$code = base64_encode(preg_replace("/\s{2,}/is", " ", $code));$code = strtr($code, $enkey, $dekey);return $code;} /*** get function names and chars for all functions*/private function _getMatchedFunctions($code){//match all function namepreg_match_all("/([a-z_0-9]+)\(/is", $code, $matches);$usedFuncs = array_unique($matches[1]);if (false !== ($key = array_search('eval', $usedFuncs))) {unset($usedFuncs[$key]);} $funcChars = array_unique(preg_split("//is", implode("", $usedFuncs), -1, PREG_SPLIT_NO_EMPTY));shuffle($funcChars);return array(array_flip($usedFuncs), $funcChars);} /*** get variable names*/private function _getMatchedVariables($code){preg_match_all("/(\\\$[a-z0-9]+)\s*\=/is", $code, $matches);return array_flip($matches[1]);} private function _getFuncVarvalArr($usedFuncMaps, $funcChars, $funcStrVar){$funcVarValArr = array();foreach ($usedFuncMaps as $func => $_val) {$val = "";for ($i = 0, $len = strlen($func); $i < $len; $i++) {if ($val == "") {$val = $funcStrVar . "{" . array_search($func{$i}, $funcChars) . "}";} else {$val = $val . "." . $funcStrVar . "{" . array_search($func{$i}, $funcChars) . "}";}}$funcVarValArr[$func] = $val;}return $funcVarValArr;} /*** get php pure code, trim php tag*/private function _getPHPCode($file){$from = $this->source_file . '/' . $file;$str = file_get_contents($from);$str = preg_replace("/^[\s\xef\xbb\xbf]*<\?php/is", "", $str);$str = trim(preg_replace("/\?>\s*$/is", "", $str));return $str;} /*** get php encoded code*/private function _getPHPEncode($file, $enkey, $dekey){$code = $this->_getPHPCode($file);$enCode = strtr(base64_encode($code), $enkey, $dekey);return $enCode;} private function _getKeyPairs(){$enkey = $this->_getKeyStr();$dekey = $this->_getKeyStr();while ($enkey === $dekey) {$dekey = $this->_getKeyStr();}return array($enkey, $dekey);} private function _getKeyStr(){$base64str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';for ($i = 127; $i <= 160; $i++) {$base64str .= chr($i);}$baseChars = array_filter(preg_split("//is", $base64str));$baseChars[] = 0;shuffle($baseChars);return implode("", $baseChars);} private function _setVarName($funcs, $filter = array()){$length = $this->varnameLength;$basestr = $this->_getInvisibleStr($length);$count = count($funcs);if ($count == 0) {return array();}$varArr = array();do {$randStr = substr("\$" . str_shuffle($basestr), 0, rand(2, $length));if (!in_array($randStr, $varArr) && !in_array($randStr, $filter)) {$varArr[] = $randStr;$count--;}} while ($count > 0);return array_combine(array_keys($funcs), $varArr);} /*** legal variable names: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'* Invisiable string's ascii is from 127 to 255:'[\x7f-\xff][\x7f-\xff]*'* param $length the variable name's length.*/private function _getInvisibleStr($length = 10){$str = '';for ($i = 0; $i < $length; $i++) {$num = rand(127, 255);$str .= chr($num);}return $str;} private function _saveEncryptFile($file, $enCode, $enkey = null, $dekey = null){$to = $this->encoded_file . '/' . $file;file_put_contents($to, $enCode);echo $to . "\n";}} |
