Подтвердить что ты не робот

Ws_32.dll подключить крюк для подключения

Я пытаюсь объединить функцию соединения из 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, поскольку для установления соединения должно пройти некоторое время.

4b9b3361

Ответ 1

Предполагая, что вы используете эту библиотеку WhiteMagic: http://www.gamedeception.net/threads/17994-C-WhiteMagic-Injected-NET-Helper-Library

Для каждого Объема есть метод "CallOriginal". Попробуйте назвать это, вместо того, чтобы удалять/повторно использовать ваш объезд.

Ответ 2

Теперь предположим, что вы используете некоторую библиотеку WhiteMagic. Вы должны попробовать использовать метод CallOriginal для каждого объезда. Вы должны называть это, а не удалять свой объезд.

Надеюсь, что это поможет.