〇、基础知识
一、准备工作
查壳和签名验证
软件无壳。
安装原包,正常。
直接签名后安装,发现闪退。
应该是签名验证,使用mt一键hook签名验证
如果没有会员也可以尝试用四哥的kstools(未经测试)
这里提供mt一键hook后被更改的文件(请点击左边目录的“附件”查收),解压后直接复制到apk签名即可过签名验证
- 根据回复(置顶层)的方法:
第一步去签名校验,这样让没有MT会员的怎么办……
帮你补充一下:我刚才看了一下dex,代码直接搜索net/momentcam/aimee/utils/SignCheckUtil;->a()V
,这句会调用验证方法,把他删掉就可以了。
hook签名后打开正常。
关键词/布局筛选
查看可能作为判断依据的内容:
上图左:升级到会员的提示
上图右:订阅会员解锁和右下角的会员表示
修改VIP
找到布局
以升级到会员
为例
如下图左,在ares
资源文件搜索关键词
如上图中,在xml
中搜索刚复制的ID
有两个结果,点开第一个(根据文件名猜测第一个有可能)
如下图左,定位到ID
所在位置,发现该ID
在一个绝对布局里,向上找到该布局的ID
复制
找关键判断
如上中图,到dex
中搜索该ID
此处建议下拉框里选择数字
格式,并勾选16进制
,可以大大缩短搜索时间
如上右图,只有一个赋值语句,点击下面的那个方法
转java,如下图左,ID
对应的布局赋值给了参数Q
如上图中,搜索this.Q
参数,在方法H
中,且在该行最后有一个【三元运算符】(又称:冒号表达式)
设置了关键布局的显示与否。前面的GoogleSubscriptionUtil.a
就是突破口了
如上图右,导航中选择H方法
(不清楚请查看文章最开始的基础知识第一条)
尝试修改
如下图左上,点击该处,跳转到如下图左下所示的GoogleSubscriptionUtil.a
定义处。
如下图左下,转java有两个赋值不知道为啥是键盘状态下标(SubscriptFlag4Keyboard)反正是个bool
的布尔值。
我们需要批量替换所有赋值的语句。
把形如
put-boolean 寄存器, Lnet/momentcam/aimee/utils/GoogleSubscriptionUtil;->a:Z
的赋值语句前面插入一句赋值寄存器
为1,
const 寄存器,1
# 理论上应该是const/4 寄存器,0x1
# 为了省事可以如上简写
put-boolean 寄存器, Lnet/momentcam/aimee/utils/GoogleSubscriptionUtil;->a:Z
祭出我们的神器:正则替换(介绍参见【正则表达式】)
mt管理器的正则替换基于java,支持$1
替换(数字递增)
顺便说一句,SciTE库的 正则替换是使用\1
替换(数字递增)
构建匹配的方法,很简单,遇到元字符就加转义,把寄存器的部分用(.*?)
替换,待匹配即可
put-boolean (.*?), Lnet/momentcam/aimee/utils/GoogleSubscriptionUtil;->a:Z
注:此处的问号是非贪婪匹配。。。不然会匹配尽量长的部分(还好没有匹配换行。。。)
如上图中,匹配到了dex内所有的赋值。
<font color="Cyan">注意勾选 “使用正则表达式"</font>
点击替换,使用表达式
const $1,1\nsput-boolean $1, Lnet/momentcam/aimee/utils/GoogleSubscriptionUtil;->a:Z
如上图右,点开dex即可发现所有的赋值都被替换成了需要的形式。
测试效果
如上图左、上图中,VIP的提示和VIP右下角标也不见了。
可是再尝试后发现,如上图左中间HD
图片下载不了。
点击HD
按钮后,如上图右,需要付费ヽ(#`Д′)ノ
注:如果没有所需的网络环境不会弹出付费窗口,直接显示错误
去内购
确定错误弹窗位置
弹窗的内容是支付失败
,到ares
中搜索,
如下图左上,有两处。
为了确定哪一处是此处的弹窗,改成不一样的,再次测试。
此处我改的是一个是支付失败1
一个是支付失败2
至于为什么两个都要改,因为如果两个都改了结果却还是弹出支付失败
的话就要考虑是不是服务器验证了。
如上图左下,成功定位到是第一个支付失败
,复制其ID
。
如上图中,dex搜索,发现除去第一个变量,其余有四处调用该弹窗。
如上图右,点开后发现该调用上面没有判断if-xx
,说明该方法是判断完失败后才调用的。
分析判断
如上图左,转java,此类里有只有一个成功和一个失败的方法,且用public
修饰,
如上图中上,复制该类名,全dex搜索该类名,查看调用
如上图中下,除了该类本身,只有一个类调用。
如上图右,点开转java,找到刚才搜索的类(PayHD
)
有两个判断,如果SnareaPreterencesManagel.a().a(E(),false)
是空,就调用s
方法(应该是支付的方法),如果bool值
是false
的话,弹出错误弹窗。
因此直接改其值为1
即可。
依次修改
因为四个类的判断不相同,
如上图自上至下,依次去更改对于SnareaPreterencesManagel.a().a(E(),false)
返回值的判断
注意的是代码的格式不相同,改的时候也要注意不是都删掉判断
注:笔者更习惯加上#,注释掉,方便二次修改和恢复。
cartoonshare类和randomcartoon类需要特别注意,一个是有两层判断(就是上面的例子),一个是需要改成goto
至此,完成完美破解。
附件
mtHOOK后的文件
mt一键HOOK签名后apk中有改动的文件,解压后直接复制到apk签名即可过签名验证
https://www.lanzouj.com/iapdzng
密码:@52pojie.cn
原包
原件的不限速下载链接
原包CX不限速下载
修改后的demo
修改后的demo版本(经过混淆加密,未加固)
因为超过100MB,精简了lib,分成两个apk,如果不知道你该下载哪一个,可以【点这里】查看详细区别和说明,如果不想看,可以直接点第三个未精简的