C# ws_32.dll连接迂回挂钩无连接失败
我正在尝试从ws_32.dll绕过connect函数。迂回可以工作,但是调用原始函数时出现了一些问题。我使用一个相对未知的库来钩住函数。它被称为白魔法。它可以很好地与其他函数配合使用,但不是这个函数 我在Internet Explorer上试用过,但我无法连接任何地方。如果我用Thread.Sleep 100毫秒阻塞,它会工作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,
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做了一些东西。有可能在这里写一个即时通讯吗?我对安卓系统不太清楚,我只做了有限的数量,没有低水平的。