Ws_32.dll连接绕道钩子没有连接失败

本文关键字:连接 失败 dll Ws | 更新日期: 2023-09-27 18:02:24

我试图绕过ws_32.dll的连接函数。绕行可以工作,但是在调用原始函数时会出现问题。我使用一个相对未知的库来挂钩函数。它被称为白色魔术。它可以和其他函数一起工作,只是这个不行。

我在ie浏览器上试过了,但是我无法连接到任何地方。如果我用线程阻塞。睡眠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结构

    [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错误。因此,ie浏览器会调用connect函数当钩子被移除并调用原来的工作函数时。

WSAEWOULDBLOCK错误描述:

资源暂时不可用。在非阻塞套接字上不能立即完成的操作返回此错误,例如,当没有数据排队等待从套接字读取时,会返回recv。这是一个非致命错误,稍后应该重试该操作。WSAEWOULDBLOCK被报告为在非阻塞SOCK_STREAM套接字上调用connect的结果是正常的。因为建立连接需要一定的时间

Ws_32.dll连接绕道钩子没有连接失败

假设您正在使用这个WhiteMagic库:http://www.gamedeception.net/threads/17994-C-WhiteMagic-Injected-NET-Helper-Library

每个Detour都有一个方法"CallOriginal"。试试调用它,而不是删除/重新应用你的绕道。

现在假设您正在使用某个WhiteMagic库。您应该尝试对每个绕道使用CallOriginal方法。你应该这样做,而不是绕道而行。