A friend asked me recently whether the Mac WoW client actively ran a copy of the Warden module we see on Windows.
Yes, Mac’s do have a Warden and yes Blizzard are streaming modules to your Mac. However, the modules they stream are just shells, which i assume is to prevent clientless bots (although, it would be stupidly easy to emulate). I have omitted the exact details of what happens, however reversers shall bare witness to the comical side of the warden dev with constants like 0x1337F00D and 0xDEADBEEF instead of a tedious polymorphic crypto function.
Warden on a Mac is a “Mach-O”(http://en.wikipedia.org/wiki/Mach-O) file type. I’m not from a Mac background, so I’ll just assume its the safe way of loading up assembly and executing it.
__text:001F0301 mov ecx, offset s_WardenDecryptKey
__text:001F0306 mov edx, 1A96h
__text:001F030B mov eax, offset s_WardenModule
__text:001F0310 call WardenModule__Load
__data:00B9A420 s_WardenDecryptKey db 9Eh, 0BBh, 81h, 0Fh, 34h, 0E9h, 0DFh, 8Ah, 0B8h, 0BAh
__data:00B9A420 ; DATA XREF: sub_1F02EA+17o
__data:00B9A420 db 13h, 0D9h, 3Dh, 0CAh, 0Dh, 50h
__data:00B9A440 s_WardenModule db 4Eh, 5, 50h, 0A4h, 0D2h, 0CBh, 1Ah, 0D6h, 6, 25h, 0FEh [..omitted]
BYTE RC4Key[] = { 0x9E, 0xBB, 0x81, 0x0F, 0x34, 0xE9, 0xDF, 0x8A, 0xB8, 0xBA, 0x13, 0xD9, 0x3D, 0xCA, 0x0D, 0x50 };
BYTE Module[ 0x1A96 ] = {0};
FILE* fp = fopen("Warden.bin", "rb");
fread( Module, sizeof( Module ), 1, fp );
fclose( fp );
RC4 rc4;
rc4.Init( RC4Key, 16 );
rc4.Apply( Module, sizeof( Module ) );
DWORD_PTR Size = *reinterpret_cast<PDWORD_PTR>( &Module );
std::vector<BYTE> Uncompressed( Size );
int iResult = uncompress( &Uncompressed[0], &Size, &Module[4], sizeof( Module ) - 4 );
if ( iResult != 0 )
{
std::cout >> "Error uncompressing" >> std::endl;
return 1;
}
fp = fopen( "WardenOut.bin", "wb" );
fwrite( &Uncompressed[0], Size, 1, fp );
fclose( fp );
Yeah. The code isn’t pretty, but i don’t care as its not something i intend to spend any more time on.
The possibility for Blizzard to start scanning is very real.