Perfare / Il2CppDumper

Unity il2cpp reverse engineer
MIT License
6.98k stars 1.37k forks source link

il2cppdumper的DummyDll地址错误 #713

Closed krulci closed 1 year ago

krulci commented 1 year ago

请注意:如果你没有提供以下所有信息我将会直接无视并关闭这个issue

Perfare commented 1 year ago
  1. 我没有用过Il2cppInterop,也不知道它的工作原理,但是il2cppdumper生成的rva肯定是正确的。
  2. 上个问题我只是随手提下,没想到你居然真的想要修复dump的dll。。。我这里详细一点讲下好了 首先,修复从已经运行起来的游戏dump出来的dll基本是不可能的,因为运行后内存中的数据就已经发生了改变,比如一些数据已经完成初始化,当你运行dump的dll遇到已经初始化或者改变的数据,自然就会报错。 所以传统的脱壳方式就是在你需要脱的dll载入后调试走到真正的入口点(OEP),此时壳的代码已经跑完,并且原本dll的代码还没有真正开始运行,dump后就可以保证数据跟原始dll基本是一样的,一般选择用Scylla dump后就会顺带修复IAT。不过dll除了需要修复iat你还需要重定位表(.reloc),这样才算脱壳完成。 关于找oep,你可以试着用一些脱壳脚本看看。
krulci commented 1 year ago
  1. 我没有用过Il2cppInterop,也不知道它的工作原理,但是il2cppdumper生成的rva肯定是正确的。
  2. 上个问题我只是随手提下,没想到你居然真的想要修复dump的dll。。。我这里详细一点讲下好了 首先,修复从已经运行起来的游戏dump出来的dll基本是不可能的,因为运行后内存中的数据就已经发生了改变,比如一些数据已经完成初始化,当你运行dump的dll遇到已经初始化或者改变的数据,自然就会报错。 所以传统的脱壳方式就是在你需要脱的dll载入后调试走到真正的入口点(OEP),此时壳的代码已经跑完,并且原本dll的代码还没有真正开始运行,dump后就可以保证数据跟原始dll基本是一样的,一般选择用Scylla dump后就会顺带修复IAT。不过dll除了需要修复iat你还需要重定位表(.reloc),这样才算脱壳完成。 关于找oep,你可以试着用一些脱壳脚本看看。

我们这里做了几个尝试 1)我们修复了IAT,但还是会获得Failed to load IL2CPP。应该是你说的.reloc,这个又要怎做呢?我这里上传一下用Scylla修复IAT的 https://drive.google.com/file/d/10tS6Yonl8Hamrm4WXffVaPhCV0MqH6RX/view?usp=share_link 2)另外每次运行地址是否会不一样?我们因为不知道要怎么正确脱壳 目前正在尝试的思路是: 改了下你的Zygisk-il2cppdumper让他可以在DMM端在runtime dump 之后的dummy让他可以给il2cppinterop生成unhollowed 后续在加载mod框架 这样让整套工序都在同一个实例 可是Zygisk-il2cppdumper好像只能dump dump.cs 这个有啥办法吗?

Perfare commented 1 year ago
  1. 稍微看了下你提供的文件,它看上去什么都没有修复,甚至oep都是空的 QQ截图20230425203900
  2. dll每次载入的地址都有可能是不同的,这也是为什么需要修复重定向表
  3. Zygisk-il2cppdumper没法生成dll因为缺少global-metadata.dat无法获取完整的泛型相关的数据,而且就算能生成dll我也不认为跟il2cppdumper生成的有什么不同
  4. 如果你只是为了修改的话我认为并不需要依赖什么c#环境的mod框架,直接写c++的代码,要hook也可以使用MinHook之类的库,注入的话只需要编译成程序一定会载入的version.dll之类的就行pseudo-version-dll
Perfare commented 1 year ago

补充一点,OEP应该是0x2499E4,可以通过搜索48 89 5C 24 08 48 89 74 24 10 57 48 83 EC 20 49 8B F8 8B DA 48 8B F1 83 FA 01 75 05得到

krulci commented 1 year ago

补充一点,OEP应该是0x2499E4,可以通过搜索`48 89 5C 24 08 48 89 74 24 10 57 48 83 EC 20 49

8B F8 8B DA 48 8B F1 83 FA 01 75 05`得到

感谢解答。 想做这个主要是因为想要使用后续的HarmonyX工具。 这库有不少其他人做的通用工具如翻译工具。 目前我已经确认使用正常的il2cppdumper获得的dummy是可以给后续工具(il2cppinterop,HarmonyX)使用做patch,测试的HarmonyX patch也成功触发了。 另外Zygisk那个主要是想要找个方法可以在游戏运行时生成dummy给后续工具使用,照样方便长期版本变动使用 目前mmhook移植给DMM端只能dump dump.cs 你前面说的global-metadata.dat缺失,这个是何意思?是没有办法抽取的意思吗? 我们目前不清楚是修复Zygisk使其可以dump dummy比较简单还是有其他方法可以像CE那样找到GameAssembly.dll的区块dump内存,之后在写个脚本合并分区修复section然后传给il2cppdumper比较简单 目前我都是开了后在il2cppinterop执行前手动用CheatEngine抓了后在外执行il2cppdumper处理后才继续执行的

Perfare commented 1 year ago

Zygisk-il2cppdumper的原理就是只通过api而不依赖global-metadata.dat进行dump