首页
社区
课程
招聘
[原创]Unity3D手游破盾之旅
发表于: 2018-8-28 13:13 15889

[原创]Unity3D手游破盾之旅

2018-8-28 13:13
15889

工具与环境:
手机: 小米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(https://github.com/iqiyi/xHook)上获取到源码,添加进项目中。在配置文件Android.mk的LOCAL_C_INCLUDES 和 LOCAL_SRC_FILES中添加相应的文件。

定义got hook函数如下:

编译运行,游戏正常运行了,在指定的目录下去查看,只dump出了Assemlby-CSharp-firstpass.dll,直接使用dnSpy打开,报错了,无法查看。

仔细想了一下,肯定是对文件进行了什么操作,需要修复,这里就不讲修复过程了,有兴趣的自己去看看这两篇文章(https://www.cnblogs.com/dwlsxj/p/4052871.html , https://www.cnblogs.com/dwlsxj/p/PE.html)后,就能修复了。多学点东西,吃透了才是自己的。修复后再使用dnSpy打开,结果如下:

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

至此,关键文件和源码获取完毕。

总的来说,该套保护方案还是比较强。分析这个还是用了很多时间。技术较菜,求大牛轻喷。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2018-8-31 11:26 被nsec编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (20)
雪    币: 0
活跃值: (169)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你能分享完整的工具吗?
2018-8-28 17:16
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不错  
2018-8-28 17:30
0
雪    币: 36
活跃值: (1061)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
markmark
2018-8-28 20:50
0
雪    币: 287
活跃值: (485)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
仔细看了一下,楼主你的代码有问题啊
2018-8-31 11:15
0
雪    币: 6267
活跃值: (1082)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
gezigezao 仔细看了一下,楼主你的代码有问题啊
谢谢指正,已修改。
2018-8-31 11:25
0
雪    币: 2
活跃值: (430)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
大哥你用dnspy修改了dll还能运行吗?
2018-8-31 14:52
0
雪    币: 6267
活跃值: (1082)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
alikai 大哥你用dnspy修改了dll还能运行吗?
可以运行
2018-8-31 17:38
0
雪    币: 216
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
求修复教程!发的两个介绍网址,看的我飘飘欲仙啊!
2018-9-1 00:35
0
雪    币: 102
活跃值: (2055)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
mark
2018-10-11 12:35
0
雪    币: 209
活跃值: (127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
楼主不是可以根据mono.so加密算法的方法,解了解密算法就可以编译Assembly-CSharp.dll了,老冷这个方法感觉有点麻烦
2018-10-11 13:14
0
雪    币: 6267
活跃值: (1082)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
如初见 楼主不是可以根据mono.so加密算法的方法,解了解密算法就可以编译Assembly-CSharp.dll了,老冷这个方法感觉有点麻烦
每个人都有自己喜欢的方法,逆向能力强就可以去分析so中的解密算法,过反调试什么的。
2018-10-11 14:50
0
雪    币: 268
活跃值: (3238)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
printOpcode这个函数是在哪里调用的,,void*addr = dlsym(myhandle, "mono_image_open_from_data_with_name");这个后面?
2018-10-11 15:15
0
雪    币: 6267
活跃值: (1082)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
gtict printOpcode这个函数是在哪里调用的,,void*addr = dlsym(myhandle, "mono_image_open_from_data_with_name") ...
只要获取到想要打印的地址,想在哪里调用都行。
2018-10-11 16:26
0
雪    币: 120
活跃值: (1597)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
最近都是深度好文,各种姿势
2018-11-20 12:23
0
雪    币: 12
活跃值: (173)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
libmono.so 如果是dll dump的时机太多了,看看源码就了解了
2018-11-21 21:33
0
雪    币: 10017
活跃值: (3457)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
新版的unity3d xhook 不到了,要怎么搞,老哥研究出了吗,只能用inline hook 吗,inline hook貌似兼容性不是很好啊.
2019-1-17 18:16
0
雪    币: 24
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
19
楼主是怎么修复的?我最近也碰到了dump出来的dll有问题,CFF看整个CLR貌似都加密了,不知道该怎么解
2019-3-4 01:48
0
雪    币: 24
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
楼主不会是CE直接从内存里扣的吧...?
2019-3-6 02:11
0
雪    币: 574
活跃值: (405)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
学些了
2019-6-14 15:07
0
游客
登录 | 注册 方可回帖
返回
//