Una breve descripción de la ofuscación de Warbird en el compilador MSVC
Warbird es un marco de ofuscación utilizado por Microsoft en su tecnología DRM. Admite múltiples formas de ofuscación, incluidos el empaque de código y la ofuscación de la máquina virtual. Se utiliza para proteger los componentes críticos, como la información de PatchGuard y la licencia de los ingenieros inversos.
La funcionalidad de Warbird también se expone a través de la llamada del sistema NtQuerySystemInformation cuando se suministra con la clase de información SystemControlFlowTransition (185). Envía a WbDispatchOperation donde admite la funcionalidad para descifrar y ejecutar una carga útil de cifrado Feistel firmada en el montón. Se puede encontrar más información al respecto en la charla de Alex Ionescu. Otra investigación ha proporcionado información sobre su uso para proteger las imágenes de licencias de clientes e integridad de código.
Dado su uso prevalente de Microsoft, uno debe ser lo suficientemente curioso como para investigar si se encuentran referencias en el compilador MSVC. Las referencias de cadena se pueden descubrir en las imágenes del compilador de backend ( c2.dll ) y linker ( link.exe ).
En ProcessLinkerSwitches , hay varias banderas de enlazador relacionadas con Warbird que se usan internamente:
/wbrdcfg/wbrddll/wbrdlog/wbrdreporterrors/wbrdschema/wbrdsummary/wbrdtestencrypt Si los indicadores de enlace de configuración y DLL Warbird se suministran durante el proceso de construcción del ejecutable, entonces llamará a Warbird::CWarbirdServer::CreateObfuscator2 . La rutina cargará la DLL suministrada por el indicador y llamará a una función exportada llamada CreateObfuscator2 con los argumentos del indicador de enlazador, el tipo de máquina y la base del obfuscador.
Otros nombres de funciones de Warbird revelan que hay transformaciones de código similares a las mencionadas anteriormente.
void __fastcall Enclave::CObfuscationEnclave::Initialize (Enclave::CObfuscationEnclave * this )
{
if ( ( int ) Enclave::CEnclave::AddRuntimeSymbol ((__int64) this , (__int64) " NtQuerySystemInformation " , 0 , 2 ) >= 0
&& ( int ) Enclave::CEnclave::AddRuntimeSymbol ((__int64) this , (__int64) " WarbirdRuntime::EnclaveWrapper " , 1 , 1 ) >= 0 )
{
Enclave::CEnclave::AddRuntimeSymbol ((__int64) this , (__int64) " WarbirdRuntime::g_ulSubSystemCallID " , 2 , 3 );
}
}cl / Zi .examplemain.cpp / link / wbrddll:warbird - obfuscate.dll / wbrdcfg:wbrd.cfgcl.exe: aa9374078fcdce84bca034fd1bb395fdd3825614656e898017435ced17ff1061link.exe: 849e7bd1f234957b5e9be65f94a864e45ea4e05fea598b2164523b398603f61514.28.29336.0