木马查杀篇—Opcode提取

news2025/7/19 13:29:39

【前言】 介绍Opcode的提取方法,并探讨多种机器学习算法在Webshell检测中的应用,理解如何在实际项目中应用Opcode进行高效的Webshell检测。

Ⅰ 基本概念

Opcode:计算机指令的一部分,也叫字节码,一个php文件可以抽取出一个指令序列,如ADD、ECHO、RETURN。
【原因】由于直接对php文件使用词袋和TF-IDF进行模型训练会消耗大量计算资源,使用opcode模型进行降维可以有效提升模型效率和模型的准确率。
【作用】避免Webshell中为了绕开静态检测恶意添加的无用注释的干扰

Ⅱ Opcode提取

【背景】php版本72,路径/www/server/php/72/bin
安装地址:https://pecl.php.net/package/vld 官网下载对应的vld版本

安装脚本

cd vld-0.15.0
# 使用phpize生成配置脚本,并指定php-config路径(与你的 PHP 路径相关 )
/www/server/php/72/bin/phpize
./configure --with-php-config=/www/server/php/72/bin/php-config --enable-vld
# 编译
make && make install
#可看到一个so文件
/opt/vld-0.15.0/vld-0.15.0/modules/vld.so

# php.ini文件添加
extension=vld.so

# 重启php服务
systemctl restart php7.2

测试 111.php

<?php
    echo "Hello World";
?>

查看php文件的Opcode

php -dvld.active=1 -dvld.execute=0  111.php

效果如下,op值就是了,直接提取下来
在这里插入图片描述

Ⅲ 训练过程

提取opcode很简单,就是采用什么模型训练,才能尽可能提高召回率和准确率

第一种:朴素贝叶斯

特征提取使用词袋&TF-IDF模型

  • 将 WebShell 样本以及常见 PHP 开源软件的文件提取词袋。
  • 使用 TF-IDF 处理。
  • 随机划分为训练集和测试集。
  • 使用朴素贝叶斯算法在训练集上训练,获得模型数据。
  • 使用模型数据在测试集上进行预测。
  • 验证朴素贝叶斯算法预测效果。
    在这里插入图片描述

第二种:使用MLP算法

特征提取使用特征提取使用opcode&n-gram

完整的处理流程为

  • 将 WebShell 样本以及常见 PHP 开源软件的文件提取 opcode.
  • 使用 n-gram 处理。
  • 随机划分为训练集和测试集。
  • 使用 MLP 算法在训练集上训练,获得模型数据。
  • 使用模型数据在测试集上进行预测。
  • 验证 MLP 算法预测效果。

第三种:CNN模型训练

还未实现

Ⅳ 实战环节

