概述


本教程將詳細介紹如何使用 ymi 和 WowPacketParser 工具來捕獲、解析和分析魔獸世界服務器數據包。

  • WowPacketParser:一個用於解析魔獸世界數據包文件(.pkt)的工具,可以將二進制數據包轉換為可讀的格式。
  • ymi:一個用於處理和分析解析後的數據包數據的工具,可以提取特定信息或進行數據轉換。

環境準備


1. 系統要求

  • Windows 10 或更高版本
  • .NET Framework 4.7.2 或更高版本(用於 WowPacketParser)
  • Python 3.7 或更高版本(用於 ymi)

2. 下載工具

  1. 從官方倉庫下載 WowPacketParser:
  • 訪問 WowPacketParser 倉庫
  • 點擊 "Code" 按鈕,選擇 "Download ZIP" 下載壓縮包
  1. 從官方下載 ymi:
  • 從 nmap官網 下載並使用 Npcap 安裝程序安裝 Npcap(並以 WinPcap 兼容模式安裝)。
  • 下載適用於您遊戲版本的嗅探器二進制文件,從 Releases 頁面下載補丁並將其保存到任意位置(最好不要放在 wow 遊戲目錄中)。

3. 安裝步驟

  1. 解壓 WowPacketParser 到任意目錄(例如 D:\XXX\WowPacketParser)
  2. 安裝 ymi:
pip install ymi

WowPacketParser 介紹


WowPacketParser 是一個用於解析魔獸世界數據包文件的工具,支持多種客户端版本,可以將二進制數據包轉換為可讀的文本格式。

主要功能

  • 解析 .pkt 格式的數據包文件
  • 支持多個魔獸世界客户端版本
  • 生成可讀的文本輸出
  • 支持多種輸出格式(文本、JSON、XML等)

命令行參數

WowPacketParser.exe [options] <input file>

常用選項:

  • -o, --output :指定輸出文件
  • -f, --format :指定輸出格式(text, json, xml)
  • -v, --version :指定客户端版本
  • -h, --help :顯示幫助信息

ymi 介紹


ymi 是一個用於處理和分析 WowPacketParser 輸出數據的工具,可以提取特定信息、進行數據轉換和生成報告。

主要功能

  • 解析 WowPacketParser 的輸出文件
  • 提取特定類型的數據包
  • 進行數據統計和分析
  • 生成自定義報告

數據包捕獲

1. 配置 TrinityCore 服務器

要捕獲數據包,首先需要配置 TrinityCore 服務器以啓用數據包日誌記錄。

  1. 打開 worldserver.conf 文件(位於 TrinityCore 安裝目錄)
  2. 找到 PacketLogFile 配置項
  3. 修改配置:
PacketLogFile = "World.pkt"

2. 啓動服務器並捕獲數據包

  1. 啓動 TrinityCore 服務器
  2. 登錄遊戲並執行需要捕獲數據包的操作
  3. 服務器會將所有數據包記錄到指定的 .pkt 文件中
  4. 完成操作後,關閉服務器

3. 數據包文件位置

數據包文件默認保存在服務器的日誌目錄中,具體位置取決於 LogsDir 配置項的設置。

使用 WowPacketParser 分析數據包


1. 基本用法

  1. 打開命令提示符
  2. 導航到 WowPacketParser 目錄:
cd D:\xxx\WowPacketParser
  1. 運行 WowPacketParser:
WowPacketParser.exe "D:\xxx\Server\logs\World.pkt"

這將在控制枱輸出解析結果,並生成一個文本文件。

2. 指定輸出文件和格式

  1. 指定輸出文件:
WowPacketParser.exe "D:\xxx\Server\logs\World.pkt" -o "output.txt"
  1. 指定輸出格式為 JSON:
WowPacketParser.exe "D:\xxx\Server\logs\World.pkt" -f json -o "output.json"
  1. 指定客户端版本 如果 WowPacketParser 無法自動檢測客户端版本,可以手動指定:
WowPacketParser.exe "D:\xxx\Server\logs\World.pkt" -v 10.2.5

解析特定類型的數據包

  1. 查看所有數據包類型:
WowPacketParser.exe "D:\xxx\Server\logs\World.pkt" -h
  1. 只解析特定類型的數據包:
WowPacketParser.exe "D:\xxx\Server\logs\World.pkt" --filter SMSG_UPDATE_OBJECT

使用 ymi 處理數據


1. 基本用法

  1. 解析 WowPacketParser 的輸出:
from ymi import PacketParser

parser = PacketParser("output.txt")
packets = parser.parse()
  1. 遍歷數據包:
for packet in packets:
    print(f"Opcode: {packet.opcode}, Direction: {packet.direction}")

