木馬查殺篇—Opcode提取

【前言】 介紹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

<?phpecho "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 Nonecmd = [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 opcodesexcept FileNotFoundError:logger.error(f"'{php_executable}'命令未找到。無法提取opcode。")return Noneexcept subprocess.TimeoutExpired:logger.warning(f"Opcode提取超時于{filepath}。跳過。")return Noneexcept 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.pswp.cn/news/905162.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905162.shtml
英文地址,請注明出處:http://en.pswp.cn/news/905162.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DeepSeek-R1-Distill-Qwen-1.5B代表什么含義?

DeepSeek?R1?Distill?Qwen?1.5B 完整釋義與合規須知 一句話先行 這是 DeepSeek?AI?把自家?R1?大模型?的知識&#xff0c;通過蒸餾壓縮進一套 Qwen?1.5B 架構 的輕量學生網絡&#xff0c;并以寬松開源許可證發布的模型權重。 1?|?名字逐段拆解 片段意義備注DeepSee…

Megatron系列——張量并行

本文整理自bilibili Zomi視頻 1、行切分和列切分 注意&#xff1a; &#xff08;1&#xff09;A按列切分時&#xff0c;X無需切分&#xff0c;split復制廣播到A1和A2對應設備即可。最后Y1和Y2需要拼接下&#xff0c;即All Gather &#xff08;2&#xff09;A按行切分時&#…

java agent技術

從JDK1.5之后引入了java angent技術 Java Agent 是一種強大的技術&#xff0c;它允許開發者在 JVM 啟動時或運行期間動態地修改類的字節碼&#xff0c;從而實現諸如性能監控、日志記錄、AOP&#xff08;面向切面編程&#xff09;等功能 java agent依賴于Instrumentation API&…

LLaMA Factory 深度調參

注意&#xff0c;本文涵蓋從基礎調參到前沿研究的完整知識體系&#xff0c;建議結合具體業務場景靈活應用。一篇“參考文獻”而非“可運行的代碼”。https://github.com/zysNLP/quickllm 初始指令&#xff1a; llamafactory-cli train \--stage sft \--do_train True \--mode…

Linux驅動:驅動編譯流程了解

要求 1、開發板中的linux的zImage必須是自己編譯的 2、內核源碼樹,其實就是一個經過了配置編譯之后的內核源碼。 3、nfs掛載的rootfs,主機ubuntu中必須搭建一個nfs服務器。 內核源碼樹 解壓 tar -jxvf x210kernel.tar.bz2 編譯 make x210ii_qt_defconfigmakeCan’t use ‘…

Redis集群模式、持久化、過期策略、淘汰策略、緩存穿透雪崩擊穿問題

Redis四種模式 單節點模式 架構??&#xff1a;單個Redis實例運行在單臺服務器。 ??優點??&#xff1a; ??簡單??&#xff1a;部署和配置容易&#xff0c;適合開發和測試。 ??低延遲??&#xff1a;無網絡通信開銷。 ??缺點??&#xff1a; ??單點故障??&…

1.2 函數

函數的本質是描述變量間的依賴關系&#xff1a;??一個變量&#xff08;自變量&#xff09;的變化會唯一確定另一個變量&#xff08;因變量&#xff09;的值??。 ??基本構成??&#xff1a;通過符號&#xff08;如YF(X)&#xff09;表達規則&#xff0c;X輸入 → F處理 …

2025數字孿生技術全景洞察:從工業革命到智慧城市的跨越式發展

引言 數字孿生技術&#xff0c;這一融合物理世界與虛擬鏡像的革新性工具&#xff0c;正以驚人的速度重塑產業格局。2025年&#xff0c;中國數字孿生市場規模預計達214億元&#xff0c;工業制造領域占比超40%&#xff0c;其技術深度與行業落地成果令人矚目。本文將結合最新數據與…

RabbitMQ 工作模式

RabbitMQ 一共有 7 中工作模式&#xff0c;可以先去官網上了解一下&#xff08;一下截圖均來自官網&#xff09;&#xff1a;RabbitMQ 官網 Simple P&#xff1a;生產者&#xff0c;要發送消息的程序&#xff1b;C&#xff1a;消費者&#xff0c;消息的接受者&#xff1b;hell…

VBA會被Python代替嗎

VBA不會完全被Python取代、但Python在自動化、數據分析與跨平臺開發等方面的優勢使其越來越受歡迎、兩者將長期并存且各具優勢。 Python以其易于學習的語法、強大的開源生態系統和跨平臺支持&#xff0c;逐漸成為自動化和數據分析領域的主流工具。然而&#xff0c;VBA依舊在Exc…

