RE FORUM

[REVERSE ENGINEERING] => General Discussion => Topic started by: Kockatá hlava on October 30, 2015, 12:27:02 AM

Title: Analýza IL2CPP
Post by: Kockatá hlava on October 30, 2015, 12:27:02 AM
Crackuju teď nějaký hry postavený na Unity engine (http://unity3d.com). O ten engine ani moc nejde, protože se skriptuje v C#, takže jde hlavně o dekompilaci kódu a jeho patchování, což je celkem snadná věc. Zajímavý na tom je, že ten engine přechází na svůj vlastní kompilátor bytekódu do C kódu. Teprve ten se potom kompiluje do nativního kódu.

To bych měl trochu vysvětlit. Jak na Windows, tak na Linuxu nebo Androidu ten zkompilovanej C# kód hry běží na alternativní implementaci .NET runtime, co se jmenuje Mono. Unity má s tím Mono ale různý problémy, takže vytvořili IL2CPP. Celý to funguje takhle:


Vypadá to podivně, ale má to svůj hlubší smysl. O IL2CPP existuje série článků (http://blogs.unity3d.com/2015/05/06/an-introduction-to-ilcpp-internals/), kde se dá dočíst víc. Bacha na to, že v těch článcích se IL2CPP popisuje jako "virtual machine", což není pravda. Je to prostě nestandardní kompiler a nestandardníma knihovnama. Další věc je, že IL2CPP ve skutečnosti nevytváří C++ kód, ale hlavně plain C kód.

Hodně herních vývojářů jásá, že jim IL2CPP mimojiné přinese určitou ochranu kódu. Problém je v tom, že neoddělitelnou součástí .NET modulu jsou metadata. Jsou to hlavně tyhle metadata, díky kterým se ty moduly dají dekompilovat téměř do původní podoby. Protože metadata nejdou prostě odstranit, IL2CPP je přenáší do C kódu ve formě propietárních struktur. Jejich deklarace jsou pěkně vidět v hlavičkových souborech generovanýho kódu, takže jsou v podstatě open source.

Část metadat se skutečně ztratí kompilací do strojovýho kódu, ale definice "náhradních" struktur metadat zůstanou i po kompilaci. Pro zajímavost, část jedné z nejdůležitějších struktur vypadá takhle. Deklarace je v generovaným souboru vidět v souboru libil2cpp\include\class-internals.h. Komentáře jsou moje.

Code: [Select]
struct MethodInfo
{
const char* name;   // jméno metody
methodPointerType method;
TypeInfo *declaring_type;   // kompletní kontext info o třídě, modulu atd., kde se metoda nachází
const Il2CppType *return_type;   // typ návratové hodnoty
InvokerMethod invoker_method;
ParameterInfo* parameters;   // typy parametrů

Momentálně sepisuju první verzi výzkumu, jehož cílem je ukázat, že IL2CPP zabrání crackování jenom začátečníkům. Pokud bude čas, chtěl bych taky udělat konkrétní ukázku, jak ze zkompilovanýho kódu dostat co nejlepší C zdrojáky, třeba přes plugin, co nakrmí Idu z těch propietárních metadat, a potom to prohnat přes dekompiler.

Byl bych rád, kdyby se do toho ještě někdo zapojil. Podle všeho podobnej výzkum ještě nebyl publikovanej, byli bysme první (pokud něco najdete, dejte vědět). Pište sem, nebo přes PM, nebo na mazegen@gmail.com.
Title: Re: Analýza IL2CPP
Post by: DARKER on October 30, 2015, 12:01:08 PM
No vysledkom by mohol byt daky zaujimavy tool ....
Inac zaujimave riesenie, ze sa to prezenie az tolkymi "kompilermi/konvertormi" aby dostali vysledny output - ale usetria si pracu parsovanim a kontrolou, kedze parsovanie uz hotoveho .NET je urcite jednoduchsie ako parsovanie C#.
A ostavaju tam tieto data aj pokial sa pouzije parameter –output-format=Compact ?
Title: Re: Analýza IL2CPP
Post by: Kockatá hlava on October 30, 2015, 11:18:13 PM
Ten –output-format=Compact ještě ověřím, ale nejspíš jenom odstraní názvy metod atd. a nahradí je co nejkratším generovaným řetězcem. To by mohlo ztížit pochopení kódu, ale v praxi je dost možný, že u spousty her se ten parametr stejně nebude používat, protože ho prostě nikdo nepřidá :)
Title: Re: Analýza IL2CPP
Post by: pr0p4g4nd4 on September 17, 2016, 10:58:52 AM
ten vyskum mas uz napisany? poprosil by som si ho. :P
Title: Re: Analýza IL2CPP
Post by: Kockatá hlava on September 17, 2016, 11:43:34 AM
Poslal jsem ti ho na mail. Kdyby mel jeste nekdo zajem, dejte vedet.