Pregunta ws_32.dll conecta el gancho de desvío sin conexión falla


Intento desviar la función de conexión de ws_32.dll. El desvío funciona, pero algo va mal cuando se llama a la función original. Utilizo una biblioteca relativamente desconocida para enganchar la función. Se llama WhiteMagic. Funciona bien con otras funciones, simplemente no esta.

Lo probé en Internet Explorer y no puedo conectarme a ningún lado. Si bloqueo con Thread.Sleep 100 ms, funciona.

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;
    }

Creo que al bloquear dentro de la función de desvío mientras se retira el gancho causará un error WSAEWOULDBLOCK. Por ese motivo, el explorador de Internet llama a la función de conexión de nuevo mientras se retira el gancho y llama a la función de trabajo original.

WSAEWOULDBLOCK Descripción del error:

Recurso temporalmente no disponible. Este error se devuelve de las operaciones en sockets no bloqueantes que no se pueden completar de inmediato, por ejemplo, recv cuando no hay datos en cola para leer desde el socket. Es un error no fatal, y la operación debe reintentarse más tarde. Es normal que se informe sobre WSAEWOULDBLOCK como resultado de una llamada a connect en un socket SOCK_STREAM sin bloqueo, ya que debe transcurrir un tiempo para que se establezca la conexión.


32
2017-07-19 06:43


origen


Respuestas:


Asumiendo que estás usando esta biblioteca WhiteMagic: http://www.gamedeception.net/threads/17994-C-WhiteMagic-Injected-NET-Helper-Library

Hay un método "CallOriginal" para cada desvío. Intenta llamar a eso en lugar de eliminar / volver a aplicar tu desvío.


1
2017-12-29 21:34



Ahora suponga que está usando alguna WhiteMagic biblioteca. Deberías intentar usar el método CallOriginal para cada desvío. Debe llamar a eso en lugar de eliminar su desvío.

Espero que esto ayude.


-3
2018-03-19 10:52