Tinjauan singkat tentang kebingungan Warbird di kompiler MSVC
Warbird adalah kerangka kebingungan yang digunakan oleh Microsoft dalam teknologi DRM mereka. Ini mendukung berbagai bentuk kebingungan termasuk pengemasan kode dan kebingungan virtual-mesin. Ini digunakan untuk melindungi komponen -komponen penting seperti PatchGuard dan informasi lisensi dari insinyur terbalik.
Fungsionalitas Warbird juga diekspos melalui panggilan sistem NtQuerySystemInformation ketika disediakan dengan kelas informasi SystemControlFlowTransition (185). Ini mengirim ke WbDispatchOperation di mana ia mendukung fungsionalitas untuk mendekripsi dan menjalankan muatan cipher feistel yang ditandatangani di tumpukan. Informasi lebih lanjut mengenai hal itu dapat ditemukan dalam pembicaraan Alex Ionescu. Penelitian lain telah memberikan wawasan tentang penggunaannya untuk melindungi lisensi klien dan gambar integritas kode.
Mengingat penggunaannya yang lazim oleh Microsoft, seseorang harus cukup penasaran untuk menyelidiki apakah ada referensi yang ditemukan dalam kompiler MSVC. Referensi string dapat ditemukan di gambar backend compiler ( c2.dll ) dan linker ( link.exe ).
Di ProcessLinkerSwitches , ada beberapa bendera penghubung yang terkait dengan Warbird yang digunakan secara internal:
/wbrdcfg/wbrddll/wbrdlog/wbrdreporterrors/wbrdschema/wbrdsummary/wbrdtestencrypt Jika konfigurasi dan DLL Warbird Linker bendera disediakan selama proses pembangunan yang dapat dieksekusi maka itu akan memanggil Warbird::CWarbirdServer::CreateObfuscator2 . Rutin akan memuat DLL yang disediakan oleh bendera dan memanggil fungsi yang diekspor bernama CreateObfuscator2 dengan argumen bendera linker, jenis mesin dan basis obfuscator.
Nama fungsi Warbird lainnya mengungkapkan bahwa ada transformasi kode yang mirip dengan yang disebutkan sebelumnya.
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