首页
社区
课程
招聘
[原创]某厂某手游保护绕过
发表于: 2018-10-26 13:57 18470

[原创]某厂某手游保护绕过

2018-10-26 13:57
18470
闲来无事,于是想看看某大厂unity手游保护咋做的(结果啥都没看明白),本着技术交流的态度,来和大家分享分享。

从某厂的应用市场里下载apk,解包,先看看是mono还是il2cpp。发现是libmono.so,并且相关的DLL都被加密了,二话不说,老套路,直接hook mono_image_open_from_data_with_name,然而运行就奔溃



简单的贴贴Hook代码:

    if((strstr(name,"libmono.so")!=NULL)) {
        void *mono_image_open_from_data_with_name = (void *) dlsym(handle,
                                                                   "mono_image_open_from_data_with_name");
        if (mono_image_open_from_data_with_name != NULL) {
            MSHookFunction((void *) mono_image_open_from_data_with_name,
                           (void *) new_mono_image_open_from_data_with_name,
                           (void **) &old_mono_image_open_from_data_with_name);
        }
    }

不知道为啥奔溃,关键是奔溃时的调用栈信息也被抹了,先把libmono.so脱到IDA里看看什么情况,发现libmono.so的所有导出函数全部被加密了



猜测是InlineHook把函数头部的字节修改后,在其解密时异常导致的奔溃。于是想到了本站友贴说用GOT Hook,直接把他的代码拷贝过来试试。然而依然不起作用(没异常也没效果)。

怎么办呢,,我先看看游戏运行是加载了哪些so把,可能有那么一点点线索。



找点什么有Protect、Security关键字的so简单分析分析,没有结果。。

与此同时我发现一个很奇怪的地方,如下图,为啥Dll会被以这种方式加载起来?而且之后我在/proc/pid/maps里也没发现有相关的信息,很奇怪


冷静下来 ,暂时放弃这个问题。我先去内存里dump libmono.so(因为我之前怀疑,该厂的保护是自己hook了这些关键函数进行检测,才导致我上的hook崩溃。最开始我是通过打印函数头部的4个字节,结果发现一直不正常,反正不是跳转指令,也不是压栈指令)

IDA附件到进程,然后喜闻乐见



反正只是为了dump so,又不为了调代码,试试附加到他的子进程去dump 吧。



找到模块地址,常规的IDC dump代码一运行,dump_libmono.so就出来了,懒得修复,直接脱到IDA,所以发现根本没符号信息。只好先从能定位到的地方(通过静态分析apk里的libmono.so,可以知道mono_image_open_from_data_with_name的偏移是0x192f08)开始分析,单击G,输入 0x192f08,然后F5。通过对比mono源码,发现没问题 (之前有听说自己魔改mono,特殊处理Assembly-CSharp.dll的保护方案,本打算盯着有改动的代码,顺藤摸瓜) ,也没有InlineHook的痕迹,代码基本长的一样。


 
上个源码图


怎么办呢,所有的导出函数都加密了,并且hook他们就要崩溃,而且你还没有调用栈的信息。。。那我试试hook非导出函数(基址+偏移),于是就近找了一个,就是上图中的do_mono_image_load(参数比较诱人),然后我在原libmono.so中的导出表里查了查,确实没有导出这个函数

配合这下两图的信息(就地取材),定义了这么一个结构体

IDA视图
源码视图

结构体定义
struct simple_image{
    char tmp[8]; //0
    char* data; //8
    size_t length; //12
    char tmp1[4]; //16
    char *name;  //20
};

然后就dump下来了。。

int (*old_func)(char* a1,int a2 ,int a3,int a4);
int new_func(char *a1,int a2 ,int a3,int a4){
    simple_image* si = (simple_image*)a1;
    MYLOGD("load iamge name %s",si->name);
    MYLOGD("load iamge data %s",si->data);
    MYLOGD("load iamge size %d",si->length);
    dumpFileToSdcard(si->name,si->data,si->length);
    return old_func(a1,a2,a3,a4);
}

并且Dll完整,没加密。。



有点失望,在我心里,该厂不应该这样啊。。

tips: 
1.libmono.so会被加载很多次,在hook的时候注意被重入了
2.内容实在过于简单,目的是为了和大家交流交流手游保护姿势,还有就是之前那个Dll以so方式加载的情况
3.欢迎批评指正


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

