Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ws_32.dll连接迂回挂钩无连接失败_C#_.net - Fatal编程技术网

C# ws_32.dll连接迂回挂钩无连接失败

C# ws_32.dll连接迂回挂钩无连接失败,c#,.net,C#,.net,我正在尝试从ws_32.dll绕过connect函数。迂回可以工作,但是调用原始函数时出现了一些问题。我使用一个相对未知的库来钩住函数。它被称为白魔法。它可以很好地与其他函数配合使用,但不是这个函数 我在Internet Explorer上试用过,但我无法连接任何地方。如果我用Thread.Sleep 100毫秒阻塞,它会工作 public static UIntPtr ConnectSocketDetoured(UIntPtr s, ref NativeSocks.sockaddr name,

我正在尝试从ws_32.dll绕过connect函数。迂回可以工作,但是调用原始函数时出现了一些问题。我使用一个相对未知的库来钩住函数。它被称为白魔法。它可以很好地与其他函数配合使用,但不是这个函数

我在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_

    [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;
    }
我认为在移除钩子时阻塞detouring函数会导致WSAEWOULDBLOCK错误。因此,internet explorer调用connect函数 再次移除挂钩并调用原始工作函数

WSAEWOULDBLOCK错误说明: 资源暂时不可用。 无法立即完成的非阻塞套接字上的操作返回此错误,例如,当没有数据排队从套接字读取时,recv。 这是一个非致命错误,应稍后重试该操作。WSAEWOULDBLOCK作为在非阻塞SOCK_流套接字上调用connect的结果报告是正常的,
因为必须经过一段时间才能建立连接。

假设您正在使用此WhiteMagic库:


每个迂回都有一个方法“CallOriginal”。尝试调用该函数,而不是删除/重新应用迂回路径。

现在假设您正在使用一些
WhiteMagic
库。对于每个迂回路径,您应该尝试使用
CallOriginal
方法。你应该这样称呼,而不是绕道而行


希望这能有所帮助。

我对WhiteMagic不太熟悉,但您有什么理由需要移除挂钩并将其放回原位吗?几年前,我对Delphi/Winsock做了类似的事情,只是将挂钩永久保留在原位,并在必要时使用其他逻辑修改/记录传入和传出数据。需要删除它,因为我想调用原始函数。只是想获取函数参数数据。但我对图书馆工作原理的误解已经过去了一段时间。在我的例子中,我编写了一个Win32 DLL,它镜像了Winsock DLL函数和索引,用一个绝对路径加载了原始版本,并且除了通过邮件槽向我的应用程序发送/接收一些数据外,大部分只是传递信息。无论如何,听起来像是一个老项目,但如果它是你想要的未来猜测我的代码可以很容易地移动到C++(现在不用太多Delphi)和邮箱很容易使用。NET.Thanks为您的报价彼得。我最终用C++完成了这些项目。我看到你也用android做了一些东西。有可能在这里写一个即时通讯吗?我对安卓系统不太清楚,我只做了有限的数量,没有低水平的。