Author Topic: Analýza IL2CPP  (Read 932 times)

Kockatá hlava

  • Junior Member
  • ***
  • Posts: 134
  • n00b
    • x86asm.net
Analýza IL2CPP
« on: October 30, 2015, 12:27:02 AM »
Crackuju teď nějaký hry postavený na Unity engine. 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:

  • C# kód hry se klasicky zkompiluje do .NET DLL modulu (do bytekódu)
  • modul (.NET DLL) se nestandardně zkompiluje do C zdrojovýho kódu pomocí IL2CPP
  • C zdroják se normálně zkompiluje do nativního kódu cílové platformy (ARM, x86, ...)

Vypadá to podivně, ale má to svůj hlubší smysl. O IL2CPP existuje série článků, 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.

DARKER

  • [SCF]
  • Administrator
  • Senior Member
  • *****
  • Posts: 336
Re: Analýza IL2CPP
« Reply #1 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 ?

Kockatá hlava

  • Junior Member
  • ***
  • Posts: 134
  • n00b
    • x86asm.net
Re: Analýza IL2CPP
« Reply #2 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á :)

pr0p4g4nd4

  • [SCF]
  • Senior Member
  • ****
  • Posts: 429
Re: Analýza IL2CPP
« Reply #3 on: September 17, 2016, 10:58:52 AM »
ten vyskum mas uz napisany? poprosil by som si ho. :P
Aký je rozdiel medzi mladým a starým chlapom?
Mladému behá piča po rozume, starému po byte...

Kto robí je robot, kto koktá je.. koktavý!

Kockatá hlava

  • Junior Member
  • ***
  • Posts: 134
  • n00b
    • x86asm.net
Re: Analýza IL2CPP
« Reply #4 on: September 17, 2016, 11:43:34 AM »
Poslal jsem ti ho na mail. Kdyby mel jeste nekdo zajem, dejte vedet.