Я пытаюсь объединить функцию соединения из ws_32.dll. Обход работает, но что-то не так, когда вы звоните в оригинальную функцию. Я использую относительно неизвестную библиотеку для подключения функции. Он называется WhiteMagic. Он хорошо работает с другими функциями, а не с этим.
Я пробовал его в Internet Explorer, и я не могу подключиться нигде. Если я блокирую Thread.Sleep 100 мс, он работает.
public static UIntPtr ConnectSocketDetoured(UIntPtr s, ref NativeSocks.sockaddr name, int namelen)
{
Magic.Instance.Detours[DetouredConnectId].Remove();
var retVal = ((NativeSocks.Dconnect)Magic.Instance.Detours[DetouredConnectId].TargetDelegate).Invoke(s, ref name, namelen);
//var retVal = NativeSocks.connect(s, ref name, namelen); PINVOKE IMPORT DOESNT WORK TOO.
//IF I BLOCK HERE 100 MILLISECONDS THIS WORK.
Magic.Instance.Detours[DetouredConnectId].Apply();
return retVal;
}
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi, SetLastError = false)]
public delegate UIntPtr Dconnect(UIntPtr s, ref sockaddr_in name, int namelen);
sockaddr_in Struct
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct sockaddr_in
{
public short sin_family;
public ushort sin_port;
public in_addr sin_addr;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 8)]
public string sin_zero;
}
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct in_addr
{
public Anonymous1 S_un;
}
[StructLayoutAttribute(LayoutKind.Explicit)]
public struct Anonymous1
{
[FieldOffsetAttribute(0)]
public Anonymous2 S_un_b;
[FieldOffsetAttribute(0)]
public Anonymous3 S_un_w;
[FieldOffsetAttribute(0)]
public uint S_addr;
}
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct Anonymous2
{
public byte s_b1;
public byte s_b2;
public byte s_b3;
public byte s_b4;
}
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct Anonymous3
{
public ushort s_w1;
public ushort s_w2;
}
Я думаю, что блокировка внутри функции обхода при удалении крючка вызовет ошибку WSAEWOULDBLOCK. По этой причине интернет-исследователь вызывает функцию подключения снова, когда крючок удален и вызывает исходную рабочую функцию.
WSAEWOULDBLOCK Описание ошибки:
Ресурс временно недоступен. Эта ошибка возвращается из операций над неблокирующими сокетами, которые не могут быть завершены немедленно, например, recv, когда данные не помещаются в очередь для чтения из сокета. Это нефатальная ошибка, и операция должна быть повторена позже. Как правило, WSAEWOULDBLOCK сообщается как результат вызова соединения в неблокирующем гнезде SOCK_STREAM, поскольку для установления соединения должно пройти некоторое время.