diff options
| author | stderr64 <stderr64@null.net> | 2026-08-02 23:25:46 +0300 |
|---|---|---|
| committer | stderr64 <stderr64@null.net> | 2026-08-02 23:25:46 +0300 |
| commit | 93bf2805ba66b628d0187637c85f86f2ae7eb4a1 (patch) | |
| tree | d33b2879182966a22f694532cf306ce7e3145b5e /extract_decoded_executable/encrypter.c | |
| parent | 2e2d8c94e2355e6beae219cb3b7a0684ef1f1aa1 (diff) | |
| download | experiments-93bf2805ba66b628d0187637c85f86f2ae7eb4a1.tar.gz experiments-93bf2805ba66b628d0187637c85f86f2ae7eb4a1.tar.zst | |
Added RNG based encryption to the code to extract binary from define value
Diffstat (limited to 'extract_decoded_executable/encrypter.c')
| -rw-r--r-- | extract_decoded_executable/encrypter.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/extract_decoded_executable/encrypter.c b/extract_decoded_executable/encrypter.c new file mode 100644 index 0000000..34732cb --- /dev/null +++ b/extract_decoded_executable/encrypter.c @@ -0,0 +1,70 @@ +#include <stdlib.h> +#include <stdio.h> +#include <stdbool.h> +#include <errno.h> +#include <unistd.h> +#include <fcntl.h> +#include <string.h> +#include <math.h> +#include <sys/stat.h> +#include "rng.h" + +void encrypt_test_binary(){ + init_rng(); + unsigned char enc_key[256]; + memset( (void*)&enc_key, 0, sizeof(enc_key) ); + size_t k_size = 0; + for ( ; k_size < 256; k_size++ ) + enc_key[k_size] = (unsigned char)get_random_int( 1, 255 ); + struct stat test_bin_info; + memset( (void*)&test_bin_info, 0, sizeof(struct stat) ); + if ( stat("./test_binary", &test_bin_info) == -1 ){ + fprintf( stderr, "Failed to stat: %s\n", strerror(errno) ); + return; + } + if ( !((test_bin_info.st_mode & S_IFMT) == S_IFREG) ){ + fputs( "Error: test binary is not regular file\n", stderr ); + return; + } + unsigned char *test_bin_bytes = (unsigned char*)calloc( (size_t)test_bin_info.st_size, sizeof(unsigned char) ); + if ( test_bin_bytes == NULL ){ + fprintf( stderr, "Error: failed to allocate memory for reading test binary: %s\n", strerror(errno) ); + return; + } + int test_bin_fd = open( "./test_binary", O_RDONLY, 0755 ); + if ( test_bin_fd == -1 ){ + fprintf( stderr, "Error: failed to open test binary for encryption: %s\n", strerror(errno) ); + free( test_bin_bytes ); + return; + } + if ( read(test_bin_fd, (void*)test_bin_bytes, (size_t)test_bin_info.st_size) == -1 ){ + fprintf( stderr, "Error: failed to read test binary bytes: %s\n", strerror(errno) ); + close( test_bin_fd ); + free( test_bin_bytes ); + return; + } + close( test_bin_fd ); + size_t encrypted_bytes = 0; + for ( ; encrypted_bytes < (size_t)test_bin_info.st_size; encrypted_bytes++ ) + test_bin_bytes[encrypted_bytes] = test_bin_bytes[encrypted_bytes] ^ enc_key[(size_t)test_bin_info.st_size % 255]; + test_bin_fd = open( "./test_binary", O_RDWR | O_CREAT | O_TRUNC ); + if ( test_bin_fd == -1 ){ + fprintf( stderr, "Error: failed to open test binary for writing: %s\n", strerror(errno) ); + free( test_bin_bytes ); + return; + } + if ( write(test_bin_fd, (const void*)test_bin_bytes, (size_t)test_bin_info.st_size) == -1 ){ + fprintf( stderr, "Error: failed to write encrypted test binary: %s\n", strerror(errno) ); + close( test_bin_fd ); + free( test_bin_bytes ); + return; + } + close( test_bin_fd ); + free( test_bin_bytes ); + return; +} + +int main( int argc, char *const *args ){ + encrypt_test_binary(); + return 0; +} |
