ARTICLE · 1042790
安卓逆向 -- 某APP会员代码分析总结
安卓逆向 -- 某APP会员代码分析总结首先软件各大应用商店下载,此贴以vivo应用商店为例
软件去签后打开全部dex,常量搜索会员后只发现有两个支付接口
于是找到resources.arsc进行搜索资源值〔VIP〕,发现这段字对应了软件上的提示, 
接下来复制ID打开dex,搜索后选第一个。 
打开第一个方法名进行代码分析

1. 先判断你 是不是VIP(调用 y0() )
- 不是VIP → 弹提示,不让用
- 是VIP → 继续往下走
2. 拿到你点的那本书/文档
3. 判断这本书 有没有同步过(USN 是否为 0)
- 没同步 → 提示: 请先同步数据
- 同步过 → 正常执行
4. 最后弹出一个选择框:从相册中选择
所以我们选中y0进行转跳
1. 先拿到当前登录的用户信息
2. 查用户的 永久VIP 状态( getVip_forever )
- 如果等于 1 → 直接判定:你是VIP,返回 true
3. 如果不是永久VIP,再查 普通VIP 状态( getVip )
- 如果等于 1 → 也判定:你是VIP,返回 true
4. 两个都不是 → 判定:你不是VIP,返回 false
转跳getVip_forever后进入了com.yunshangxiezuo.apk.model.users类
1. getUpdated_at()
返回: updated_at 字符串
意思:用户信息最后更新时间
2. getUuid()
返回: uuid
意思:用户唯一Id
3. getVip()J
返回: vip 长整型
意思:普通VIP 的状态 / 到期时间戳
4. getVip_forever()J
返回: vip_forever 长整型
意思:永久VIP
通常:
= 0 → 不是永久
= 1 → 永久VIP
5. getVip_last()
返回: vip_last 字符串
意思:VIP最后一次更新时间
所以我们修改getvip和getVip_forever就可以了
因为getvip和getVip_forever的返回值都是J型
所以我们这里插入const-wide/16 v0, 0x1而不是const/4 v0, 0x1
我们这里顺便把VIP到期时间改成终身会员,更美观些
会员功能都能用,免责声明:新用户注册有送的会员,不知道代码修改是否有效,等到明天会员过期了再更新教程

软件去签后打开全部dex,常量搜索会员后只发现有两个支付接口
于是找到resources.arsc进行搜索资源值〔VIP〕,发现这段字对应了软件上的提示,


打开第一个方法名进行代码分析

