-
-
[原创]Unity3D手游破盾之旅
-
发表于:
2018-8-28 13:13
16132
-
工具与环境:
手机: 小米4
系统版本: 4.4.2
Hook 框架: Cydia substrate 和 iqyi的xHook
某易游戏出了一款篮球游戏,试玩了一下,内容就不过多的评价了,出于职业习惯,对它的保护系统倒是很感兴趣。
先行基础是必须会用Cydia substrate这个hook框架,如果不会用请先去论坛搜索教程。
先静态分析一下libmono.so,各种关键函数都搜不到,应该是对so进行处理了,然而,在动态运行时,总要还原的嘛。
先定义MonoImage结构体,后续dump文件时有用。
闲话少说,直接上神器Cydia substrate,使用Cydia substrate框架去hook dlopen函数和
hook libmono.so中的mono_image_open_from_data_with_name,启动代码如下:
不出所料,游戏崩了,通过代码打印出函数所在地址的前8位:
输出结果:

前面4位为 04 f0 1f e5 转换为arm汇编为 LDR PC, [PC, #-4],为跳转到指定目标地址的特征码,inline hook中常见得特征码。后面4位为要跳转到的地址 为 0x75e6bf09。
分析到这里,既然保护系统会先Hook,那我就去hook那个要跳转的地址吧,这样就可以改变流程为 原函数 --> 我的函数 --> 保护系统中的处理函数。这样就可以在我的函数中对保护系统中的处理函数的返回结果进行处理了。
嗯,插件编译安装后,愉快的运行游戏,然而,游戏加载到Assembly-CSharp-firstpass.dll时居然还是崩了。此时,内心的崩溃的,连续骚扰了几个大牛,突然某人的一句话惊醒梦中人啊。那就是可以试试got表的hook嘛,根据unity3d的版本,2017之前的版本,都会在got表中存在mono_image_open_from_data_with_name这些关键函数的嘛。
确定好思路后,直接开干,Got hook最近iqiyi不是才开源一个xHook框架滴嘛,正好整合进Cydia substrate试试。
从git(f0bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6A6M7h3W2&6K9g2)9J5c8Y4S2t1L8$3!0C8i4K6t1&6i4@1f1@1i4@1t1^5i4K6S2m8i4@1f1^5i4K6S2q4i4@1t1%4i4@1f1#2i4K6S2r3i4K6V1$3i4@1f1#2i4K6R3^5i4@1t1H3i4@1f1$3i4@1u0m8i4K6V1H3i4@1f1%4i4@1p5H3i4K6R3I4i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1$3i4@1t1%4i4@1u0n7i4@1f1#2i4K6S2m8i4@1p5H3i4@1f1^5i4@1u0r3i4K6W2n7i4@1f1&6i4@1p5I4i4@1t1&6i4@1f1%4i4K6W2n7i4@1q4q4i4@1f1@1i4@1t1^5i4@1q4p5i4@1f1K6i4K6R3H3i4K6R3J5i4@1f1#2i4K6W2o6i4@1p5^5i4@1f1&6i4K6R3#2i4K6S2p5i4@1f1%4i4@1u0p5i4@1q4q4i4@1f1$3i4K6V1$3i4K6R3%4i4@1f1@1i4@1u0n7i4@1t1$3b7h3&6V1M7X3!0A6k6q4)9J5k6h3#2C8i4@1f1%4i4K6W2m8i4K6R3@1e0p5!0o6b7f1I4Q4y4h3k6o6i4K6g2X3d9f1&6o6e0q4g2p5c8g2x3`. 和 LOCAL_SRC_FILES中添加相应的文件。
定义got hook函数如下:
编译运行,游戏正常运行了,在指定的目录下去查看,只dump出了Assemlby-CSharp-firstpass.dll,直接使用dnSpy打开,报错了,无法查看。

仔细想了一下,肯定是对文件进行了什么操作,需要修复,这里就不讲修复过程了,有兴趣的自己去看看这两篇文章(aa9K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2U0L8X3u0D9L8$3N6K6i4K6u0W2j5$3!0E0i4K6u0r3k6s2N6D9M7%4S2B7i4K6u0r3M7q4)9J5c8U0b7H3y4e0t1^5y4K6q4Q4x3X3g2Z5N6r3#2D9 , dd5K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2U0L8X3u0D9L8$3N6K6i4K6u0W2j5$3!0E0i4K6u0r3k6s2N6D9M7%4S2B7i4K6u0r3M7q4)9J5c8W2m8q4i4K6u0W2K9s2c8E0L8q4!0q4c8W2!0n7b7#2)9^5z5g2!0q4y4g2)9&6x3q4)9^5c8g2!0q4c8W2!0n7b7#2)9^5b7#2!0q4y4g2!0n7x3q4!0n7x3g2!0q4z5q4)9^5x3#2!0n7c8q4!0q4y4q4!0n7c8W2!0m8c8g2!0q4y4g2!0m8y4q4)9^5c8q4!0q4y4q4!0n7b7g2)9^5y4W2!0q4x3#2)9^5x3q4)9^5x3W2!0q4y4g2!0m8y4q4)9&6b7g2!0q4y4g2!0m8c8q4!0m8y4W2!0q4y4#2)9^5x3W2!0n7z5g2!0q4y4q4!0n7z5q4)9&6b7#2!0q4z5q4!0m8y4g2!0n7c8W2!0q4c8W2!0n7b7#2)9^5b7#2!0q4y4g2)9&6x3q4)9^5x3#2!0q4z5g2)9^5x3q4)9^5c8W2!0q4y4q4!0n7b7g2)9^5y4W2!0q4y4W2)9^5z5g2)9^5c8q4!0q4y4W2)9&6z5q4!0m8c8W2!0q4z5q4)9^5y4#2!0m8b7g2!0q4y4g2!0n7y4#2!0n7x3g2!0q4y4#2)9&6b7g2)9^5y4q4!0q4x3#2)9^5x3q4)9^5x3W2!0q4y4q4!0n7c8W2!0m8c8g2!0q4y4g2!0m8y4q4)9^5c8q4!0q4y4g2)9&6x3q4)9^5c8g2!0q4y4g2)9^5y4W2)9^5c8q4!0q4y4q4!0n7c8q4!0n7c8W2!0q4y4#2)9&6y4q4!0m8z5r3c8F1f1%4m8&6i4@1f1$3i4K6R3&6i4K6V1K6i4@1f1#2i4@1u0o6i4K6R3H3i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1%4i4@1u0n7i4K6V1K6i4@1f1$3i4K6W2q4i4K6W2o6i4@1f1#2i4@1p5$3i4K6R3J5i4@1f1@1i4@1t1^5i4K6S2n7i4@1g2r3i4@1u0o6i4K6W2m8

通过此函数,再到相应的so文件中查看相关的函数,分析后得到Assembly-CSharp.dll直接通过此so中进行加载,通过hook 相关函数后直接dump出文件,使用dySpy打开后如下所示:

至此,关键文件和源码获取完毕。
总的来说,该套保护方案还是比较强。分析这个还是用了很多时间。技术较菜,求大牛轻喷。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2018-8-31 11:26
被nsec编辑
,原因: