connect IP prüfen [Detours]



  • Ev. hilft sockaddr_in - da sollte die IP drin sein.



  • Soll ich dann von sockaddr zu sockaddr_in casten? 😕
    Die IP wird ja mit inet_addr() übergeben.
    "The inet_addr function converts a string containing an IPv4 dotted-decimal address into a proper address for the IN_ADDR structure."

    Dann muss noch die IP, die dann im unsigned long Format ist, wieder zum String bekommen? Ist das wirklich so aufwendig oder vertuh ich mich hier grade? 😃
    Ich versuch mein Glück nochmal, aber mit so einem Aufwand habe ich nicht gerechnet.



  • Kopiere den Inhalt von sockaddr nach sockaddr_in, danch benutze inet_ntoa(..) mit dem Member sin_addr:
    sockaddr, sockaddr_in:http://msdn.microsoft.com/en-us/library/windows/desktop/ms740496.aspx
    inet_ntoa(..):http://msdn.microsoft.com/en-us/library/windows/desktop/ms738564.aspx

    Edit: Links angepasst.



  • Danke theta. Grade ist mir aufgefallen das es dafür sogar eine Funktion gibt, doch auch die bereitet mir Probleme.

    WSAAddressToString
    The WSAAddressToString function converts all components of a sockaddr structure into a human-readable string representation of the address.

    So kann ich mir zumindest das kopieren der Struktur sparen. Mein Versuch:

    int connectDetour(SOCKET s, const struct sockaddr *name, int namelen)
    {
    	char buf[MAX_PATH];
    	if(WSAAddressToString(const_cast<LPSOCKADDR>(name), sizeof(name), NULL, buf, NULL) == SOCKET_ERROR)
    	{
    		MessageBox(NULL, GetLastErrorString(WSAGetLastError()).c_str(), "Error", MB_OK);
    	}
    
    	MessageBox(NULL, buf, "IP Adresse", MB_OK);
    	return connect_orig(s, name, namelen);
    }
    

    Fehler der mir zurück gegeben wird: Ein ungültiges Argument wurde angegeben.
    Weiß jemand was ich jetzt falsch mache?



  • Verwende keinen const_cast... kopiere die Struktur falls nötig.
    Zu deinem Fehler: Wie gross ist sizeof(name), wie gross ist sizeof(*name)?
    Und der letzte Parameter? Darf der NULL sein? 🕶
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms741516(v=vs.85).aspx



  • Okay, habs jetzt ohne die Kovertierung versucht. Jetzt crasht mein Programm und vorher bekomme ich diesen Fehler ausgegeben:
    Bei dem Versuch das Zeigerargument eines Aufrufs zu verwenden, wurde eine ungültige Zeigeradresse gefunden.

    Mein Code sieht jetzt so aus:

    int connectDetour(SOCKET s, const struct sockaddr *name, int namelen)
    {
    	char buf[MAX_PATH];
    	DWORD bufsize = 0;
    	struct sockaddr *cpyname = new sockaddr[sizeof(*name)];
    	*cpyname = *name;
    
    	if(WSAAddressToString(cpyname, sizeof(*name), NULL, buf, &bufsize) == SOCKET_ERROR)
    	{
    		MessageBox(NULL, GetLastErrorString(WSAGetLastError()).c_str(), "Error", MB_OK);
    	}
    
    	MessageBox(NULL, buf, "IP Adresse", MB_OK);
    	return connect_orig(s, name, namelen);
    }
    


  • Okay, habs jetzt ohne die Kovertierung versucht. Jetzt crasht mein Programm und vorher bekomme ich diesen Fehler ausgegeben:
    Bei dem Versuch das Zeigerargument eines Aufrufs zu verwenden, wurde eine ungültige Zeigeradresse gefunden.

    Ja, und welcher der Parameter könnte den das Problem verursachen?
    Lies die Doku genau und sieh in deinem Code nach ob da was nicht stimmt... 🙄

    Edit: und zum Code allgemein: 😞
    Edit2: Ist nicht mehr zum ertragen... hier Bsp. Code:
    Ohne WSA... aber ich denke, er macht das was du möchtest, oder?

    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    #include <winsock2.h>
    
    #pragma comment (lib, "ws2_32.lib")
    
    #include <iostream>
    
    int connect_orig(SOCKET /*s*/, const struct sockaddr* /*name*/, int /*namelen*/) { return SOCKET_ERROR; }
    
    int connectDetour(SOCKET s, const struct sockaddr* name, int namelen) 
    {
        const sockaddr_in* internetName = reinterpret_cast<const sockaddr_in*>(name);
        const char* ipAddress = inet_ntoa(internetName->sin_addr);
        std::cout << "IP Address: " << ipAddress << std::endl;
    
        return connect_orig(s, name, namelen);
    }
    
    int main()
    {
        SOCKET sock = INVALID_SOCKET;
    
        sockaddr_in name = {};
        name.sin_port = htons(1234);
        name.sin_addr.S_un.S_addr = inet_addr("10.1.44.120");
    
        connectDetour(sock, reinterpret_cast<const sockaddr*>(&name), sizeof(name));
    }
    


  • Danke theta, hätte ich mal von Anfang an auf deinen Tipp gehört einfach inet_ntoa zu verwenden. Das Programm crasht allerdings jetzt, aber sobald ich die zwei Zeilen rausnehme und die Parameter ohne irgendwelche Aktionen mit connect_orig zurückgebe, funktioniert es. 😮



  • Wenns crasht würde ich debuggen... Gibt es Restriktionen bei ge-detourten Funktionen? z.B. kein std::cout? Ich weiss es leider nicht.

    Ev. musst Du noch den protocol familiy testen - so etwa:

    #define WIN32_LEAN_AND_MEAN 
    #include <windows.h> 
    #include <winsock2.h> 
    
    #pragma comment (lib, "ws2_32.lib") 
    
    #include <iostream> 
    
    int connect_orig(SOCKET /*s*/, const struct sockaddr* /*name*/, int /*namelen*/) { return SOCKET_ERROR; }
    
    int connectDetour(SOCKET s, const struct sockaddr* name, int namelen) 
    { 
        if (name->sa_family == AF_INET)
        {
            const sockaddr_in* internetName = reinterpret_cast<const sockaddr_in*>(name);
            const char* ipAddress = inet_ntoa(internetName->sin_addr); 
            std::cout << "IP Address: " << ipAddress << std::endl; 
        }
        else
        {
            std::cout << "name not of type sockadd_in" << std::endl;
        }
    
        return connect_orig(s, name, namelen); 
    } 
    
    int main() 
    { 
        SOCKET sock = INVALID_SOCKET; 
    
        sockaddr_in name = {}; 
        name.sin_family = AF_INET;
        name.sin_port = htons(1234); 
        name.sin_addr.S_un.S_addr = inet_addr("10.1.44.120"); 
    
        connectDetour(sock, reinterpret_cast<const sockaddr*>(&name), sizeof(name));
    }
    


  • Okay, ich werde mir das heute Abend mal im Debugger anschauen und morgen dann ggf. Detours 3.0 ausprobieren. Zurzeit verwende ich ja die Version 1.5, welche vielleicht recht veraltet scheint.



  • Habe nun selber ein Beispiel Programm geschrieben welches die connect Funktion verwendet und habe dort die dll injiziert. Der debugger spuckt ständig den selben Fehler aus, hier ein Beispiel von Firefox.
    Unbehandelte Ausnahme bei 0x00000010 in firefox.exe: 0xC0000005: Access violation.

    Ich weiß nicht ob ich mir die Mühe machen soll und das ganze mit Detours 3.0 zu testen, den "Access violation" hört sich nicht nach einem Problem von Detours selbst an, oder?

    Die Funktion connect wird ja gefunden und auch mit meiner ersetzt, auch das auslesen der IP funktioniert einwandfrei, doch sobald die Parameter an die Original Funktion weiter gegeben werden, bricht das Programm ab mit "Access violation".

    Langsam verzweifel ich, vorallem weil ich zu Detours 1.5 nicht einmal eine gescheite Doku finde.



  • So, fehler behoben. Für alle die es noch wissen wollen: Man muss __stdcall als calling convention nehmen. 🙂


Anmelden zum Antworten