def extract_opcodes(filepath: str, php_executable: str = 'php') -> Optional[str]:
    """
    使用vld扩展从文件中提取PHP opcodes,适配详细输出格式。

    Args:
        filepath: PHP文件的路径。
        php_executable: PHP可执行文件的路径。

    Returns:
        如果成功,返回一个包含opcode的空格分隔字符串,否则返回None。
    """
    if not os.path.exists(filepath):
        logger.error(f"文件未找到用于opcode提取: {filepath}")
        return None

    cmd = [
        php_executable,
        '-dvld.active=1',
        '-dvld.execute=0',
        filepath
    ]
    logger.debug(f"运行命令用于opcode提取: {' '.join(cmd)}")

    try:
        # --- 正确的提取逻辑,用于解析表格 ---
        output = subprocess.check_output(
            cmd, 
            stderr=subprocess.STDOUT
        )
        output_str = output.decode('utf-8', errors='ignore') # 使用 utf-8 解码,忽略可能的解码错误
       
        
        tokens = re.findall(r'\s(\b[A-Z_]+\b)\s', output_str)
        opcodes = " ".join(tokens)
        # --- 提取逻辑结束 ---

        if not opcodes:
             # 即使命令成功,也可能因为文件内容或VLD的特殊输出而没有Opcode
            #  logger.warning(f"未从 {filepath} 提取到有效格式的Opcode。VLD输出起始部分: {result.stdout[:300]}...")
             return ""
        print("|==============文件{}提取出来的opcode:{}".format(filepath,opcodes))
        return opcodes

    except FileNotFoundError:
        logger.error(f"'{php_executable}'命令未找到。无法提取opcode。")
        return None
    except subprocess.TimeoutExpired:
        logger.warning(f"Opcode提取超时于{filepath}。跳过。")
        return None
    except Exception as e:
        logger.error(f"在{filepath}提取opcode时发生错误: {e}")
        return None
  • 使用 TF-IDF 处理:特征工程 (CountVectorizer + TF-IDF)
    logger.info(f"应用 CountVectorizer (ngrams={ngram_range}, min_df={min_df}, max_df={max_df})...")
    vectorizer = CountVectorizer(
        ngram_range=ngram_range,
        decode_error="ignore",
        # token_pattern=r'\s(\b[A-Z_]+\b)\s', # 匹配 Opcode 的模式
        min_df=min_df,
        max_df=max_df
    )
  • 随机划分为训练集和测试集。
    logger.info(f"划分数据 (test_size={test_size}, random_state={random_state})...")
    X_train, X_test, y_train, y_test = train_test_split(
        X_tfidf, y_labels, test_size=test_size, random_state=random_state, stratify=y_labels # stratify 保证训练集和测试集标签比例相似
    )
    logger.info(f"训练集大小: {X_train.shape[0]}, 测试集大小: {X_test.shape[0]}")

大概划分 训练集大小: 13359, 测试集大小: 5726

  • 使用朴素贝叶斯算法在训练集上训练,获得模型数据。
    logger.info("训练多项式朴素贝叶斯模型...")
    model = MultinomialNB()
    model.fit(X_train, y_train)
    logger.info("模型训练完成。")

用模型数据在测试集上进行预测。

    logger.info("--- 在测试集上评估模型 ---")
    y_pred = model.predict(X_test)

    accuracy = accuracy_score(y_test, y_pred)
    precision = precision_score(y_test, y_pred, zero_division=0) # 处理除零情况
    recall = recall_score(y_test, y_pred, zero_division=0)
    f1 = f1_score(y_test, y_pred, zero_division=0)
    conf_matrix = confusion_matrix(y_test, y_pred)

    logger.info(f"准确率 (Accuracy):  {accuracy:.4f}")
    logger.info(f"精确率 (Precision): {precision:.4f}")
    logger.info(f"召回率 (Recall):    {recall:.4f}")
    logger.info(f"F1 分数 (F1-Score):  {f1:.4f}")
  • 验证朴素贝叶斯算法预测效果。
 --- 在测试集上评估模型 ---
- 准确率 (Accuracy):  0.9555
- 精确率 (Precision): 0.9305
- 召回率 (Recall):    0.8796
- F1 分数 (F1-Score):  0.9043
- 混淆矩阵 (Confusion Matrix):
-
[[4266   90]
 [ 165 1205]]

实战测试
效果很一般,误报极高,本来只有两个文件的
在这里插入图片描述

Ⅴ 当前问题

第一:go进程如果要调用opcode进行预测,是否需要自动编译一个内置环境,还是说有内置go环境
需要手动写一个内置的php环境,用于获取opcode,单纯go程序,无法正常获取

Ⅵ 下一步优化

  • 调参
  • AST解析出操作序列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2374983.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国产化Excel处理控件Spire.XLS系列教程:如何通过 C# 删除 Excel 工作表中的筛选器

在 Excel 文件中&#xff0c;筛选器&#xff08;Filter&#xff09;是一个常用的数据处理工具&#xff0c;可以帮助用户快速按条件筛选数据行。但在数据整理完成、导出、共享或打印之前&#xff0c;往往需要 删除 Excel 工作表中的筛选器&#xff0c;移除列标题中的下拉筛选按钮…

[sklearn] 特征工程

