【新手】dump出u3d游戏《彩虹岛W》中加密dll
本帖最后由 hyc199844 于 2017-9-19 23:44 编辑作为一个彩虹岛老玩家听说《彩虹岛》手游终于出了,心情顿时激动不已,然而当下载APK之后才发现刚刚过了二测截止时间。。。于是我就把它拖进androidkiller,发现它是用unity3d引擎开发的,且assembly-CSharp.dll已被加密。而之前没有接触过这类游戏的逆向,所以在网上找了大量的资料,也调试了很多次(甚至换手机调试。。终于dump成功了,写下此贴以记录这段过程,并将自己的所得分享给大家。。:lol
首先给大家分享几个帖子作为参考:
帖子一:http://blog.csdn.net/feibabeibei_beibei/article/details/52740212
帖子二:http://blog.csdn.net/huutu/article/details/51902940
将原始APK解压并将assets\bin\Data\Managed中的assembly-CSharp.dll拖进.net reflector后,出现了
说明该dll已被加密。根据网上查到的资料,加密代码应该是在lib/armeabi-v7a中的libmono.so中。根据上面“帖子一”第三点中的反调试步骤,成功将APP置于ida中调试
(我使用的是ida6.8,用我现在的android6.0手机调试时,将ida附加进程后,android_server这边一直显示Failed to find r_debug in /system/bin/linker,在网上查过之后也没有找到解决方案,因此换了一部Android4.1的旧手机调试,于是没再出现这个问题)
由于“帖子一”中已经很详细的介绍了反调试的步骤,这里就直接上图
这时,按照“帖子二”的方法,按F9运行,直到Modules中出现libmono.so
双击libmono.so,进入mono_image_open_from_data_with_name函数,按F5查看C代码
与“帖子二”对比猜测v15和v7是与DLL数据有关的两个值
将鼠标放在v15和v7上,发现v15对应寄存器r10的值,v7对应寄存器r6的值
在mono_image_open_from_data_with_name函数下找r6和r10出现频繁的地方,发现
在“ADD R6,R10,R6"和”STR R10,两处F2下断,当程序运行到这两处时它们的值如下
而0x692DA628 - 0x67C22008 = 0x016B8620,于是推测第二个断点处R6和R10分别存储了DLL数据的首末地址,16B8620是数据的长度
于是shift+F2输入IDC脚本
运行后成功输出lataleDump.dll文件,将其放入原目录后,拖进.net reflector,成功载入
于是可以开始修改啦~开心:lol 第一次逆向u3d游戏,如果有什么不正确或不恰当的地方还请指正。。 LZ弄成功能不能分享一下。{:1_890:},我也是彩虹老玩家了,想玩ing........ {:1_918:}通过努力不错啊。 求apk逆向大手合作 站短 不过现在的游戏要么用il2cpp要么libmono搞鬼……opcode换掉什么的 感谢大哥的分析,不过对于ANDROID 不太明确的能够展示是我的问题。。 留下脚印,学习了。 学习了 感谢分享 谢谢分享 楼主技术不错,算是高手