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

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

2020-4-12 13:04
19688

目录


最近拿到一个XX视频apk样本,里面有视频、直播和小说,没有VIP只能试看30秒,刚好最近学习frida,用来练习下,分析过程中发现是一个插件化的apk,本文记录下分析的过程。

初步分析

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

 

 

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

ps 查看

打开apk

 

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

dumpsys meminfo查看

打开任意播放界面

 

 

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

cat /proc/7906/maps

 

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

 

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

定位关键代码

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

 

字符串定位

 

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

frida枚举所有加载的类

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Java.perform(function () {
 
    // 上述搜索到的多个类
    var key_class = ["com.facebook.plugin.widget.dkplayer.controller.PlayerVideoController",
                     "com.iqiyi.plugin.widget.dkplayer.controller.PlayerVideoController",
                     "com.facebook.plugin.widget.dkplayer.controller.VideoController",
                     "com.iqiyi.plugin.widget.dkplayer.controller.VideoController"]
 
    Java.enumerateLoadedClasses({
        "onMatch": function(name, handle) {
            for (var i = 0; i < key_class.length; i++) {
                if (key_class[i] == name) {
                    console.log(name);
                }
            }
        },
        "onComplete": function() {
            console.log("success");
        }
    });
});

运行结果:

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

success

 

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

 

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

VideoController 类分析

找到字符串位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public int setProgress() {
        ... ...
      if (this.tryWatchTv != null && position > 0) { // 如果是试看
          pos = (int) (((long) this.stopPlayTime) - position);
          TextView textView = this.tryWatchTv;
          StringBuilder stringBuilder = new StringBuilder();
          stringBuilder.append("剩余试看时间: "); // 此处是我们看到的字符串
          if (pos > 0) {
              j = (long) pos;
          }
          stringBuilder.append(stringForTime(j));
          textView.setText(stringBuilder.toString());
      }
      if (!this.isVip) { // 此处是通过isVip变量执行不同逻辑
          StringBuilder stringBuilder2 = new StringBuilder();
          stringBuilder2.append("position = ");
          stringBuilder2.append(position);
          stringBuilder2.append(" showVipHintTime = ");
          stringBuilder2.append(this.showVipHintTime);
          LogHelper.i(stringBuilder2.toString());
          if (position < ((long) this.showVipHintTime) || this.showVipHintTime <= 0) {
              this.vipHintView.setVisibility(8);
          } else {
              this.vipHintView.setVisibility(0);
          }
          if (position >= ((long) this.stopPlayTime)) {
              this.mMediaPlayer.pause();
          }
      }
      ... ...
  }

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


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

收藏
免费 18
支持
分享
赞赏记录
参与人
雪币
留言
时间
東陽不列山
为你点赞!
2024-12-15 05:42
一路南寻
感谢你的贡献,论坛因你而更加精彩!
2024-12-14 01:24
心游尘世外
为你点赞!
2024-10-20 06:10
Ally Switch
为你点赞~
2024-4-14 13:09
ZDavy
为你点赞~
2024-2-19 16:33
PLEBFE
为你点赞~
2023-1-17 01:37
余雨
为你点赞~
2021-12-28 13:58
万里星河
为你点赞~
2021-12-27 23:04
Zard_
为你点赞~
2021-12-22 13:10
SevenZang
为你点赞~
2021-5-17 22:41
fzbeichen
为你点赞~
2021-4-2 14:47
xiongcc
为你点赞~
2020-9-2 22:46
jmzqwh
为你点赞~
2020-7-8 12:21
0x指纹
为你点赞~
2020-4-15 15:56
r0Cat
为你点赞~
2020-4-14 18:59
hzzheyang
为你点赞~
2020-4-13 10:12
nws0507
为你点赞~
2020-4-12 20:48
mifeng925
为你点赞~
2020-4-12 14:36
最新回复 (21)
雪    币: 8511
活跃值: (5131)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
2
一个字,巨吊!
2020-4-12 15:29
0
雪    币: 5048
活跃值: (19305)
能力值: ( LV13,RANK:317 )
在线值:
发帖
回帖
粉丝
3
感谢分享
2020-4-13 09:56
0
雪    币: 200
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢分享
2020-4-13 13:58
0
雪    币: 5268
活跃值: (5330)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢分享
2020-4-13 20:16
0
雪    币: 10
活跃值: (93)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
感谢分享!希望楼主可以分享一下这个apk~
2020-4-14 01:14
0
雪    币: 2910
活跃值: (1352)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
7
感谢分享
2020-4-14 09:27
0
雪    币: 1689
活跃值: (3065)
能力值: ( 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
活跃值: (420)
能力值: ( 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
活跃值: (1030)
能力值: ( 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
活跃值: (1546)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
这app ,叫啥名?
2020-4-17 14:53
0
雪    币: 1027
活跃值: (266)
能力值: ( 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
雪    币: 246
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
21

感谢分享

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

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册