一.字典数据抽取 def dictvec():"""字典数据抽取:return: None"""# 实例化# sparse改为True,输出的是每个不为零位置的坐标&#xff0c;稀疏矩阵可以节省存储空间dict DictVectorizer(sparseFalse) #矩阵中存在大量的0&#xff0c;sparse存储只…

CI/CD与DevOps流程流程简述(提供思路)

一 CI/CD流程详解&#xff1a;代码集成、测试与发布部署 引言 在软件开发的世界里&#xff0c;CI/CD&#xff08;持续集成/持续交付&#xff09;就像是一套精密的流水线&#xff0c;确保代码从开发到上线的整个过程高效、稳定。我作为一名资深的软件工程师&#xff0c;接下来…

S7-1500——零基础入门1、工业编程基本概念

工业编程基本概念 一,数制与基本数据类型二,数字量信号三,模拟量信号一,数制与基本数据类型 本节主要内容 类别内容主题数制与基本数据类型数制讲解十进制、十六进制、二进制及其进位规则;基数、位权概念数据类型介绍PLC 使用的数据类型:未序列数据类型(bit、byte、wor…

六、快速启动框架:SpringBoot3实战

六、快速启动框架&#xff1a;SpringBoot3实战 目录 一、SpringBoot3介绍 1.1 SpringBoot3简介1.2 系统要求1.3 快速入门1.4 入门总结 二、SpringBoot3配置文件 2.1 统一配置管理概述2.2 属性配置文件使用2.3 YAML配置文件使用2.4 批量配置文件注入2.5 多环境配置和使用 三、…

万兴PDF-PDFelement v11.4.13.3417

万兴PDF专家(Wondershare PDFelement)是一款国产PDF文档全方位解决方案.万兴PDF编辑器软件万兴PDF中文版,专注于PDF的创建,编辑,转换,签名,压缩,合并,比较等功能.万兴PDF专业版PDF编辑软件,以简约风格及强大的功能在国外名声大噪,除了传统功能外,还提供OCR扫描,表格识别,创建笔…

机器学习-无量纲化与特征降维(一)

一.无量纲化-预处理 无量纲&#xff0c;即没有单位的数据 无量纲化包括"归一化"和"标准化"&#xff0c;这样做有什么用呢&#xff1f;假设用欧式距离计算一个公司员工之间的差距&#xff0c;有身高&#xff08;m&#xff09;、体重&#xff08;kg&#x…

C语言复习--柔性数组

柔性数组是C99中提出的一个概念.结构体中的最后⼀个元素允许是未知大小的数组&#xff0c;这就叫做柔性数组成员。 格式大概如下 struct S { int a; char b; int arr[];//柔性数组 }; 也可以写成 struct S { int a; char b; int arr[0];//柔性数组 }; …

图形化编程如何从工具迭代到生态重构?

一、技术架构的范式突破 在图形化编程领域&#xff0c;技术架构的创新正在重塑行业格局。iVX 作为开源领域的领军者该平台通过图形化逻辑设计&#xff0c;将传统文本编程需 30 行 Python 代码实现的 "按钮点击→条件判断→调用接口→弹窗反馈" 流程&#xff0c;简化…

法国蒙彼利埃大学团队:运用元动力学模拟与马尔可夫状态模型解锁 G 蛋白偶联受体构象动态机制

背景简介 在生命科学领域&#xff0c;G 蛋白偶联受体&#xff08;GPCRs&#xff09;一直是研究的热点。它作为膜蛋白家族的重要成员&#xff0c;承担着细胞对多种刺激的响应任务&#xff0c;从激素、神经递质到外源性物质的信号传导都离不开它。据估计&#xff0c;约三分之一的…

网页Web端无人机直播RTSP视频流,无需服务器转码,延迟300毫秒

随着无人机技术的飞速发展&#xff0c;全球无人机直播应用市场也快速扩张&#xff0c;从农业植保巡检到应急救援指挥&#xff0c;从大型活动直播到智慧城市安防&#xff0c;实时视频传输已成为刚需。预计到2025年&#xff0c;全球将有超过1000万架商用无人机搭载直播功能&#…

数据结构-堆排序

1.定义 -堆中每个节点的值都必须大于等于&#xff08;或小于等于&#xff09;其左右子节点的值。如果每个节点的值都大于等于其子节点的值&#xff0c;这样的堆称为大根堆&#xff08;大顶堆&#xff09;&#xff1b;如果每个节点的值都小于等于其子节点的值&#xff0c;称为…

DedeCMS-Develop-5.8.1.13-referer命令注入研究分析 CVE-2024-0002

本次文章给大家带来代码审计漏洞挖掘的思路&#xff0c;从已知可控变量出发或从函数功能可能照成的隐患出发&#xff0c;追踪参数调用及过滤。最终完成代码的隐患漏洞利用过程。 代码审计挖掘思路 首先flink.php文件的代码执行逻辑&#xff0c;可以使用php的调试功能辅助审计 …

运用数组和矩阵对数据进行存取和运算——NumPy模块 之五

目录 NumPy模块介绍 3.5.1 NumPy 操纵数组元素的逻辑 3.5.2 添加数组元素操作 1. append() 函数 2. insert() 函数 3.5.3 删除数组元素的操作 delete() 函数 3.5.4 数组元素缺失情况的处理 isnan() 函数 3.5.5 处理数组中元素重复情况 unique() 函数 3.5.6 拼接数组操作 1. con…

Nginx的增强与可视化!OpenResty Manager - 现代化UI+高性能反向代理+安全防护

以下是对OpenResty Manager的简要介绍&#xff1a; OpenResty Manager &#xff08;Nginx 增强版&#xff09;&#xff0c;是一款容易使用、功能强大且美观的反向代理工具 &#xff0c;可以作为OpenResty Edge 的开源替代品基于 OpenResty 开发&#xff0c;支持并继承 OpenRes…

Linux:43线程封装与互斥lesson31

mmap文件映射视屏&#xff1a;待看... 目录 线程栈 代码证明&#xff1a;一个线程的数据&#xff0c;其他线程也可以访问 线程封装 简单封装,2.thread Thread.hpp Main.cc Makefile 结果&#xff1a; ​编辑 问题1&#xff1a; 问题2&#xff1a; lamba表达式 模版封…

“工作区”升级为“磁盘”、数据集统计概览优化|ModelWhale 版本更新

本次更新围绕用户在实际项目中对平台的理解和管理体验进行了多项优化。 “工作区”升级为“磁盘”、及其管理优化 平台“工作区”概念正式更名为“磁盘”&#xff0c;突出其存储功能。原有以目录代称的存储区域划分同步更名&#xff0c;其中“work目录”更改为“个人磁盘”&am…

【Mysql基础】一、基础入门和常见SQL语句

&#x1f4da;博客主页&#xff1a;代码探秘者-CSDN博客 &#x1f308;&#xff1a;最难不过坚持 ✨专栏 &#x1f308;语言篇C语言\ CJavase基础&#x1f308;数据结构专栏数据结构&#x1f308;算法专栏必备算法&#x1f308;数据库专栏MysqlRedis&#x1f308;必备篇 其他…

AWS之存储服务

目录 一、传统存储术语 二、传统存储与云存储的关系 三、云存储之AWS 使用场景 文件存储 数据块存储 对象存储 EBS、EFS、S3对比 EBS块存储 S3对象存储 S3 使用案例 S3 存储类 EFS文件存储 一、传统存储术语 分类 接口/技术类型 应用场景特点 关系及区别 机械硬…

Jmeter中的Json提取器如何使用?

在JMeter中使用JSON提取器可以方便地从JSON格式的响应数据中提取特定字段的值。以下是详细步骤和示例&#xff1a; 1. 添加JSON提取器 右击目标HTTP请求 -> 选择 添加 -> 后置处理器 -> JSON提取器。 2. 配置JSON提取器参数 变量名称&#xff08;Names of created…