首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 同時 Hook send 和 recv 衝突?ws2_32.dll 導出函數重入問題

     編輯:程式設計綜合問答

使用 APIHOOK 類同時 Hook ws2_32.dll 的 send 和 recv 時,第二個 Install 失敗或運行異常。根因是同一個 APIHOOK 實例 send_Hook 重複安裝導致內部狀態(ProcAddress、OldEntry 等)覆蓋衝突。

問題代碼分析

// 錯誤:同一實例安裝兩個 Hook
send_Hook.Install("ws2_32.dll", "send", ...);
send_Hook.Install("ws2_32.dll", "recv", ...); // 覆蓋了 send 的 Hook 信息

正確做法:創建兩個獨立實例

APIHOOK sendHook = new APIHOOK();
APIHOOK recvHook = new APIHOOK(); // 新實例

sendHook.Install("ws2_32.dll", "send", Marshal.GetFunctionPointerForDelegate(new sendCallback(sendProc)));
recvHook.Install("ws2_32.dll", "recv", Marshal.GetFunctionPointerForDelegate(new recvCallback(recvProc)));

深度補充:Hook 回調中的關鍵細節

  1. 暫停/恢復機制:回調內必須 Suspend() → 調用原函數 → Continue(),防止遞歸調用導致棧溢出或死循環。
  2. 緩衝區拷貝:Marshal.Copy(buf, buffer, 0, len) 將非托管指針數據拷貝到托管字節數組,便於檢查/修改封包。
  3. 委托簽名匹配:sendCallback/recvCallback 必須與目標函數調用約定(stdcall)、參數類型完全一致,否則棧平衡被破壞導致崩潰。

替代方案建議

純 C# 做用戶態 Hook 穩定性差、易被殺毒攔截。生產級網絡封包分析建議:

  • WinDivert / Npcap:內核級驅動,性能高、穩定、支持過濾規則語法。
  • SharpPcap / PacketDotNet:C# 封裝 libpcap/WinPcap,適合抓包分析而非修改。
  • eBPF (Windows 10+):新一代可編程內核追蹤技術。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved