Announcement

Collapse
No announcement yet.

Probleme mit send() und Detours...

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit send() und Detours...

    Hi Leute,

    ich versuch mich grad an nem kleinen Mail-Proxy. Ich benutze dabei Microsofts Detours, um Connect() abzufangen und umzuleiten, falls auf Port 25 zugegriffen werden soll. Der Code sieht folgendermaßen aus:
    <pre>
    int WINAPI Detourconnect(SOCKET s, const struct sockaddr* name, int namelen)
    {
    int retval;
    try
    {
    if (((sockaddr_in *)name)->sin_port==htons(25))
    {
    ((sockaddr_in *)name)->sin_port=htons(8025);
    UCHAR proxyIP[] = {127,0,0,1};
    UCHAR serverIP[5];
    UCHAR *zeiger;
    zeiger = &(((sockaddr_in *)name)->sin_addr.S_un.S_un_b.s_b1);
    for (int i=0; i<4; i++)
    {
    serverIP[i] = *zeiger;
    *zeiger = proxyIP[i];
    zeiger++;
    } // for
    serverIP[4] = 0;
    retval = Real_connect(s, name, namelen);
    MessageBox(NULL,(LPCTSTR) serverIP, "ProxyDLL", MB_OK);
    for (int i = 0; i<200000; i++); // bisserl Zeit lassen
    send(s, (const char *)serverIP[0], sizeof(serverIP), MSG_OOB|MSG_DONTROUTE/*?? welche Flags setzen??*/);
    return retval;
    } // if port = 8025
    if (((sockaddr_in *)name)->sin_port==htons(8025))
    {
    ((sockaddr_in *)name)->sin_port=htons(25);
    return Real_connect(s, name, namelen);
    } // if port == 8025
    }
    catch(int e){MessageBox(NULL, "Exception beim Umbiegen", "Proxy-DLL", MB_OK);}
    return Real_connect(s, name, namelen);
    }
    </pre>

    Dabei wird die IP und der Port in sockaddr_in geändert. Das Problem ist dann, daß mein Proxy-Programm die "richtige" IP des SMTP-Servers ja nicht kennt, also wird die per send() hinterhergeschickt.

    Beim Proxy selbst kommt die aber nicht an :-((

    Der Proxy (C#) startet nen neuen Thread mit nem TcpListener, holt sich dessen Stream und wartet dann darauf, daß über den Stream irgendwelche Daten ankommen, aber myStream.Read(...) blockiert einfach nur den Thread und nichts weiter geschieht, weil über den Stream anscheinend die per send() gesendeten Daten einfach nicht ankommen.

    Weiß einer woran das liegen könnte?

    Gruß,

    Jörg

  • #2
    Hi,

    hab grad nochmal ein bisserl rumgespielt und den Fehler eingegrenzt. bereits bei der Zeile...
    <pre>
    retval = Real_connect(s, name, namelen);
    </pre>

    ...(entspricht dem noormalen connect(...) gibt er nicht 0 zurück und per WSAGetLastError bekomme ich ein WSAEWOULDBLOCK.

    Hatte das schonmal einer? Aus dem dazugehörigen Kommentar in der MSDN werd ich irgendwie nicht richtig schlau. Jedenfalls steht da nicht, wie ich den Fehler umschiffen kann :-((

    Kann mir da einer von Euch nen kleinen Schlag auf den Hinterkopf verpassen?

    Gruß,

    Jör

    Comment

    Working...
    X