horriblebyte Tekrardan selamlar,
biraz araştırma sonucu az çok bir şeyler anladım sanırım.
Kimse bu aletin ne işe yaradığını söylememiş. Lakin bir grup veya kişi bir dumper yapmış. Bu dumper ile offset ve RVA değerleri alınabiliyor. HEX kodu ile ilgili yerler bulunabiliyor. Elime tam anlamıyla build edilmiş bir dosya gelmedi (bunun için geliştirme ortamım bulunmadığı için oluşturamadım.). Şimdi bu IL2CPP'nin hikayesine gelelim.
IL2CPP, AOT tipi bir derleyicimiş. Bunun açılımı ahead-of-time olarak geçer. Kullanmalarının sebebi hız, performans ve güvenlik sebepliymiş. Çalışma zamanında sanal makine tarafında kütüphaneleri destekliyor. Bu sebeple de aslında teknolojinin iyi bir düzeyde olduğundan bahsedebiliriz. AOT muhabettine gelince. AOT'un görevi .NET ile derlenen düşük seviyeli çıktıyı IL'ye çeviriyor. Sonrasında ise onu da C++ kaynak koduna. IL2Cpp unity ile birlikte gelen, platforma özgü bir teknoloji. Çalışma mantığı aşağıdaki gibi;
Komut satırları ile ilgili exe, dll veya apk il2cpp ile dönüştürülüyor.
Örneğin;
"C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\bin\mono.exe" "C:\Program Files\Unity\Editor\Data\il2cpp/il2cpp.exe" --copy-level=None --enable-generic-sharing --enable-unity-event-support --output-format=Compact --extra-types.file="C:\Program Files\Unity\Editor\Data\il2cpp\il2cpp_default_extra_types.txt" "C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\Assembly-CSharp.dll" "C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\UnityEngine.UI.dll" "C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\il2cppOutput"
Biraz uzun gelmiş olabilir. Bir kaynak vereceğim. Komutların ve il2cpp için çok ayrıntılı bir anlatım mevcut.
Kısaca bu teknoloji genelde android ürünler başta olmak üzere daha güvenli ve c++ performansı ile (Native olarak derlenmesi başta geliyor.) güvenliğinden yararlanmak için geliştirilmekte.
Üsteki yazıyı yazarken bir resim gözüme çarptı ve Native noktasında doğru tahmin ettiğim ortaya çıktı;
Buradan anlıyorum ki güvenlikten öte amaç boyuttan kazanmak ve performansı en üst seviyeye taşımak. Malumunuz native şekilde çıktı her zaman daha hızlıdır. Bunun sebebi direkt olarak işletim sistemi API ve kütüphaneleri ile iletişime geçer. .NET aracı bir uygulama ile iletişime geçiyor. Bu sebeple araya bir reflector ekleyince tüm kodlar açık şekilde meydana dökülüyor. Bu olay C# için belki bir nebze güvenliği arttırabilir ama dediğiniz gibi direkt olarak kodları başarılı bir şekilde dönüştürür mü bilemiyorum. Tahminimce unity bunun için çok fazla kontroller ve müdahalede bulunuyor. Dediğim gibi ne kadar kodlar görünmese de IDA ve benzeri bir araç ile offset değerlerine göre ilgili satır bulunup HEX ile değişiklik yapılabilir. Bunun yanı sıra bazen HEX durumunda bir Olly gibi rahatça müdahale olmuyor pek. Hele ki ASM veya ARM tipinde bir çıktı verirse. Bu kez ilgili offset için jmp komutları sıraya giriyor. KeyPatch vs. vs. ben devam edersem başka konulara dalacağım burada keseyim 😃
Atmış olduğunuz repoda ki bir bilette şu cevabı gördüm;
This project has stopped developing.
In the past year, I was trying to integrate garbage collector with c++, but this is an internal project, sorry.
Geliştirmesi en azından attığınız kaynak kısmında durdurulmuş gibi duruyor.
Kaynaklar:
Ayrıntılı IL2CPP Anlatımı
İlgili Dumper
İlgili Dumper Kullanımı
Eski adıyla Bytecode stripping
IL2CPP Kullanım Mantığı
Umarım sorunuza yanıt olmuştur,
ya da sorunuzu doğru anlamışımdır 🙂