最后于 2018-10-26 14:25 被老skr江编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (20)
雪    币: 3542
活跃值: (931)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
2
膜拜膜拜
2018-10-26 13:59
1
雪    币: 6369
活跃值: (1528)
能力值: ( LV4,RANK:156 )
在线值:
发帖
回帖
粉丝
3
好久没碰e厂的东西了,上次我研究他的加密发现是,他比你先hook了这个函数,你再去hook肯定炸了啊
2018-10-26 14:31
0
雪    币: 6369
活跃值: (1528)
能力值: ( LV4,RANK:156 )
在线值:
发帖
回帖
粉丝
4
在跟深层的地方hook其实是对的,比起e厂,另外一个某e对u3d的保护就复杂多了
2018-10-26 14:33
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
安卓不是so吗?怎么会有DLL?
2018-10-26 15:07
0
雪    币: 3542
活跃值: (931)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
6
yy虫子yy 安卓不是so吗?怎么会有DLL?
mono这玩意就是来运行dll的
2018-10-26 15:47
0
雪    币: 2673
活跃值: (2947)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
其实你发现被hook了,,可以做个假函数给他hook
2018-10-26 15:49
0
雪    币: 488
活跃值: (128)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
 
最后于 2018-10-26 19:34 被老skr江编辑 ,原因:
2018-10-26 19:33
0
雪    币: 488
活跃值: (128)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
gtict 其实你发现被hook了,,可以做个假函数给他hook
感觉没必要,只要发现hook结果有问题,假函数迟早会被发现的呀。
2018-10-26 19:34
0
雪    币: 47
活跃值: (143)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
makk
2018-10-27 15:51
0
雪    币: 88
活跃值: (136)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
很老的游戏吧,现在新的版本,这样dump出的dll里面的函数也解释不出来
2018-10-29 09:55
0
雪    币: 488
活跃值: (128)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
chenwitch 很老的游戏吧,现在新的版本,这样dump出的dll里面的函数也解释不出来
apk是我当天从应用市场上下的,不过游戏确实是他们15年的一款MOBA手游。后面我又试了一个他们去年发的RAC类手游,保护骚味有一点点变化,不过总体说来还是偏弱。他们的客户端对抗就这样了,关键是他们风控做的好呀,这就很头疼了。
2018-10-31 16:04
0
雪    币: 120
活跃值: (1592)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
玩的贼溜。。。
2018-11-19 21:35
0
雪    币: 233
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
月落之汀 好久没碰e厂的东西了,上次我研究他的加密发现是,他比你先hook了这个函数,你再去hook肯定炸了啊
嘿嘿你们至于说的这么隐晦吗,不就是易盾和腾讯吗,腾讯的移动安全确实做的很垃圾的,想要得到dll方法非常多,可能是出于兼容考虑吧,或许他们对特殊的一些游戏做了单独的另外的保护吧,至于易盾,他们抽取了方法的指令运行时候去解密,只要分析到解密的地方,hook或者重复调用解密函数就行了,但是比腾讯的要难多了,腾讯就一运营厉害,他们的安全都没发展几年!
2018-11-20 10:20
0
雪    币: 6369
活跃值: (1528)
能力值: ( LV4,RANK:156 )
在线值:
发帖
回帖
粉丝
15
烟雨破解 嘿嘿你们至于说的这么隐晦吗,不就是易盾和腾讯吗,腾讯的移动安全确实做的很垃圾的,想要得到dll方法非常多,可能是出于兼容考虑吧,或许他们对特殊的一些游戏做了单独的另外的保护吧,至于易盾,他们抽取了方法 ...
腾讯的风控厉害,他家其他产品加密也就那样,可能还是为了兼容性,人家可能根本就不在乎你怎么折腾吧,但网易是真的贱,纯技术对抗,手段很卑劣,不知道他们是不是对自己的产品兼容性非常自信。
2018-11-20 19:35
0
雪    币: 0
活跃值: (218)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
不就是疼迅的王者农药嘛,不知道2019版本王者农药会不会安全做的更好了,哪位大神去试试看,给个思路呗。
2019-3-10 17:07
0
雪    币: 1703
活跃值: (1440)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
农药之前还改过使用il2cpp,不知道什么原因又改回mono库了
2019-6-4 11:13
0
雪    币: 237
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
。。
最后于 2019-7-19 05:35 被酱油啊啊啊啊编辑 ,原因: 。。
2019-6-10 07:27
0
雪    币: 2375
活跃值: (433)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
楼主用的哪个版本IDA呢?
2019-6-13 13:06
0
雪    币: 574
活跃值: (364)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
很有收获,期待下次分享
2019-6-14 15:10
0
雪    币: 2449
活跃值: (171)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
21
你好,能分享下hook方面的思路吗?
2019-7-24 15:43
0
游客
登录 | 注册 方可回帖
返回
//