概述
本教程將詳細介紹如何使用 ymi 和 WowPacketParser 工具來捕獲、解析和分析魔獸世界服務器數據包。
- WowPacketParser:一個用於解析魔獸世界數據包文件(.pkt)的工具,可以將二進制數據包轉換為可讀的格式。
- ymi:一個用於處理和分析解析後的數據包數據的工具,可以提取特定信息或進行數據轉換。
環境準備
1. 系統要求
- Windows 10 或更高版本
- .NET Framework 4.7.2 或更高版本(用於 WowPacketParser)
- Python 3.7 或更高版本(用於 ymi)
2. 下載工具
- 從官方倉庫下載 WowPacketParser:
- 訪問 WowPacketParser 倉庫
- 點擊 "Code" 按鈕,選擇 "Download ZIP" 下載壓縮包
- 從官方下載 ymi:
- 從 nmap官網 下載並使用 Npcap 安裝程序安裝 Npcap(並以 WinPcap 兼容模式安裝)。
- 下載適用於您遊戲版本的嗅探器二進制文件,從 Releases 頁面下載補丁並將其保存到任意位置(最好不要放在 wow 遊戲目錄中)。
3. 安裝步驟
- 解壓 WowPacketParser 到任意目錄(例如 D:\XXX\WowPacketParser)
- 安裝 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 服務器以啓用數據包日誌記錄。
- 打開 worldserver.conf 文件(位於 TrinityCore 安裝目錄)
- 找到 PacketLogFile 配置項
- 修改配置:
PacketLogFile = "World.pkt"
2. 啓動服務器並捕獲數據包
- 啓動 TrinityCore 服務器
- 登錄遊戲並執行需要捕獲數據包的操作
- 服務器會將所有數據包記錄到指定的 .pkt 文件中
- 完成操作後,關閉服務器
3. 數據包文件位置
數據包文件默認保存在服務器的日誌目錄中,具體位置取決於 LogsDir 配置項的設置。
使用 WowPacketParser 分析數據包
1. 基本用法
- 打開命令提示符
- 導航到 WowPacketParser 目錄:
cd D:\xxx\WowPacketParser
- 運行 WowPacketParser:
WowPacketParser.exe "D:\xxx\Server\logs\World.pkt"
這將在控制枱輸出解析結果,並生成一個文本文件。
2. 指定輸出文件和格式
- 指定輸出文件:
WowPacketParser.exe "D:\xxx\Server\logs\World.pkt" -o "output.txt"
- 指定輸出格式為 JSON:
WowPacketParser.exe "D:\xxx\Server\logs\World.pkt" -f json -o "output.json"
- 指定客户端版本 如果 WowPacketParser 無法自動檢測客户端版本,可以手動指定:
WowPacketParser.exe "D:\xxx\Server\logs\World.pkt" -v 10.2.5
解析特定類型的數據包
- 查看所有數據包類型:
WowPacketParser.exe "D:\xxx\Server\logs\World.pkt" -h
- 只解析特定類型的數據包:
WowPacketParser.exe "D:\xxx\Server\logs\World.pkt" --filter SMSG_UPDATE_OBJECT
使用 ymi 處理數據
1. 基本用法
- 解析 WowPacketParser 的輸出:
from ymi import PacketParser
parser = PacketParser("output.txt")
packets = parser.parse()
- 遍歷數據包:
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 時出現錯誤,無法解析數據包文件。
解決方案 :
- 確保數據包文件擴展名是 .pkt
- 檢查數據包文件是否完整,沒有被截斷
- 嘗試指定正確的客户端版本:
WowPacketParser.exe "World.pkt" -v 10.2.5
2. ymi 無法解析 WowPacketParser 的輸出
問題 :使用 ymi 解析 WowPacketParser 輸出時出現錯誤。
解決方案 :
- 確保 WowPacketParser 的輸出格式是 ymi 支持的格式
- 嘗試使用文本格式輸出:
WowPacketParser.exe "World.pkt" -f text -o "output.txt"
- 檢查輸出文件是否完整,沒有被截斷
3. 數據包文件過大
問題 :數據包文件太大,難以處理。
解決方案 :
- 只捕獲需要的數據包,減少捕獲時間
- 使用 WowPacketParser 的過濾功能,只解析特定類型的數據包
- 將大文件分割成小文件處理
4. 找不到特定類型的數據包
問題 :在數據包中找不到特定操作對應的數據包。
解決方案 :
- 確保在捕獲數據包時執行了相應的操作
- 檢查數據包的方向(客户端到服務器或服務器到客户端)
- 使用 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")