用户是new出来的! 热门变声器逆向教程<第九贴>

查看 173|回复 11
作者:ywlYWL   
[color=]本教程只提供学习,不提供成品!
        如有违规联系删帖!
工具:
  armPro 脱壳用的
  mt管理器 修改dex用的
0x1 前言
和室友打吃鸡,室友突然拉了他对象{:301_1008:}   
这........不整一手!{:301_978:}
下载了一个变声器当个绿茶婊{:301_1010:}
哥哥----{:301_975:}哈哈哈哈.
不过要会员! 这不挑衅我么{:301_997:}
0x2 理论基础
大部分软件都是连接服务器,通过服务器返回的数据 来生成用户对象
在根据用户对象设置相应的功能
在Java中new出来的对象可以堆中长时间保存
0x3 奇思妙想
破解实路可以从很多角度出发
比如:
暴力破解功能限制的关键跳转
->优点:对于相对简单的软件无需分析,方便快捷
->缺点:而对于功能判断较多的就显得比较麻烦 要多次重复操作;
而且暗病多,稍有不慎,引起闪退等{:301_991:}
参考可以看我以前的帖子:红包助手 暴力破解登入限制 (新手学习) - 『移动安全区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn
也可以
抓包发送假数据
用黄鸟等抓包软件注入发送假的数据包
->优点:可以免除脱壳等问题
->缺点:无法转移安装包给别人用{:301_973:}
修改登入代码,在Java层伪造用户
->优点:与正版无异,跳过QQ登入或者微信登入需要的签名验证,也就不会提示出盗版信息了
->缺点:难的分析,要瞻前顾后.只不过收藏应该在别的手机上用不了.{:301_980:}
0x4 实践出真理
进入实战状态{:301_992:}



Screenshot_2022-03-28-13-15-58-948_com.vmos.pro.jpg (197.1 KB, 下载次数: 0)
下载附件
2022-3-28 13:39 上传

这个是360加固,而这个的更新日期是在2022年2月23日之前的 可以用armPro 来进行脱壳
由于armPro是收费的 所以给大家一个脱壳后的版本:
https://pan.baidu.com/s/1wAiXPhIFg6GqIQjHNY93Rw?pwd=v4v8
v4v8
已经有理论的分析
我们打开软件,使用打开小挂件功能会弹出登入,而登入过后就会弹出收费!妥妥的把我们当韭菜啊!!!!{:301_1006:}
那么我们就要逆向思维
构建这个软件的工程师在做项目的时候肯定会有一个函数判断是否登入
而一般的判断都放在了用户类里面
那我们直接搜索 类名:user
发现真的有用户类!


Screenshot_2022-03-28-13-27-34-713_com.vmos.pro.jpg (236.63 KB, 下载次数: 0)
下载附件
2022-3-28 13:52 上传

userinfobean这就是用户的基本数据类!!!打开它!


Screenshot_2022-03-28-13-28-00-612_com.vmos.pro.jpg (233.05 KB, 下载次数: 0)
下载附件
2022-3-28 13:54 上传

而这个类里面也有getlogin这个方法,翻译成中文也就是获取登入的意思
而我也很干脆 直接改掉这个返回值为 1
用const v0,0x1
这句代码来赋值 (赋值这个补没看明白的话建议看看我以前的贴子,这里只讲个大概,讲不了那么细了!)
修改后退出保存,安装打开发现并没有登入
那么我们思考一下,是不是这个判断没被调用?
是不是还有其他的判断?
接下来我们在导航里面长按getlogin,查看它的调用
看看是不是没有被调用


Screenshot_2022-03-28-13-28-35-921_com.vmos.pro.jpg (268.41 KB, 下载次数: 0)
下载附件
2022-3-28 14:02 上传



Screenshot_2022-03-28-13-29-22-444_com.vmos.pro.jpg (397.25 KB, 下载次数: 0)
下载附件
2022-3-28 14:02 上传

找到了一处判断,这里在调用getlogin函数的同时还判断了j2是不是空!
而j2又是userinfobean 类型的数据, 而j2的值来源于j()这个方法
那么选择j()跳转到j()看看



Screenshot_2022-03-28-13-30-09-012_com.vmos.pro.jpg (366.5 KB, 下载次数: 0)
下载附件
2022-3-28 14:06 上传

与猜想的一样 这个j() 返回的就是用户数据
而这用户数据又调用了 k()方法
这个k() 方法里面(j()方法下面)有gson这个函数
这个函数是干嘛的? 是调用服务器里面的数据的
也就是与前面的理论相印证了
这里就要我们自己构造一个用户数据了
在Java里面 可以用new 在创建对象
于是就改成了这样


Screenshot_2022-03-28-13-33-26-042_com.vmos.pro.jpg (334.92 KB, 下载次数: 0)
下载附件
2022-3-28 14:06 上传

