Другая игра Помогите с il2cpp, или как сдампить нараку?

n1ce0n3

Новичок
Автор темы
4
0
Собственно, игра шифрует каким-то образом метадату, дамперы не работают, т.к. не валидный файл, меджик у него тоже не стандартный (как и размер файла).
Просьба помочь, т.к. перечитал всю возможную инфу, которую смог найти (даже на китайских сайтах) - результата ноль.
Скачал билд юнити, который они юзали (2019.4.14f1), скомпайлил пустой проэкт - функция, которая загружает файл метадаты - выглядит таким образом:
Код:
.text:00000001800BC390 ; =============== S U B R O U T I N E =======================================
.text:00000001800BC390
.text:00000001800BC390 ; Attributes: bp-based frame
.text:00000001800BC390
.text:00000001800BC390 ; bool __fastcall il2cpp::vm::MetadataCache::Initialize()
.text:00000001800BC390 ?Initialize@MetadataCache@vm@il2cpp@@SA_NXZ proc near
.text:00000001800BC390                                         ; CODE XREF: il2cpp::vm::Runtime::Init(char const *)+F0↑p
.text:00000001800BC390                                         ; DATA XREF: .pdata:00000001809BAE9C↓o
.text:00000001800BC390
.text:00000001800BC390 path            = std::string ptr -60h
.text:00000001800BC390 managedMethods  = std::vector<MethodDefinitionKey> ptr -40h
.text:00000001800BC390 result          = std::string ptr -28h
.text:00000001800BC390 var_s0          = byte ptr  0
.text:00000001800BC390 arg_0           = qword ptr  30h
.text:00000001800BC390 arg_8           = qword ptr  38h
.text:00000001800BC390 arg_10          = qword ptr  40h
.text:00000001800BC390 arg_18          = qword ptr  48h
.text:00000001800BC390
.text:00000001800BC390 ; __unwind { // __CxxFrameHandler4
.text:00000001800BC390                 mov     [rsp-28h+arg_8], rbx
.text:00000001800BC395                 mov     [rsp-28h+arg_10], rsi
.text:00000001800BC39A                 mov     [rsp-28h+arg_18], rdi
.text:00000001800BC39F                 push    rbp
.text:00000001800BC3A0                 push    r12
.text:00000001800BC3A2                 push    r13
.text:00000001800BC3A4                 push    r14
.text:00000001800BC3A6                 push    r15
.text:00000001800BC3A8                 mov     rbp, rsp
.text:00000001800BC3AB                 sub     rsp, 80h
.text:00000001800BC3B2                 lea     rcx, fileName   ; "global-metadata.dat"
.text:00000001800BC3B9                 call    ?LoadMetadataFile@MetadataLoader@vm@il2cpp@@SAPEAXPEBD@Z ; il2cpp::vm::MetadataLoader::LoadMetadataFile(char const *)
.text:00000001800BC3BE                 mov     cs:s_GlobalMetadata, rax
.text:00000001800BC3C5                 test    rax, rax
.text:00000001800BC3C8                 jz      loc_1800BCA74
.text:00000001800BC3CE                 mov     cs:s_GlobalMetadataHeader, rax
.text:00000001800BC3D5                 mov     rax, cs:s_Il2CppMetadataRegistration
.text:00000001800BC3DC                 movsxd  rcx, dword ptr [rax+30h] ; count
.text:00000001800BC3E0                 mov     edx, 8          ; size
.text:00000001800BC3E5                 call    ?Calloc@Memory@utils@il2cpp@@SAPEAX_K0@Z ; il2cpp::utils::Memory::Calloc(unsigned __int64,unsigned __int64)
.text:00000001800BC3EA                 mov     cs:s_TypeInfoTable, rax
.text:00000001800BC3F1                 mov     rax, cs:s_GlobalMetadataHeader
.text:00000001800BC3F8                 movsxd  rcx, dword ptr [rax+0A4h]
.text:00000001800BC3FF                 mov     rax, 642C8590B21642C9h
.text:00000001800BC409                 mul     rcx
.text:00000001800BC40C                 sub     rcx, rdx
.text:00000001800BC40F                 shr     rcx, 1
.text:00000001800BC412                 add     rcx, rdx
.text:00000001800BC415                 shr     rcx, 6          ; count
.text:00000001800BC419                 mov     edx, 8          ; size
.text:00000001800BC41E                 call    ?Calloc@Memory@utils@il2cpp@@SAPEAX_K0@Z ; il2cpp::utils::Memory::Calloc(unsigned __int64,unsigned __int64)
.text:00000001800BC423                 mov     cs:s_TypeInfoDefinitionTable, rax
.text:00000001800BC42A                 mov     rax, cs:s_GlobalMetadataHeader
.text:00000001800BC431                 movsxd  rcx, dword ptr [rax+34h]
.text:00000001800BC435                 shr     rcx, 5          ; count
.text:00000001800BC439                 mov     edx, 8          ; size
.text:00000001800BC43E                 call    ?Calloc@Memory@utils@il2cpp@@SAPEAX_K0@Z ; il2cpp::utils::Memory::Calloc(unsigned __int64,unsigned __int64)
.text:00000001800BC443                 mov     cs:s_MethodInfoDefinitionTable, rax
.text:00000001800BC44A                 mov     rax, cs:s_Il2CppMetadataRegistration
.text:00000001800BC451                 movsxd  rcx, dword ptr [rax+40h] ; count
.text:00000001800BC455                 mov     edx, 8          ; size
.text:00000001800BC45A                 call    ?Calloc@Memory@utils@il2cpp@@SAPEAX_K0@Z ; il2cpp::utils::Memory::Calloc(unsigned __int64,unsigned __int64)
.text:00000001800BC45F                 mov     cs:s_GenericMethodTable, rax
.text:00000001800BC466                 mov     rax, cs:s_GlobalMetadataHeader
.text:00000001800BC46D                 movsxd  rcx, dword ptr [rax+0ACh]
.text:00000001800BC474                 mov     rax, 0CCCCCCCCCCCCCCCDh
.text:00000001800BC47E                 mul     rcx
.text:00000001800BC481                 shr     rdx, 5
.text:00000001800BC485                 mov     cs:s_ImagesCount, edx
.text:00000001800BC48B                 movsxd  rcx, edx        ; count
.text:00000001800BC48E                 mov     edx, 50h ; 'P'  ; size
.text:00000001800BC493                 call    ?Calloc@Memory@utils@il2cpp@@SAPEAX_K0@Z ; il2cpp::utils::Memory::Calloc(unsigned __int64,unsigned __int64)
.text:00000001800BC498                 mov     cs:s_ImagesTable, rax
.text:00000001800BC49F                 mov     rax, cs:s_GlobalMetadataHeader
.text:00000001800BC4A6                 movsxd  rcx, dword ptr [rax+0B4h]
.text:00000001800BC4AD                 mov     rax, 0F0F0F0F0F0F0F0F1h
.text:00000001800BC4B7                 mul     rcx
.text:00000001800BC4BA                 shr     rdx, 6
.text:00000001800BC4BE                 mov     cs:s_AssembliesCount, edx
.text:00000001800BC4C4                 movsxd  rcx, edx        ; count
.text:00000001800BC4C7                 mov     edx, 60h ; '`'  ; size
.text:00000001800BC4CC                 call    ?Calloc@Memory@utils@il2cpp@@SAPEAX_K0@Z ; il2cpp::utils::Memory::Calloc(unsigned __int64,unsigned __int64)
.text:00000001800BC4D1                 mov     cs:s_AssembliesTable, rax
.text:00000001800BC4D8                 mov     r9, cs:s_GlobalMetadataHeader
.text:00000001800BC4DF                 movsxd  rdi, dword ptr [r9+0A8h]
.text:00000001800BC4E6                 mov     r10, cs:s_GlobalMetadata
.text:00000001800BC4ED                 add     rdi, r10
.text:00000001800BC4F0                 xor     esi, esi
.text:00000001800BC4F2                 mov     r12d, esi
.text:00000001800BC4F5                 mov     r11d, cs:s_ImagesCount
.text:00000001800BC4FC                 test    r11d, r11d
.text:00000001800BC4FF                 jle     loc_1800BC6F1
.text:00000001800BC505                 mov     r15d, esi
.text:00000001800BC508                 nop     dword ptr [rax+rax+00000000h]

Сиг мейкер помог с сигнатурой -
"48 89 5C 24 10 48 89 74 24 18 48 89 7C 24 20 55 41 54 41 55 41 56 41 57 48 8B EC 48 81", либо же более длинный вариант:
"48 89 5C 24 10 48 89 74 24 18 48 89 7C 24 20 55 41 54 41 55 41 56 41 57 48 8B EC 48 81 EC 80 00 00 00"
Интересно, что по сигнатуре в GameAssembly - ничего нету, но чит енжином в рантайме процесса находит эту же сигнатуру в GameAssembly. Помимо этого - находит ещё 3 в UnityPlayer.dll..


Первая функция выглядит вот так:
7FF9534B1850 - 48 89 5C 24 10 - mov [rsp+10],rbx
7FF9534B1855 - 48 89 74 24 18 - mov [rsp+18],rsi
7FF9534B185A - 48 89 7C 24 20 - mov [rsp+20],rdi
7FF9534B185F - 55 - push rbp
7FF9534B1860 - 41 54 - push r12
7FF9534B1862 - 41 55 - push r13
7FF9534B1864 - 41 56 - push r14
7FF9534B1866 - 41 57 - push r15
7FF9534B1868 - 48 8B EC - mov rbp,rsp
7FF9534B186B - 48 81 EC 80000000 - sub rsp,00000080 { 128 }
7FF9534B1872 - 48 8D 05 3FAC5D01 - lea rax,[7FF954A8C4B8] { ("key0") } <<< тут в оригинале "global-metadata.dat"



Вторая:
7FF953DCFDF0 - 48 89 5C 24 10 - mov [rsp+10],rbx
7FF953DCFDF5 - 48 89 74 24 18 - mov [rsp+18],rsi
7FF953DCFDFA - 48 89 7C 24 20 - mov [rsp+20],rdi
7FF953DCFDFF - 55 - push rbp
7FF953DCFE00 - 41 54 - push r12
7FF953DCFE02 - 41 55 - push r13
7FF953DCFE04 - 41 56 - push r14
7FF953DCFE06 - 41 57 - push r15
7FF953DCFE08 - 48 8B EC - mov rbp,rsp
7FF953DCFE0B - 48 81 EC 80000000 - sub rsp,00000080 { 128 }
7FF953DCFE12 - 66 0F6E 81 1C010000 - movd xmm0,[rcx+0000011C] <<< тут в оригинале "global-metadata.dat"


Третья:
7FF953FA6B40 - 48 89 5C 24 10 - mov [rsp+10],rbx
7FF953FA6B45 - 48 89 74 24 18 - mov [rsp+18],rsi
7FF953FA6B4A - 48 89 7C 24 20 - mov [rsp+20],rdi
7FF953FA6B4F - 55 - push rbp
7FF953FA6B50 - 41 54 - push r12
7FF953FA6B52 - 41 55 - push r13
7FF953FA6B54 - 41 56 - push r14
7FF953FA6B56 - 41 57 - push r15
7FF953FA6B58 - 48 8B EC - mov rbp,rsp
7FF953FA6B5B - 48 81 EC 80000000 - sub rsp,00000080 { 128 }
7FF953FA6B62 - 8B 41 10 - mov eax,[rcx+10] <<< тут в оригинале "global-metadata.dat"



И один из GameAssembly.dll:

7FF967750C60 - 48 89 5C 24 10 - mov [rsp+10],rbx
7FF967750C65 - 48 89 74 24 18 - mov [rsp+18],rsi
7FF967750C6A - 48 89 7C 24 20 - mov [rsp+20],rdi
7FF967750C6F - 55 - push rbp
7FF967750C70 - 41 54 - push r12
7FF967750C72 - 41 55 - push r13
7FF967750C74 - 41 56 - push r14
7FF967750C76 - 41 57 - push r15
7FF967750C78 - 48 8B EC - mov rbp,rsp
7FF967750C7B - 48 81 EC 80000000 - sub rsp,00000080 { 128 }
7FF967750C82 - 4C 8B F1 - mov r14,rcx <<< тут в оригинале "global-metadata.dat"



Нигде, кроме key0 - никакого читаемого текста нету, при подключении дебаггера - игра сразу крашится, пытался хукнуть или эту функцию, или il2cpp::vm::MetadataLoader::LoadMetadataFile(const char *fileName) - тоже результата ноль, и, собственно, на данном этапе у меня ступор. Ищу помощи, спасибо.




UnityPlayer.dll https://drive.google.com/file/d/1MdRapJWAK1UijbPlmev_i557L-NjtcPu/view?usp=sharing
GameAssembly.dll https://drive.google.com/file/d/1Qe51uzDlGRH4TQiCThswLrdc1Wt9MfOJ/view?usp=sharing
global-metadata.dat https://drive.google.com/file/d/10qP2SmCyv3sI_alVB5jnzoYNCSjPSFZV/view?usp=sharing


На unknowncheats видел, что раньше людям помогал Il2CppRuntimeDumper - но ничего с ним так же не удалось..
 

n1ce0n3

Новичок
Автор темы
4
0
Всякие дамперы и инжекторы жалуются на то, что там нет нужных экспортов, походу их почистили просто.. И добавили пару фейковых схожих методов, что бы усложнить реверс.

C++:
il2cpp: couldn't resolve export il2cpp_domain_get
at r (/node_modules/frida-il2cpp-bridge/dist/index.js:594:45)
at Object.get domainGet (/node_modules/frida-il2cpp-bridge/dist/index.js:344:20)
at Object.descriptor.get [as domainGet] (/node_modules/frida-il2cpp-bridge/dist/index.js:41:30)
at Object. (/node_modules/frida-il2cpp-bridge/dist/index.js:1992:45)
at Object.descriptor.get (/node_modules/frida-il2cpp-bridge/dist/index.js:41:30)
at Object.perform (/node_modules/frida-il2cpp-bridge/dist/index.js:1110:31)







System.TypeInitializationException: The type initializer for 'Il2CppInterop.Runtime.IL2CPP' threw an exception.
 ---> System.EntryPointNotFoundException: Unable to find an entry point named 'il2cpp_domain_get' in DLL 'GameAssembly'.
   at Il2CppInterop.Runtime.IL2CPP.il2cpp_domain_get()
   at Il2CppInterop.Runtime.IL2CPP..cctor() in /home/runner/work/Il2CppInterop/Il2CppInterop/Il2CppInterop.Runtime/IL2CPP.cs:line 25
   --- End of inner exception stack trace ---
   at Il2CppInterop.Runtime.IL2CPP.il2cpp_register_log_callback(IntPtr method)
   at BepInEx.Unity.IL2CPP.Logging.IL2CPPLogSource..ctor() in /home/runner/work/BepInEx/BepInEx/Runtimes/Unity/BepInEx.Unity.IL2CPP/Logging/IL2CPPLogSource.cs:line 11
   at BepInEx.Unity.IL2CPP.IL2CPPChainloader.InitializeLoggers() in /home/runner/work/BepInEx/BepInEx/Runtimes/Unity/BepInEx.Unity.IL2CPP/IL2CPPChainloader.cs:line 124
   at BepInEx.Bootstrap.BaseChainloader`1.Initialize(String gameExePath) in /home/runner/work/BepInEx/BepInEx/BepInEx.Core/Bootstrap/BaseChainloader.cs:line 150
   at BepInEx.Unity.IL2CPP.IL2CPPChainloader.Initialize(String gameExePath) in /home/runner/work/BepInEx/BepInEx/Runtimes/Unity/BepInEx.Unity.IL2CPP/IL2CPPChainloader.cs:line 58
   at BepInEx.Unity.IL2CPP.Preloader.Run() in /home/runner/work/BepInEx/BepInEx/Runtimes/Unity/BepInEx.Unity.IL2CPP/Preloader.cs:line 87
   at BepInEx.Unity.IL2CPP.UnityPreloaderRunner.PreloaderMain() in /home/runner/work/BepInEx/BepInEx/Runtimes/Unity/BepInEx.Unity.IL2CPP/UnityPreloadRunner.cs:line 29
   at Doorstop.Entrypoint.Start() in /home/runner/work/BepInEx/BepInEx/Runtimes/Unity/BepInEx.Unity.IL2CPP/DoorstopEntrypoint.cs:line 39


Пока чего удалось достать - это вот это, но как дальше его вручную дампить - не пойму.

translated_image_en.png