forked from sostuts/mcypt
-
Notifications
You must be signed in to change notification settings - Fork 0
/
mcrypt.php
348 lines (293 loc) · 8.73 KB
/
mcrypt.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
<?php
/*
________ _______ ________ ________ _______ _______
|\_____ \ |\ ___ \ |\ _____\ |\ _____\ |\ ___ \ |\ ___ \
\|___/ /| \ \ __/| \ \ \__/ \ \ \__/ \ \ __/| \ \ __/|
/ / / \ \ \_|/__ \ \ __\ \ \ __\ \ \ \_|/__ \ \ \_|/__
/ /_/__ \ \ \_|\ \ \ \ \_| \ \ \_| \ \ \_|\ \ \ \ \_|\ \
|\________\ \ \_______\ \ \__\ \ \__\ \ \_______\ \ \_______\
\|_______| \|_______| \|__| \|__| \|_______| \|_______|
*/
/**
* ==========================================================
*
* @author www.zeffee.com
* @date 2015-12-11
* @version 2.0
*
* @var string $sourcefile 源码文件名
* @var string $resultfile 密文文件名(自动新建)
* @var int $mode 加密模式 0 => 简单模式(无法阅读)
* 1 => 严格模式(无法想象)
*
*/
$sourcefile="source.php";
$resultfile="output.php";
$mode = 0;
/*
* 注意: 1. 可以有注释内容,但除了注释内容,其他内容请勿加入 "//" 和 "#" (特别留意正则),否则加密后无法运行。
* 2. 此版本支持加密PHP与html混合的PHP文件。但符合以下条件的将会出错。
--如果一个PHP代码段调用了另一个PHP代码段的变量,函数等等将会出错。
--如果有两个PHP代码断完全一模一样将会出错。
*
*
===========================Mcrypt Class=================================
*/
/**
* class Mcrypt 加密类
* @author www.zeffee.com
* @date 2015-12-11
* @version 2.0
*
*/
class Mcrypt
{
/**
*===========================================
*function Getsource 获取源码
*===========================================
*
* @param string $sourcefile 源码文件路径
* @return string 源码
*
*/
public function Getsource($sourcefile)
{
if(!$sourcefile){exit("Please input the sourcefile!");}
$fp=fopen($sourcefile, "r");
$text="";
while(!feof($fp))
{
$text.=fgets($fp);
}
fclose($fp);
return $text;
}
/**
*========================================
*function Getphp 获取PHP代码
*========================================
*
* @param string $text 源码
* @return array 所有PHP代码内容
*
*/
public function Getphp($text)
{
$matchres=array();
//判断是否有完整的开始结束符并取PHP代码
if(preg_match_all('/(<\?php|<\?)(.*)\?>/ismU', $text, $matchres))
{
if($matchres[2])
{
$matchres=$matchres[2];
}
}
else
{
preg_match_all('/(<\?php|<\?)(.*)/ism', $text, $matchres);
$matchres=$matchres[2];
}
return $matchres;
}
/**
*========================================
*function Ttext 去掉注释、换行
*========================================
*
* @param string $text 源码
* @return string 处理之后文本
*
*/
public function Ttext($text)
{
return preg_replace(array("/([^:]\/\/| #)[^\n]*/","/[\n\r]/"), array("",""), $text);
}
/**
*=====================================
*function Change 混淆ascii
*=====================================
*
* @param string $con 源码内容
* @param int $function 0-->只是混淆变量名
* 1-->加上要混淆函数名
* @param string $deviation 偏移量(仅在function为1时候调用,为了防止出现重复的名字)
*
* @return string 返回混淆后的内容
*
*/
public function Change($con,$function=0,$deviation=""){
//变量名混淆
//匹配所有变量名
preg_match_all('/\$[a-z0-9][a-z0-9_]*/i', $con,$out);
//过滤重复变量名
$arr=array();
foreach ($out[0] as $key0 => $value0) {
if(! in_array($value0, $arr))
$arr[]=$value0;
}
//开始混淆
foreach ($arr as $key => $value) {
$value=substr($value, 1);
if($value=="this")
continue;
$con=preg_replace(array('/\$'.$value.'/','/->'.$value.'/'),array("\$".chr(135+$key).chr(155+$key),"->".chr(135+$key).chr(155+$key)), $con);
}
//函数名混淆
if($function==1)
{
//匹配
if(preg_match_all('/function.([^(]*)/i', $con,$out1))
{
//过滤重复
$arr=array();
foreach ($out1[1] as $key1 => $value1) {
if(! in_array($value1, $arr))
$arr[]=$value1;
}
//开始混淆
foreach ($arr as $key2 => $value2) {
$con=preg_replace('/'.$value2.'/', chr(136+$key+$key2).chr(168+$key+$key2).$deviation, $con);
}
}
}
return " ".$con." ";
}
/**
*=============================================
*function Doublemcrypt 多层加密
*=============================================
*
* @param string $text 源码或者一层加密之后的内容
* @param string $deviaction函数Change偏移量
* @return string 返回加密后的内容
*
*/
public function Doublemcrypt($text,$deviation="")
{
//自定义密钥(英文或者字母) 不得超过32位
$bosskey=md5("this_is_a_key".date("YmdHis"));
//第一层des
$text=$this->Des($text,$bosskey);
$text="('".addcslashes($text,'\'\\')."',".chr(200).chr(205)."));";
//混淆处理
$head='if(!defined("WWW_ZEFFEE_COM")){define("'.chr(200).chr(205).'","'.$bosskey.'");function OO00($a){return gzinflate($a);}function O00O($b){$O000="p"."r"."e"."g"."_"."r"."e"."p"."l"."a"."c"."e";$O000("/ee/e","@".str_rot13("riny").\'($b)\', "ee");}function OO0O($c,$d){return mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $d, $c, MCRYPT_MODE_ECB);}OO00("'.gzdeflate("W_W_W.Z_E_F_F_E_E.C_O_M").'");O00O(OO0O';
$head=$this->Change($head,1,$deviation); //混淆所有名字
//整合数据
$head.=$text.'}';
$text=$head;
//第二层base
return ' eval(base64_decode("'.$this->Base($text).'")); ';
}
/**
*======================================
*function Des DES加密
*======================================
*
* @param string $data 源码
* @param string $key 加密的密钥
* @return string 加密内容
*
*/
public function Des($data,$key)
{
return mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_ECB);
}
/**
*======================================
*function Base BASE加密
*======================================
*
* @param string $data 源码
* @return string 加密内容
*
*/
public function Base($data)
{
return base64_encode($data);
}
/**
*=======================================
*function Mark 标记PHP代码断
*=======================================
*
* @param string $arrayphp php代码段源码
* @param string $alltext 全部源码
* @return string 标记之后代码
*
*/
public function Mark($arrayphp,$alltext)
{
foreach ($arrayphp as $keymark => $valuemark) {
$alltext=str_replace($valuemark, " ".$keymark.$valuemark, $alltext);
}
return $alltext;
}
/**
*=======================================
*function Mark 替换为密文
*=======================================
*
* @param string $arrayphp php代码段源码
* @param string $alltext 全部源码
* @return string 加密之后的代码
*
*/
public function Replace_Mrypt_Code($arrayphp,$alltext,$mode)
{
foreach ($arrayphp as $keymat => $valuemat)
{
//判断模式
if($mode==1)
{
$alltext=str_replace($keymat.$valuemat, $this->Doublemcrypt($this->Change($valuemat),$keymat), $alltext);
}
else
{
$alltext=str_replace($keymat.$valuemat, $this->Change($valuemat), $alltext);
}
}
return $alltext;
}
/**
*======================================
*function Infile 写入文件
*======================================
*
* @param string $resultfile 输出文件的路径
* @param string $text 加密后的代码
*
*/
public function Infile($resultfile,$text)
{
$file=fopen($resultfile, "w");
fwrite($file, $text);
fclose($file);
echo "Done!<br/>File Path:".$resultfile;
}
public function __construct()
{
error_reporting(E_ALL||~E_NOTICE);
}
}
/*
=========================End Class=================================
*/
foreach ($sourcefile as $key => $value) {
$mcypt=new Mcrypt();
//获取源码
$alltext=$mcypt->Getsource($value);
//去掉注释、换行
$alltext=$mcypt->Ttext($alltext);
//获取PHP代码
$arrayphp=$mcypt->Getphp($alltext);
//给PHP代码段添加标识符
$alltext=$mcypt->Mark($arrayphp,$alltext);
//替换成加密的代码
$alltext=$mcypt->Replace_Mrypt_Code($arrayphp,$alltext,$mode);
//转换成utf8编码
$alltext=mb_convert_encoding($alltext,"UTF-8","auto");
//写入文件
$mcypt->Infile($resultfile[$key],$alltext);
}
?>