kfffjddsk 发表于 2023-1-14 13:35

安卓app安装后看不到.so文件了

新手第一次尝试破解软件,破解的是一个玩了有段时间的unity引擎做的手游。
因为一直觉得破解挺酷的,加上自己又是相关专业的学生,就尝试自己破解一下,结果好像第一次破解就踢到铁板了。
因为自己基本什么都不动,然后问了个安全方面相关的朋友后他给了我一个ida pro,说让我去看看apk/lib里面的so文件。
打开一看发现完全看不懂,全是0ff_xxxxxx + xx,读了些文章后才发现应该是加密过了(其实我到现在都还不太确定)。
因为一开始搜到的手游破解文章全是cocos或者使用momo的unity游戏,导致我走了不少的弯路。
然后看到有篇文章提到了libil2cpp,我才知道我这个手游是libil2cpp构建的。

搜了搜关于libil2cpp的文章后,我就找到了global-metadata.dat。然后下载了个il2cpp dumper,尝试之后果然没用。
又看了点文章之后下了个010,打开global-metadata.dat看了看发现头部应该是正常的没有加密,用一个叫UnityMetadat.bat的模板也可以解读出来。
所以我推测是libil2cpp.so加密了,但是用ida又可以打开,我现在在想是不是il2cpp dumper不能将两个文件配对起来。
因为libil2cpp.so用f5查看之后也是像之前说的那样,全是(* (__int64 (**)(void)) (0ff_xxxxxx + xx))()这样的function call。
大概能看出一些规律,比如off_xxxxxxx的地址会在很多地方用到,但后面+的值基本没有重复的,所以我想应该是某种通过这种半写死的地址来加载函数。
但总的来说我已经完全读不懂了,比如跳转到off_xxxxxxx的地址会在旁边有洋红色的 g_tprt_pfn_array,希望各位大佬可以指点迷津。

上面这个是第一个让我完全无从下手的地方,第二个是在我尝试读代码然后读不通之后,我开始尝试动态调试这个程序。
一开始也是直接用ida然后android_sever那一套直接attach,但发现游戏是32位的,ida是64位的,可以静态加载的库有arm,arm64和x86_64的,心态有点爆炸。
目前我是直接强制安装了arm64_v8a的程序,然后ida和库都用的64位,但仿佛也有点问题,因为我是在模拟器上弄得。
动态调试成功attach之后发现程序完全不动了,等很久也没有加载库什么的,模拟器上的游戏也一直是等待debugger的状态(就是有个force close的那个对话框)
一开始还以为是我弄错了啥,后来才发现事情远没那么简单(((
在attach了几次都没反应之后,我又开始读文章,又读了好多文章之后看到了一篇用frida hook然后直接将so库dump出来的,用的是yang神的脚本。
我一看这不太好了直接解决我两个问题,但当我一切弄完 python dump_so.py libil2cpp.so 后我傻眼了,它报了个None。
我立刻 python dump_so.py 来查看所有的so库,发现之前在apk里看到的so库全部消失了,我只能看到一些系统库被加载,但我游戏已经打开并且在最上面。
我以为我又弄错了啥, 然后我就试了试另一个游戏,同样的操作但apk里的库可以通过 python dump_so.py 看到。
这个时候我在想,我之前ida完全没有反应是不是因为ida也识别不到那些库,因为用ida的时候我一直盯着右边的库加载列表在,结果也全是系统库。
到了这里我感觉已经完全超出我的知识范围了,甚至有点魔法(((

我也尝试用frida-dexdump来给app脱个壳,解出来了两个classes.dex文件,但读不太懂((


现在碰到的这两个问题我连怎么搜都不知道了,所以到这里来请各位大佬帮我指点一下:
1. (* (__int64 (**)(void)) (0ff_xxxxxx + xx))() 是什么?这是什么技术?有没有什么办法可以通过静态的方式解出来?

2. 为什么app安装之后.so库消失了?这是什么技术(魔法)?

然后关于我最后想要达到的结果的话,第一点就是希望可以破解这个游戏(胜负欲上来了),第二是知道里面用了什么加密技术就不求理解或者能够使用了。

芽衣 发表于 2023-1-16 19:09

你先看看是什么壳,加了壳即使改了so也填不回去。。。

kfffjddsk 发表于 2023-1-17 05:12

芽衣 发表于 2023-1-16 19:09
你先看看是什么壳,加了壳即使改了so也填不回去。。。

用mt查过了,显示是没有加固,然后用jadx也可以直接反汇编看到源码。我现在用gamegardian从内存吧libil2cpp.so 和global-metadata都dump出来了,但是用il2cppdumper还是不行,我读了反汇编找到了两个register填进去也没用,报:
System.IndexOutOfRangeException: 索引超出了数组界限。
   在 Il2CppDumper.Il2Cpp.Init(UInt64 codeRegistration, UInt64 metadataRegistration) 位置 C:\projects\il2cppdumper\Il2CppDumper\Il2Cpp\Il2Cpp.cs:行号 109
   在 Il2CppDumper.Elf.Search() 位置 C:\projects\il2cppdumper\Il2CppDumper\ExecutableFormats\Elf.cs:行号 147
   在 Il2CppDumper.Program.Init(String il2cppPath, String metadataPath, Metadata& metadata, Il2Cpp& il2Cpp) 位置 C:\projects\il2cppdumper\Il2CppDumper\Program.cs:行号 226

而且用il2cppdumper的自动模式是能找到CodeRegistration但找不到MetadataRegistration,和我在网上看到的都反过来了。
页: [1]
查看完整版本: 安卓app安装后看不到.so文件了