【開源工具】深度解析:基于PyQt6的Windows時間校時同步工具開發全攻略

&#x1f552; 【開源工具】深度解析&#xff1a;基于PyQt6的Windows時間校時同步工具開發全攻略 &#x1f308; 個人主頁&#xff1a;創客白澤 - CSDN博客 &#x1f525; 系列專欄&#xff1a;&#x1f40d;《Python開源項目實戰》 &#x1f4a1; 熱愛不止于代碼&#xff0c;熱…

大模型項目:普通藍牙音響接入DeepSeek,解鎖語音交互新玩法

本文附帶視頻講解 【代碼宇宙019】技術方案&#xff1a;藍牙音響接入DeepSeek&#xff0c;解鎖語音交互新玩法_嗶哩嗶哩_bilibili 目錄 效果演示 核心邏輯 技術實現 大模型對話&#xff08;技術&#xff1a; LangChain4j 接入 DeepSeek&#xff09; 語音識別&#xff08;…

qt命名空間演示

#ifndef CIR_H #define CIR_Hnamespace cir {double PI3.141592653;//獲取圓行周長double getLenthOfCircle(double radius){return 2*PI*radius;}//獲取圓形面積double getAreaOfCircle(double radius){return PI*radius*radius;}} #endif // CIR_H#include <iostream> …

使用 Java 反射動態加載和操作類

Java 的反射機制(Reflection)是 Java 語言的一大特色,它允許程序在運行時檢查、加載和操作類、方法、字段等元信息。通過 java.lang.Class 和 java.lang.reflect 包,開發者可以動態加載類、創建實例、調用方法,甚至在運行時構造新類。反射是 Java 靈活性的核心,廣泛應用于…

《 C++ 點滴漫談: 三十七 》左值?右值?完美轉發?C++ 引用的真相超乎你想象!

摘要 本文全面系統地講解了 C 中的引用機制&#xff0c;涵蓋左值引用、右值引用、引用折疊、完美轉發等核心概念&#xff0c;并深入探討其底層實現原理及工程實踐應用。通過詳細的示例與對比&#xff0c;讀者不僅能掌握引用的語法規則和使用技巧&#xff0c;還能理解引用在性能…

【AutoGen深度解析】下一代AI代理編程框架實戰指南

目錄 &#x1f31f; 前言&#x1f3d7;? 技術背景與價值&#x1f6a7; 當前技術痛點&#x1f6e0;? 解決方案概述&#x1f465; 目標讀者說明 &#x1f50d; 一、技術原理剖析&#x1f5bc;? 核心概念圖解&#x1f4a1; 核心作用講解?? 關鍵技術模塊說明&#x1f504; 技術…

Python-AI調用大模型 給出大模型人格案例

Python調用通義千問模擬原神雷電將軍口吻 最近在用AI編輯器寫AI對話 嘗試給AI對話增加人格 以下是使用阿里通義千問大模型模擬《原神》中雷電將軍(雷電影)口吻的代碼案例&#xff0c;包含典型的高傲威嚴、略帶古風的說話風格。 完整后端代碼示例 import dashscope from dash…

csdn博客打賞功能

CSDN_專業開發者社區_已接入DeepSeekR1滿血版 官網: 最右下角 耳機 就是客服 可以轉人工 開啟打賞功能如下: 1.因為博主本人不可以對本人賬號文章進行打賞&#xff0c;因此本人賬號打開文章詳情頁不顯示打賞按鈕。為了驗證賬號設置的打賞功能是否生效所以讓您使用無痕模式模…

【深度學習】目標檢測算法大全

目錄 一、R-CNN 1、R-CNN概述 2、R-CNN 模型總體流程 3、核心模塊詳解 &#xff08;1&#xff09;候選框生成&#xff08;Selective Search&#xff09; &#xff08;2&#xff09;深度特征提取與微調 2.1 特征提取 2.2 網絡微調&#xff08;Fine-tuning&#xff09; …

26考研——中央處理器_指令流水線_指令流水線的基本概念 流水線的基本實現(5)

408答疑 文章目錄 六、指令流水線指令流水線的基本概念流水線的基本實現流水線設計的原則流水線的邏輯結構流水線的時空圖表示 八、參考資料鮑魚科技課件26王道考研書 六、指令流水線 前面介紹的指令都是在單周期處理機中采用串行方法執行的&#xff0c;同一時刻 CPU 中只有一…