高中生

- 金币
- 465
- 好评
- 5
- 信誉
- 100

|
版本 8.20.20
1.去广告
在投屏时开头有 秒后 相关关键字 搜索 秒后 可以找到很多结果 最匹配的就是
com.hpplay.sdk.sink.util.Resource
addString(KEY_ts, "__TS__seconds later ", "__TS__秒后", "__TS__秒後", "__TS__秒後");
public static final String KEY_ts = "ts";
搜索 "ts" 可以找到很多调用 我们先看 com.hpplay.sdk.sink.business.ads.controller.video.VideoADController
继续点击右上角方向盘 找到构造函数 长按查找调用处
我们可以找到很多调用
继续查找调用
经过分析可以得出被 ProcessBackAD ProcessPauseAD ProcessVideoPatchAD ProcessVideoPauseAD 调用 基本都有 onRequestAD requestAD
新修改方法
这里发现通过原修改方法 在视频播放完后还可能有广告 抓包发现是 queryCreative 搜索可以追踪到 VideoPostADRequest 搜索可以看到广告请求基本都有
boolean isADEnable = Switch.getInstance().isADEnable();
我们直接跳转 修改 isADEnable 强行返回false
com.hpplay.sdk.sink.cloud.Switch.isADEnable()
.method public final isADEnable()Z
.locals 1
const/4 v1, 0x0
return v1
.end method
老修改方法
这里可以修改 requestAD 但考虑太复杂 要修改四处 我们 查看 onRequestAD
可以看到 基本都调用 this.mADRequest.getValidADs 获取可用广告id列表 我们可以直接修改 让 this.mADRequest.getValidADs 返回null 我们假设调用处都做了广告id list的null 判断
修改
com.hpplay.sdk.sink.business.ads.cloud.ADRequest.getValidADs()
.method public getValidADs(Lcom/hpplay/sdk/sink/bean/ADBean;Ljava/util/List;)Ljava/util/List;
.locals 1
const/4 v0, 0x0
return-object v0
.end method
2.去除签名校验
之后会发现有签名校验 会出现 不支持私自修改签名
我们在dex或arsc搜索 不支持私自修改签名 找到id 7f0d027a 在dex搜索 找到在 com.hpplay.happyplay.aw.WelcomeActivity 有调用 发现是在 getSignFailedView()
查找 getSignFailedView 调用 发现当 SignCheckHelper.getInstance().check() 为false 会调用 跳转到 SignCheckHelper.getInstance().check() 我们尝试让它强行返回true
.method public check()Z
.locals 1
const/4 v1, 0x1
return v1
.end method
打包安装后可以正常打开了
3.包名共存
当我们把包名共存后 发现打开软件无法正常使用网络相关功能 最明显的就是登录功能 抓包发现正常软件登录时会请求 /miniApp/shortUrl 在修改包名的版本不会调用 /miniApp/shortUrl 查找 /miniApp/shortUrl 发现在 getShortUrlDomain() 被调用 再次查找会发现在 com.hpplay.happyplay.user.view.LoginView.createNormalLogin(String str) 调用
最有可能的是
if (TextUtils.isEmpty(Session.getInstance().mToken)) {
SinkLog.i(this.TAG, "createNormalLogin ignore, token empty");
return;
}
token为空的情况 我们hook SinkLog.i 发现在修改包名后 打印了 createNormalLogin ignore, token empty 调用了 查找 mToken 字段 的 put 调用
发现在 com.hpplay.sdk.sink.cloud.AuthSDK 设置 一直查找调用处 循环到 com.hpplay.sdk.sink.cloud.AuthSDK$3.onRequestResult 查找构造函数调用处 找到 authInSubThread 这个似乎就是构造token请求的方法
因为不知道为什么token为空 在之前代码可以分析到基本都是使用 HttpEncrypt 来发送请求 为了方便查看错误token返回值是什么 hook decode 发现获取token响应请求返回找不到包名信息 所以尝试把 authInSubThread 的 package 参数 改为固定原软件包名
将
invoke-virtual {v1}, Landroid/content/Context;->getPackageName()Ljava/lang/String;
move-result-object v2
替换为
const-string v2, "com.hpplay.happyplay.aw"
const-string v9, "package"
打开后 软件可以正常请求
4.去除未登录的强制登录
未登录每次打开都会出现登录弹窗 看起来像是 LoginView 查找构造函数调用处 发现是 com.hpplay.happyplay.aw.app.ForceLoginActivity 通过 activity记录 发现是 com.hpplay.happyplay.aw.app.ForceLoginActivity 查找调用处 发现在 goToForceLogin 调用 且被MainActivity调用 我们将它直接return即可
.method public goToForceLogin()V
.locals 0
return-void
.end method
重启发现登录弹窗消失
5.伪会员
在上面分析 我们可以发现在 有 hasVipFeature 调用 如果 hasVipFeature 为true 就弹出toast提示是会员已跳过广告 所以我们将hasVipFeature 固定返回true
com.hpplay.sdk.sink.rights.RightsManager.hasVipFeature(String str)
.method public hasVipFeature(Ljava/lang/String;)Z
.locals 1
const/4 v0, 0x1
return v0
.end method
查看首页未开通会员会提示 开通会员 优先从arsc搜索 开通会员 有几个 其中最有可能的就是 home_btn_buy_vip id为 0x7f0d015a 查找发现 updateBtnTxt$lambda-3(BuyVipButton buyVipButton)
只有
boolean isLogin = UserManager.getInstance().isLogin();
boolean isVip = RightsManager.getInstance().isVip();
两个变量一个为false 就提示开通会员 isLogin太复杂 因为只是本地 就不做本地账号了 我们查看isVip
RightVipAuthBean.Data sinkRights = getSinkRights();
(sinkRights == null || TextUtils.isEmpty(sinkRights.expire) || sinkRights.isExpire != 0) ? false : true;
查找 getSinkRights 最终找到在
com.hpplay.sdk.sink.rights.bean.RightVipAuthBean.parseJson(String str)
修改
会员等级
const-string v3, "memberTypeLevel"
invoke-virtual {p0, v3}, Lorg/json/JSONObject;->optInt(Ljava/lang/String;)I
move-result v3
替换
const/4 v3, 0x4 # 直接使用常量4,不调用optInt
会员过期
const-string v3, "expire"
invoke-virtual {p0, v3}, Lorg/json/JSONObject;->optString(Ljava/lang/String;)Ljava/lang/String;
move-result-object v3
替换为
const-string v3, "2099-12-31" # 设置过期时间为未来
是否有效
const-string v3, "isExpire"
invoke-virtual {p0, v3}, Lorg/json/JSONObject;->optInt(Ljava/lang/String;)I
move-result v3
替换为
const/4 v3, 0x0 # 设置为未过期 (0=未过期)
即可
6.去更新
抓包 发现每次更新都请求
Author/UpdateApp
搜索 发现几个都在 checkUpdate 调用
搜索方法 把方法体置空
.locals 0
return-void |
-
查看全部评分
总评分:好评 +1
|