El antivirus solo atrapará ataques amplios o cargas útiles predeterminadas de las herramientas de uso común.
Un atacante experto podrá modificar, codificar u ofuscar su carga útil para evitar este tipo de detección.
Dicho esto, la mayoría de los antivirus también buscarán en el archivo ejecutable las cadenas que solo se encuentran en el malware. Por ejemplo, aquí hay un fragmento de Invoke-Mimikatz.ps1
:
$e_res2Field = $TypeBuilder.DefineField('e_res2', [UInt16[]], 'Public, HasFieldMarshal')
El antivirus puede buscar cadenas como esta dentro del archivo, y luego marcarlo si detecta una coincidencia. Esto también puede ser derrotado con bastante facilidad. Un ejemplo sería tomar el archivo y dividirlo en pequeñas cadenas. Así:
"$e_res2Fi" + "eld = $TypeBui" + "lder.DefineField('e_res2'," + " [UInt16[]], 'Public, HasFieldMarshal')"
(no intenta ser sintácticamente correcto aquí, pero entiendes la idea)
Y luego use un script de envoltorio para juntar las cadenas en la memoria y ejecutar el código original.
Otro ejemplo más común sería encriptar la carga útil primaria y luego descifrar un código auxiliar y ejecutar la carga útil en la memoria.
Algunos antivirus también realizarán análisis dinámicos, donde el archivo se ejecuta en un entorno virtualizado o simulado para detectar las acciones que llevaría a cabo el ejecutable o para analizar la memoria posterior al descifrado.
Este tipo de antivirus generalmente se puede omitir simplemente consumiendo suficiente tiempo o memoria antes de descifrar la carga útil primaria.