標籤:

怎樣攔截並記錄指定進程的TCP封包?

已知的場景條件:

1. 攔截的是遊戲(D3D)的TCP封包

2. IP不固定

所需要達到的效果,第三方程序可以記錄下遊戲封包同時不影響遊戲的運行。

需求很像是網易爐石盒子的效果(當然我不清楚盒子是利用內存還是利用封包,但是目的基本相似)

答主能想到的幾種方式(如果有更好的方案 或者我的想法有誤也歡迎能夠提出來):

1. 使用啟動器方式啟動遊戲

2. 向遊戲內注入DLL (我傾向與這一種)

限定C#或C++


抓網路包有幾種方法,都各有利弊。

一種是你說的注入dll,有時這種方式有可能會引起反病毒軟體報警,如果遊戲本身有注入檢測的話這種方式有可能會失敗。

一種是WinPcap(WinPcap - Home),這種方式需要安裝,它會安裝一個驅動程序,在操作系統底層攔截網路數據。這個工具抓到的包無法區分進程,機器上所有進程的網路包都混在一起,就是說你需要記錄遊戲進程所打開的TCP連接的目的地址和埠,用來過濾遊戲的收發數據。

一種是微軟的Network Monitor (Microsoft Network Monitor 3.4 (archive)),這個和WinPcap比較相似,也需要安裝微軟的驅動。但是這個可以按進程過濾網路數據,比較方便一點。這有一點C#的demo:

Process.Start("ConsoleApplication1.exe");

Thread.Sleep(1000);

Process process = new Process();
process.StartInfo.FileName = "nmcap.exe";
process.StartInfo.Arguments = @"/network * /CaptureProcesses /Capture ""Conversation.ProcessName == ""ConsoleApplication1.exe"""" /File D:capture3.cap /stopwhen /frame Ipv4.DestinationAddress == 1.2.3.4";
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.Start();

Network Monitor既可以用GUI也可以用CLI來抓包,nmcap.exe就是CLI的方式,也有C++的API lib。假設我們有一個遊戲進程ConsoleApplication1.exe,它在不停地發送TCP包,然後我們設置想要抓包的進程名為ConsoleApplication1.exe,用nmcap啟動一個新的進程來抓包,抓到的數據保存在D:capture3.cap。抓到的cap文件可以用GUI打開,也可以用Wireshark等第三方工具打開,因為是通用的抓包格式。如果想用程序解析cap文件,也有第三方的lib(GitHub - chmorgan/sharppcap: Fully managed, cross platform (Windows, Mac, Linux) .NET library for capturing packets)。當我們想要結束抓包的時候用下面這段代碼:

Ping pingSender = new Ping();
pingSender.Send("1.2.3.4");

原因是我們啟動時設置了收到1.2.3.4這個地址的數據包時停止抓包。

用哪種方式要看具體條件,如果你是準備把抓包功能作為產品的一部分分發到客戶機器上,你就需要考慮用戶是否允許你安裝驅動,還要考慮盡量降低安裝的複雜度,畢竟大多數用戶不是老司機。如果是自己用用那就沒什麼問題了,微軟的這個工具最簡單。

( ゜- ゜)つロ 乾杯~


hook winsocks 的 recv 和 send


推薦閱讀:

C++中的struct?
C++中static函數模板該怎麼寫?
C++ 有哪些奇技淫巧?
為什麼 C++ 中,基類指針可以指向派生類對象?
如何實現快速將 64 位二進位(存在字元串里)轉換為十進位?

TAG:C | 抓包 |