使用 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)));
Suspend() → 調用原函數 → Continue(),防止遞歸調用導致棧溢出或死循環。Marshal.Copy(buf, buffer, 0, len) 將非托管指針數據拷貝到托管字節數組,便於檢查/修改封包。sendCallback/recvCallback 必須與目標函數調用約定(stdcall)、參數類型完全一致,否則棧平衡被破壞導致崩潰。純 C# 做用戶態 Hook 穩定性差、易被殺毒攔截。生產級網絡封包分析建議: