PHP混淆加密码工具记录
找了很久大概是找到了,记录一下。
QQ群:397745473
1 | 参考: |
混淆原理
上传了几段PHP代码进行混淆,对比一下混淆前后的代码,大致可以推测出混淆的思路:
- 收集代码中所有的函数名、变量名、字符和数值常量,整理成一个Array,这里我就命名为
var_list
; - 生成一小段随机字符
str_separater
,通过implode
函数把var_list
里的所有项连接成为一个很长的字符串str_obfus
,各项之间使用str_separater
连接; - 把
var_list
保存在$GLOBALS
、$_SERVER
或$_GET
之类的超全局变量中,所用的key(我命名为var_key
)为一串不可读随机字符,于是$GLOBALS{var_key} = var_list = explode(str_separater, str_obfus);
代码中原先可读的函数名,变量名,常量数值都被转化成了$GLOBALS{var_key}[hex_id]
的形式; - 在每一个函数的实现代码段中,采用一个局部变量
$xxx
指向$GLOBAL{var_key}
,局部变量$xxx
的变量名通常也是一串不可读随机字符; 这样,在函数实现代码段中,函数名,变量名,常量数值等被转化成了$xxx[hex_id]
的形式,而不再是$GLOBALS{var_key}[hex_id]
的形式。然后,函数实现代码段中的所有其它局部变量名都被转化成随机不可读字符串; - 还有,代码中所有的
true
转化为!0
,所有的false
转化为!1
; - 此外,代码中随机添加一些不可读随机字符组成的最后以“;”结尾的行,PHP在执行到这行时只会报告“未定义过的常量”错误,不影响原有代码逻辑的执行。在代码最前面添加
error_reporting(E_ALL^E_NOTICE);
防止报错停止PHP的执行; - 再是,代码头部添加
define(var_key, '随机字符串');
,估计是防止后面的$GLOBALS{var_key}
报出变量未定义的错误; - 最后,去除所有的换行符。加上mzphp2的注释(可选)。
最终,原来的可读代码变成一堆天书。
QQ群:397745473