首页
社区
课程
招聘
[原创]使用frida hook插件化apk
发表于: 2020-4-12 13:04 19302

[原创]使用frida hook插件化apk

2020-4-12 13:04
19302

首先从AndroidManifest.xml中获取到apk的包名,并且查看下activity情况:

发现只有4个Activity,正常情况下一个apk肯定不止这些,所以初步怀疑这只是外壳,真正逻辑是在其他地方,会动态加载进来。

打开apk

可以看到有两个进程,从上图也可以看到,2、3和4处的Activity是运行在plugin进程中,为了确认下视频播放所在的进程,使用dumpsys meminfo查看

打开任意播放界面

确认视频播放是在plugin进程中,此时真正的逻辑已经加载到进程中,查看下plugin进程的maps

从上图可以看到,真正逻辑所在的apk是plugin-shadow-apk-debug.apk,是在该apk的私有文件目录中。

从代码中分析也可知道,此apk是插件化apk,使用的是腾讯开源的插件化框架Shadow,感兴趣的可以去了解下。

既然已经找到真正的apk,那我们就需要定位到关键代码地方。

从字符串中定位到有多个类满足,此时一个一个去分析排查太耗时,接下来通过frida来枚举出所有加载的类。

Java.enumerateLoadedClasses(callbacks) 是用来枚举当前所有加载的类,通过和上述几个关键类对比来找到实际调用的类,callbacks需要提供回调函数,对应onMatch和onComplete。具体如下面:

运行结果:

com.iqiyi.plugin.widget.dkplayer.controller.VideoController

success

第一行为输出结果,即表示当前使用的类为 com.iqiyi.plugin.widget.dkplayer.controller.VideoController;

第二行为执行完成的日志。

找到字符串位置

可以看到类中通过isVip变量来执行不同逻辑,继续看下isVip是如何设置的

可以看到当前类有setVip方法,用于设置该变量,此时可以不用在继续分析调用者,最终都会调用此处,所以我们可以使用frida hook该方法。

运行结果:

从运行结果来看,出现ClassNotFoundException错误,说明没有找到我们要hook的类。

由于是插件化apk,类加载是在插件化框架自定义的,所以classloader不能使用默认的。我们可以使用Java.enumerateClassLoaders(callbacks)来打印出所有的加载器。

运行结果:

由上面分析可知,真正逻辑代码是在plugin-shadow-apk-debug.apk中,那该apk对应的classloader是com.tencent.shadow.core.loader.classloaders.PluginClassLoader。

来看下Java.ClassFactory中loader的介绍:"read-only property providing a wrapper for the class loader currently being used.",loader是当前classloader的wrapper,我们修改classloader可以通过修改该字段。Java.classFactory是默认的class factory,所以我们需要修改的是Java.classFactory.loader。

运行结果:

可以看到,我们已经成功hook,并且视频上已经没有显示剩余时间。

直播和小说的vip判断和视频是不一致的,是通过enum中VIP字段值和1进行对比来判断,具体定位过程和上面类似。

判断代码为:

if (TextUtils.equals("1", PluginEnum.VIP.getValue())) {...}

我们的目的是为了hook VIP,但是对enum的这种用法不是很熟,于是写了个测试程序,来进一步了解

使用javap打开对应的class文件:

从这里可以很明显看到, A、B和C都属于TestEnum中的静态成员变量。来看下调用的smali代码:

从smali上也能看出来类似的逻辑,VIP是com/iqiyi/plugin/base/PluginEnum的静态成员,然后在调用getValue()方法。所以我们hook com/iqiyi/plugin/base/PluginEnum类的getValue方法,然后判断调用者是否为VIP。

通过对该样本的分析,逆向找寻关键代码相对简单,但是在使用frida hook时相对难点,特别是对于frida和插件化不熟的情况下。本文涉及到的有:

 
 
 
 

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

收藏
免费 16
支持
分享
最新回复 (21)
雪    币: 8447
活跃值: (5041)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
2
一个字,巨吊!
2020-4-12 15:29
0
雪    币: 4883
活跃值: (18890)
能力值: ( LV13,RANK:317 )
在线值:
发帖
回帖
粉丝
3
感谢分享
2020-4-13 09:56
0
雪    币: 200
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢分享
2020-4-13 13:58
0
雪    币: 4731
活跃值: (4674)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢分享
2020-4-13 20:16
0
雪    币: 0
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
感谢分享!希望楼主可以分享一下这个apk~
2020-4-14 01:14
0
雪    币: 2904
活跃值: (1337)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
7
感谢分享
2020-4-14 09:27
0
雪    币: 1562
活跃值: (2900)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
皮皮的皮子 感谢分享!希望楼主可以分享一下这个apk~
兄弟,我也想分享apk,这样更完整。但是不能啊也不敢,望理解
2020-4-14 09:41
0
雪    币: 8715
活跃值: (8619)
能力值: ( LV13,RANK:570 )
在线值:
发帖
回帖
粉丝
9
感谢兄弟
2020-4-14 18:59
0
雪    币: 29
活跃值: (295)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
学到了,感谢分享
1.cat /proc/7906/maps 查看动态加载的插件APK拿到执行代码
2.frida使用Java.enumerateLoadedClasses(callbacks) 枚举所有加载的类找到所执行的逻辑
3.Java.classFactory.loader = loader; 指定特定的classloader
4.hook我们想修改的逻辑

2020-4-15 23:00
1
雪    币: 160
活跃值: (99)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
看到了iqiyi
2020-4-16 01:41
0
雪    币: 529
活跃值: (1005)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
tflyr 看到了iqiyi
应该不是它家的,只用了它家的开源插件框架
2020-4-16 10:59
0
雪    币: 260
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
APK,我也用来 学习 练下手。
2020-4-16 11:18
0
雪    币: 1446
活跃值: (1526)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
这app ,叫啥名?
2020-4-17 14:53
0
雪    币: 1027
活跃值: (256)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
16
膜拜学习。
2020-5-24 21:24
0
雪    币: 148
活跃值: (780)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
谢谢分享。提供一下名字和版本,我们自己去下
2020-5-25 09:00
0
雪    币: 468
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18

感谢分享

最后于 2020-5-25 09:37 被Gintoki编辑 ,原因:
2020-5-25 09:37
0
雪    币: 1705
活跃值: (676)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
没有反调试么,要是有的话第一步都到不了
2020-6-24 19:01
0
雪    币: 65
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
楼主可以再分析下怎么通过frida 拿出apk吗~   
2020-9-1 16:49
0
雪    币: 248
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
21

感谢分享

  1. frida枚举所有加载的类;
  2. frida枚举classloader;
  3. frida对enum类型的hook。
2021-12-22 11:05
0
雪    币: 116
活跃值: (1012)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
支持一下
2021-12-27 23:05
0
游客
登录 | 注册 方可回帖
返回
//