1.AssetBundle逆向(未加密)
需要下载AssetStudio
拖入AssetStudio中,即可得到相关资源信息
2.DLL反编译
需要下载ILSpy
将dll拖入ILSpy界面,即可反编译全部代码,右键程序集->保存代码,即可得到全部csharp代码文件
将dll拖入Visual Studio等IDE同样可以自动反编译查看源代码,但貌似不方便批量保存
反编译后将丢失注释信息,若开发时使用了泛型或异步语法,反编译后的代码与原始代码可能会有较大差异,可读性低
3.il2cpp反编译(包体未加固)
需要下载Il2CppDumper
1.将{my_game}.apk后缀修改为{my_game}.zip,使用解压工具解压至文件夹{my_game}。(my_game为apk的文件名,根据具体情况有所不同)
2.在桌面新建一个input文件夹,和一个output文件夹。
3.将{my_game}\lib\armeabi-v7a\libil2cpp.so和{my_game}\assets\bin\Data\Managed\Metadata\global-metadata.dat复制到桌面input文件夹。(其中armeabi-v7a根据apk平台不同有所差异,可能是arm64-v8a或其他)
4.命令行运行il2CppDumper,其中<libil2cpp>表示input中的libil2cpp.so路径,<global-metadata>表示input中的global-metadata.dat的路径,<output>为output文件夹路径。
Il2CppDumper.exe <libil2cpp> <global-metadata> <output>
5.可见输出目录生成了output\DummyDll\Assembly-CSharp.dll等dll
4.Mono.Cecil注入修改dll
Unity自带了Mono.Cecil库,可以直接使用其修改dll
以下举例修改函数返回值
public void PatchProtobufAssembly() { var sourcePath = Path.Combine(Application.dataPath,"Scripts/Test/TS2.dll"); var targetPath = Path.Combine(Application.dataPath,"Scripts/Test/TS2_m.dll"); var assembly = AssemblyDefinition.ReadAssembly(sourcePath); //foreach (var t in assembly.MainModule.Types) Debug.Log($"遍历type {t.Name}"); // 找到类 var codedInputStreamType = assembly.MainModule.Types.First(t => t.Name == "TestScriptTS2"); //foreach (var m in codedInputStreamType.Methods) Debug.Log($"遍历method {m.Name}"); // 找到方法 var method = codedInputStreamType.Methods.First(m => m.Name == "Start"); // 清空当前方法指令 method.Body.Instructions.Clear(); var processor = method.Body.GetILProcessor(); // 改动返回值 processor.Append(processor.Create(OpCodes.Ldstr, "TEST_BILLY_" + codedInputStreamType.Name)); processor.Append(processor.Create(OpCodes.Ret)); // 保存修改后的dll assembly.Write(targetPath); Debug.Log($"Patch successfully. {targetPath}"); }
理论上可以做很多复杂修改,更多操作方法可见https://github.com/jbevain/cecil
参考文献
https://blog.csdn.net/zhangjiuding/article/details/134213699