public static IntPtr DuplicateTargetProcessSocket(Process targetProcess) { IntPtr targetSocketHandle = IntPtr.Zero; IntPtr dupSocketHandle = IntPtr.Zero; targetSocketHandle = GetSocketTargetProcess(targetProcess); if (targetSocketHandle == IntPtr.Zero) { throw new ConPtyShellException("No \\Device\\Afd objects found. Socket duplication failed."); } else { WSAPROTOCOL_INFO wsaProtocolInfo = new WSAPROTOCOL_INFO(); WSAData data; if (WSAStartup(2 << 8 | 2, out data) != 0) { throw new ConPtyShellException(String.Format("WSAStartup failed with error code: {0}", WSAGetLastError())); } int status = WSADuplicateSocket(targetSocketHandle, Process.GetCurrentProcess().Id, ref wsaProtocolInfo); if (status != 0) { Console.WriteLine("WSADuplicateSocket failed with error " + status.ToString() + " and wsalasterror " + WSAGetLastError().ToString()); return(dupSocketHandle); } dupSocketHandle = WSASocket(wsaProtocolInfo.iAddressFamily, wsaProtocolInfo.iSocketType, wsaProtocolInfo.iProtocol, ref wsaProtocolInfo, 0, WSA_FLAG_OVERLAPPED); if (dupSocketHandle == IntPtr.Zero || dupSocketHandle == new IntPtr(-1)) { Console.WriteLine("WSASocket failed with error " + WSAGetLastError().ToString()); return(dupSocketHandle); } //Console.WriteLine("WSASocket success handlex 0x" + dupSocketHandle.ToString("X4")); } return(dupSocketHandle); }
static extern int WSADuplicateSocket(IntPtr s, uint dwProcessId, out WSAPROTOCOL_INFO lpProtocolInfo);
private static extern IntPtr WSASocket([In] int addressFamily, [In] int socketType, [In] int protocolType, ref WSAPROTOCOL_INFO lpProtocolInfo, Int32 group1, int dwFlags);
private static extern int WSADuplicateSocket(IntPtr socketHandle, int processId, ref WSAPROTOCOL_INFO pinnedBuffer);