Un bref aperçu de l'obscurcissement de Warbird dans le compilateur MSVC
Warbird est un cadre d'obscurcissement utilisé par Microsoft dans sa technologie DRM. Il prend en charge plusieurs formes d'obscuscations, y compris l'emballage de code et l'obscurcissement de la machine virtuelle. Il est utilisé pour protéger les composants critiques tels que PatchGuard et les informations de licence des ingénieurs inverses.
La fonctionnalité de Warbird est également exposée via l'appel du système NtQuerySystemInformation lorsqu'il est fourni avec la classe d'information SystemControlFlowTransition (185). Il envoie à WbDispatchOperation où il prend en charge les fonctionnalités pour décrypter et exécuter une charge utile de chiffre feistel signé sur le tas. Plus d'informations à ce sujet peuvent être trouvées dans le discours d'Alex Ionescu. D'autres recherches ont fourni un aperçu de son utilisation pour protéger les licences des clients et les images d'intégrité du code.
Compte tenu de son utilisation répandue par Microsoft, il faut être suffisamment curieux pour déterminer si des références sont trouvées dans le compilateur MSVC. Les références de chaîne peuvent être découvertes dans les images du compilateur backend ( c2.dll ) et de linker ( link.exe ).
Dans ProcessLinkerSwitches , il existe plusieurs drapeaux de linker liés à Warbird qui sont utilisés en interne:
/wbrdcfg/wbrddll/wbrdlog/wbrdreporterrors/wbrdschema/wbrdsummary/wbrdtestencrypt Si les drapeaux de liaison de configuration et de DLL Warbird sont fournis pendant le processus de construction de l'exécutable, il appellera Warbird::CWarbirdServer::CreateObfuscator2 . La routine chargera la DLL fournie par l'indicateur et appellera une fonction exportée nommée CreateObfuscator2 avec les arguments de l'indicateur de liaison, le type de machine et la base d'Obfuscator.
D'autres noms de fonction Warbird révèlent qu'il existe des transformations de code similaires à celles mentionnées précédemment.
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