不管服务器怎样 自己在本地内存丰衣足食!
答案也哼理想,结果就是显示已经登入了,
为什么不改前面的函数的返回值?
改过,失败了,{:301_972:}
这个软件在一些关键代码上有so层的保护,修改后会出现出现异常然后闪退
学习so 就看看论坛芽衣大佬的文章吧
修改的smali代码我也放这了
.method public k()Lcom/intotherain/bean/UserInfoBean;
    .registers 5
    .line 1
    new-instance v0, Lcom/intotherain/bean/UserInfoBean;
    invoke-direct {v0}, Lcom/intotherain/bean/UserInfoBean;->()V
    return-object v0
.end method
这就是k()方法的修改
接下来就是逆向会员功能了
而逆向会员无非就是修改会员相关的数据
而这个还是要改用户数据
而这里并没有isvip的判断方法
所以断定就是通过会员到期时间来判断是不是会员的
在用户数据类的修改放在这里了
method public getAvatarUrl()Ljava/lang/String;
.registers 2
.line 1
iget-object v0, p0, Lcom/intotherain/bean/UserInfoBean;->avatarUrl:Ljava/lang/String;
const-string v0, "https://t8.baidu.com/it/u=3257069087,320163745&fm=70&app=139&f=JPEG?w=690&h=690&s=A0F27327B38B64FC803C99990300C0A2"
return-object v0
.end method
.method public getBuySogouVoiceTime()I
.registers 2
.line 1
iget v0, p0, Lcom/intotherain/bean/UserInfoBean;->buySogouVoiceTime:I
const v0, 0x98967f
return v0
.end method
.method public getExpireLocalVipDate()Ljava/util/Date;
.registers 2
.line 1
new-instance v0, Ljava/util/Date;
invoke-direct {v0}, Ljava/util/Date;->()V
return-object v0
.end method
.method public getExpireSogouVoiceDate()Ljava/util/Date;
.registers 2
.line 1
new-instance v0, Ljava/util/Date;
invoke-direct {v0}, Ljava/util/Date;->()V
return-object v0
.end method
.method public getLogin()Z
.registers 2
.line 1
iget-boolean v0, p0, Lcom/intotherain/bean/UserInfoBean;->login:Z
const v0, 0x1
return v0
.end method
.method public getNickname()Ljava/lang/String;
.registers 2
.line 1
iget-object v0, p0, Lcom/intotherain/bean/UserInfoBean;->nickname:Ljava/lang/String;
const-string v0, "小杨破解"
return-object v0
.end method
.method public getOpenId()Ljava/lang/String;
.registers 2
.line 1
iget-object v0, p0, Lcom/intotherain/bean/UserInfoBean;->openId:Ljava/lang/String;
return-object v0
.end method
.method public getPostSpendSogouVoiceTime()I
.registers 2
.line 1
iget v0, p0, Lcom/intotherain/bean/UserInfoBean;->postSpendSogouVoiceTime:I
const v0, 0x0
return v0
.end method
.method public getSpendSogouVoiceTime()I
.registers 2
.line 1
iget v0, p0, Lcom/intotherain/bean/UserInfoBean;->spendSogouVoiceTime:I
const v0, 0x0
return v0
.end method
.method public getTotalSpendSogouVoiceTime()I
.registers 3
.line 1
const v0, 0x0
return v0
.end method
这里面的大部分方法直接翻译你就能知道它的意思
我大概讲一下,有购买的时间尽量调很长,还有使用时间尽量调低
有个oldvip这个没用不用管
通过一下午的分析 判断会员的标准还有个c()方法


Screenshot_2022-03-28-13-37-02-283_com.vmos.pro.jpg (301.41 KB, 下载次数: 0)
下载附件
2022-3-28 14:38 上传

在k()方法的那个类里面
在下面就能看到这里的判断了
在w()里就有判断c()方法的
我们只需吧c()长按 跳转过去 改返回值为0就大功告成了
而这个c()就应该是判断会员日期相关的


Screenshot_2022-03-28-13-20-43-059_net.wifi.po.jpg (201.17 KB, 下载次数: 0)
下载附件
2022-3-28 14:41 上传



Screenshot_2022-03-28-14-41-54-088_com.tencent.mo.jpg (193.04 KB, 下载次数: 0)
下载附件
2022-3-28 14:42 上传

而登入只有两种方式


Screenshot_2022-03-28-14-41-51-314_com.tencent.mo.jpg (102.91 KB, 下载次数: 0)
下载附件
2022-3-28 14:42 上传

这种方式只要修改了的软件都不方便登入进去 或者有的是根本登入不了{:301_1000:}

下载次数, 登入

ywlYWL
OP
  


qq173339443 发表于 2022-3-28 16:26
能不能放好改好的包

吾爱的目的可是让我们进行学术上的交流,这样的吾爱才能顺应时代发展,也许以后会开放,但现在还是不方便.
yuechaomax   

免登陆这个方法就不行了。
prospect2005   

NB,收藏学习。。。。。。。。。。
syc88   

收藏了,有时间学习学习
ciker_li   

学习学习,可惜没有收费软件
torrent   

羡慕有Arm Pro会员的楼主
七月上H   

谢谢分享
yellosky   

学习一下,自己搞搞看看能不能成功
qq173339443   

能不能放好改好的包
您需要登录后才可以回帖 登录 | 立即注册