2. 提取特定類型的數據包

from ymi import PacketParser

parser = PacketParser("output.txt")
packets = parser.parse()

# 提取所有 SMSG_UPDATE_OBJECT 數據包
update_packets = [p for p in packets if p.opcode == "SMSG_UPDATE_OBJECT"]

for packet in update_packets:
    # 處理更新對象數據包
    pass

3. 數據統計

from ymi import PacketParser
from collections import Counter

parser = PacketParser("output.txt")
packets = parser.parse()

# 統計各類型數據包的數量
opcode_counts = Counter(p.opcode for p in packets)

for opcode, count in opcode_counts.most_common(10):
    print(f"{opcode}: {count}")

4. 生成報告

from ymi import PacketParser, ReportGenerator

parser = PacketParser("output.txt")
packets = parser.parse()

generator = ReportGenerator(packets)
generator.generate_html_report("report.html")

常見問題與解決方案


1. WowPacketParser 無法解析數據包

問題 :運行 WowPacketParser 時出現錯誤,無法解析數據包文件。

解決方案 :

  1. 確保數據包文件擴展名是 .pkt
  2. 檢查數據包文件是否完整,沒有被截斷
  3. 嘗試指定正確的客户端版本:
WowPacketParser.exe "World.pkt" -v 10.2.5

2. ymi 無法解析 WowPacketParser 的輸出

問題 :使用 ymi 解析 WowPacketParser 輸出時出現錯誤。

解決方案 :

  1. 確保 WowPacketParser 的輸出格式是 ymi 支持的格式
  2. 嘗試使用文本格式輸出:
WowPacketParser.exe "World.pkt" -f text -o "output.txt"
  1. 檢查輸出文件是否完整,沒有被截斷

3. 數據包文件過大

問題 :數據包文件太大,難以處理。

解決方案 :

  1. 只捕獲需要的數據包,減少捕獲時間
  2. 使用 WowPacketParser 的過濾功能,只解析特定類型的數據包
  3. 將大文件分割成小文件處理

4. 找不到特定類型的數據包

問題 :在數據包中找不到特定操作對應的數據包。

解決方案 :

  1. 確保在捕獲數據包時執行了相應的操作
  2. 檢查數據包的方向(客户端到服務器或服務器到客户端)
  3. 使用 ymi 的搜索功能查找相關的數據包

高級技巧

1. 自動化數據包捕獲和分析

創建一個批處理腳本,自動完成數據包捕獲和分析:

@echo off
echo Starting packet capture...

REM 啓動服務器並捕獲數據包
start worldserver.exe

REM 等待用户完成操作
echo Press any key to stop packet capture...
pause

REM 停止服務器
taskkill /f /im worldserver.exe

REM 分析數據包
echo Analyzing packets...
C:\Master\WowPacketParser\WowPacketParser.exe "C:\TrinityCore\logs\World.pkt" -o "output.txt"

REM 使用 ymi 處理數據
echo Processing data with ymi...
python process_packets.py

echo Done!
pause

2. 使用過濾器減少數據包量

在捕獲數據包時,可以只捕獲特定類型的數據包:

// 在 TrinityCore 源碼中修改 PacketLog::LogPacket 函數
void PacketLog::LogPacket(WorldPacket const& packet, Direction direction, boost::asio::ip::address const& addr, uint16 port, ConnectionType connectionType)
{
    // 只記錄特定類型的數據包
    if (packet.GetOpcode() != SMSG_UPDATE_OBJECT && packet.GetOpcode() != CMSG_PLAYER_LOGIN)
        return;
    
    // 原有的記錄邏輯...
}

3. 自定義 ymi 插件

創建自定義 ymi 插件來處理特定類型的數據包:

from ymi import Plugin

class CustomPlugin(Plugin):
    def __init__(self):
        super().__init__()
        self.name = "Custom Plugin"
        self.version = "1.0"
    
    def process_packet(self, packet):
        if packet.opcode == "SMSG_UPDATE_OBJECT":
           # 處理更新對象數據包
           self.process_update_object(packet)
    
    def process_update_object(self, packet):

        # 自定義處理邏輯
        pass

# 註冊插件
plugin = CustomPlugin()
ymi.register_plugin(plugin)

4. 數據包可視化

使用 ymi 生成數據包的可視化圖表:

from ymi import PacketParser, Visualizer

parser = PacketParser("output.txt")
packets = parser.parse()

visualizer = Visualizer(packets)

# 生成數據包類型分佈圖
visualizer.plot_opcode_distribution("opcode_distribution.png")

# 生成數據包時間線圖
visualizer.plot_packet_timeline("packet_timeline.png")