thod private l0(I)V.registers 6.line 1invoke-static {}, Lcom/yunshangxiezuo/apk/db/c;->d0()Lcom/yunshangxiezuo/apk/db/c;move-result-object v0invoke-virtual {v0}, Lcom/yunshangxiezuo/apk/db/c;->y0()Zmove-result v0if-nez v0, :cond_1f.line 2invoke-static {}, Lcom/yunshangxiezuo/apk/db/c;->d0()Lcom/yunshangxiezuo/apk/db/c;move-result-object p1invoke-virtual {p0}, Landroidx/appcompat/app/AppCompatActivity;->getResources()Landroid/content/res/Resources;move-result-object p0const v0, 0x7f10011einvoke-virtual {p0, v0}, Landroid/content/res/Resources;->getString(I)Ljava/lang/String;move-result-object p0sget v0, Lcom/yunshangxiezuo/apk/db/c;->A:Iinvoke-virtual {p1, p0, v0}, Lcom/yunshangxiezuo/apk/db/c;->u1(Ljava/lang/String;I)Vreturn-void.line 3:cond_1figet-object v0, p0, Lcom/yunshangxiezuo/apk/MainActivity;->c:Ljava/util/List;invoke-interface {v0, p1}, Ljava/util/List;->get(I)Ljava/lang/Object;move-result-object p1check-cast p1, Lcom/yunshangxiezuo/apk/model/sync/book_details;.line 4invoke-virtual {p1}, Lcom/yunshangxiezuo/apk/model/sync/book_details;->getUuid()Ljava/lang/String;move-result-object v0iput-object v0, p0, Lcom/yunshangxiezuo/apk/MainActivity;->h:Ljava/lang/String;.line 5invoke-virtual {p1}, Lcom/yunshangxiezuo/apk/model/sync/book_details;->getUSN()Jmove-result-wide v0const-wide/16 v2, 0x0cmp-long v0, v0, v2if-nez v0, :cond_43.line 6invoke-static {}, Lcom/yunshangxiezuo/apk/db/c;->d0()Lcom/yunshangxiezuo/apk/db/c;move-result-object p0sget p1, Lcom/yunshangxiezuo/apk/db/c;->A:Iconst-string v0, "请先同步数据"invoke-virtual {p0, v0, p1}, Lcom/yunshangxiezuo/apk/db/c;->u1(Ljava/lang/String;I)Vgoto :goto_68.line 7:cond_43new-instance v0, Lcom/yunshangxiezuo/apk/activity/view/w;new-instance v1, Lcom/yunshangxiezuo/apk/f;invoke-direct {v1, p0, p1}, Lcom/yunshangxiezuo/apk/f;-><init>(Lcom/yunshangxiezuo/apk/MainActivity;Lcom/yunshangxiezuo/apk/model/sync/book_details;)Vinvoke-direct {v0, p0, v1}, Lcom/yunshangxiezuo/apk/activity/view/w;-><init>(Landroid/app/Activity;Landroid/view/View$OnClickListener;)Viput-object v0, p0, Lcom/yunshangxiezuo/apk/MainActivity;->w:Lcom/yunshangxiezuo/apk/activity/view/w;.line 8invoke-virtual {p0}, Landroid/app/Activity;->getWindow()Landroid/view/Window;move-result-object p1invoke-virtual {p1}, Landroid/view/Window;->getDecorView()Landroid/view/View;move-result-object p1check-cast p1, Landroid/view/ViewGroup;.line 9iget-object v0, p0, Lcom/yunshangxiezuo/apk/MainActivity;->w:Lcom/yunshangxiezuo/apk/activity/view/w;const-string v1, "从相册中选择"invoke-virtual {v0, v1}, Lcom/yunshangxiezuo/apk/activity/view/w;->e(Ljava/lang/String;)V.line 10iget-object p0, p0, Lcom/yunshangxiezuo/apk/MainActivity;->w:Lcom/yunshangxiezuo/apk/activity/view/w;const/16 v0, 0x11const/4 v1, 0x0invoke-virtual {p0, p1, v0, v1, v1}, Landroid/widget/PopupWindow;->showAtLocation(Landroid/view/View;III)V:goto_68return-void.end method
1. 先判断你 是不是VIP(调用 y0() )
- 不是VIP → 弹提示,不让用
- 是VIP → 继续往下走
2. 拿到你点的那本书/文档
3. 判断这本书 有没有同步过(USN 是否为 0)
- 没同步 → 提示: 请先同步数据
- 同步过 → 正常执行
4. 最后弹出一个选择框:从相册中选择
所以我们选中y0进行转跳
.method publicy0()Z.registers 7.line 1invoke-virtual {p0}, Lcom/yunshangxiezuo/apk/db/c;->p0()Lcom/yunshangxiezuo/apk/model/users;move-result-object p0.line 2invoke-virtual {p0}, Lcom/yunshangxiezuo/apk/model/users;->getVip_forever()Jmove-result-wide v0const-wide/16 v2, 0x1cmp-long v0, v0, v2const/4 v1, 0x1if-nez v0, :cond_10return v1.line 3:cond_10invoke-virtual {p0}, Lcom/yunshangxiezuo/apk/model/users;->getVip()Jmove-result-wide v4cmp-long p0, v4, v2if-nez p0, :cond_19return v1:cond_19const/4 p0, 0x0return p0.end method
1. 先拿到当前登录的用户信息
2. 查用户的 永久VIP 状态( getVip_forever )
- 如果等于 1 → 直接判定:你是VIP,返回 true
3. 如果不是永久VIP,再查 普通VIP 状态( getVip )
- 如果等于 1 → 也判定:你是VIP,返回 true
4. 两个都不是 → 判定:你不是VIP,返回 false
转跳getVip_forever后进入了com.yunshangxiezuo.apk.model.users类
1. getUpdated_at()
返回: updated_at 字符串
意思:用户信息最后更新时间
2. getUuid()
返回: uuid
意思:用户唯一Id
3. getVip()J
返回: vip 长整型
意思:普通VIP 的状态 / 到期时间戳
4. getVip_forever()J
返回: vip_forever 长整型
意思:永久VIP
通常:
= 0 → 不是永久
= 1 → 永久VIP
5. getVip_last()
返回: vip_last 字符串
意思:VIP最后一次更新时间
所以我们修改getvip和getVip_forever就可以了
因为getvip和getVip_forever的返回值都是J型
所以我们这里插入const-wide/16 v0, 0x1而不是const/4 v0, 0x1
我们这里顺便把VIP到期时间改成终身会员,更美观些

会员功能都能用,免责声明:新用户注册有送的会员,不知道代码修改是否有效,等到明天会员过期了再更新教程

· 今 日 推 荐 ·