Buenas noches.
Sé que tengo un hilo abierto en paralelo en este foro para destripar el Ransomware Blackhunt 2.0 pero esta duda creo que puede abordarse en este foro.
Al descompilar el ejecutable del ransomware se ha generado este codigo pseudo C, que después de analizar y estudiar he podido llegar a la conclusión de que la clave que cifra el fichero de la clave privada con la que se desencriptan los archivos, se genera con este código que os expongo a continuación.
int32_t pbData = 0x206
if (calcularCRC32(&pbData, 0x114) != 0x4401dddf)
{
escribirLog(u"KEY ERROR #100");
Sleep(0x4b0);
ExitProcess(1);
/* no return */
}
// sub_407070
int32_t __fastcall calcularCRC32(int32_t arg1, int32_t arg2)
{
// Inicializar eax a -1 (0xFFFFFFFF)
int32_t eax = 0xffffffff;
// Puntero para iterar sobre los datos
void* esi = nullptr;
// Si la longitud de los datos (arg2) no es cero, proceder con el cálculo de CRC
if (arg2 != 0)
{
do
{
// Cargar un byte de los datos
uint32_t edx = *(esi + arg1); // Leer un byte de los datos
esi = (esi + 1); // Avanzar el puntero
// Actualizar el valor de CRC
int32_t eax_1 = (eax ^ edx);
int32_t ecx_4 = ((-((eax_1 & 1)) & 0xedb88320) ^ (eax_1 >> 1));
int32_t eax_7 = ((-((ecx_4 & 1)) & 0xedb88320) ^ (ecx_4 >> 1));
int32_t ecx_10 = ((-((eax_7 & 1)) & 0xedb88320) ^ (eax_7 >> 1));
int32_t eax_13 = ((-((ecx_10 & 1)) & 0xedb88320) ^ (ecx_10 >> 1));
int32_t ecx_16 = ((-((eax_13 & 1)) & 0xedb88320) ^ (eax_13 >> 1));
int32_t eax_19 = ((-((ecx_16 & 1)) & 0xedb88320) ^ (ecx_16 >> 1));
int32_t ecx_22 = ((-((eax_19 & 1)) & 0xedb88320) ^ (eax_19 >> 1));
eax = ((-((ecx_22 & 1)) & 0xedb88320) ^ (ecx_22 >> 1));
} while (esi < arg2);
}
// Retornar la negación del valor final de CRC
return !(eax);
}
/*
data_478108_manejador_servicios_criptograficos: Es probable que sea un manejador (handle) para el contexto del proveedor de servicios criptográficos (CSP).
&pbData: Apunta a la clave a ser importada. pbData contiene la clave en formato binario.
0x114: Es el tamaño de la clave en bytes (276 bytes en decimal).
0: Este parámetro podría ser el identificador de una clave pública o privada que se va a usar para la importación. En este caso, se pasa 0, indicando que no se usa ninguna clave adicional para el proceso.
0: Bandera de opciones adicionales, en este caso se pasa 0, lo que indica que no hay opciones adicionales.
&data_47a328: Apunta a una variable que recibirá el manejador de la clave importada.
*/
if (CryptImportKey(data_478108_manejador_servicios_criptograficos, &pbData, 0x114, 0, 0, &data_47a328) == 0)
{
escribirLog(u"CryptImportKey failed!!");
@__security_check_cookie@4((eax_1 ^ &__saved_ebp));
return 0;
}
La función calcularCRC32 no entiendo qué es lo que hace, puede que el nombre no sea acertado, pero si me ayudáis a interpretarla estaré un paso mas cerca de finalizar la investigación.
Muchas gracias.