-
-
-
[原创]用修改smali代码的方式破解某茄视频
-
1小时前
46
-
-
前几天看到@
卓桐
大佬用hook的方法破解了某茄视频,我就在想服务器端的验证做的这么辣鸡,app端估计也没什么保护,不如直接反编译了修改smali代码,实现vip效果。
这次破解的主要目的是学习如何插入smali代码,其中有一些坑需要稍微注意一下。
(所以本文的重点不在于搞定了哪个app,而在于踩过哪些坑,嗯,水表已拆,最近没有快递)
百度了好久,找到了一个可以下载的app,先抓个包看看。
好像和大佬破解的app发出来的请求不太一样,但是原理上差不多:先通过getMovieInfo请求拿到mv_url,然后通过mv_url获取影片片段,在访问mv_url时没有任何身份的验证,所以只要通过了getMovieInfo的验证拿到mv_url就可以观看影片了。接下来看一看getMovieInfo请求 。
有两个参数,mvID是影片的ID,uid是用户ID,用其他的uid replay一下这个包仍然能收到正确的返回,那我们只要修改smali代码,让这个uid每次发送的时候都在变化就可以了。
好的,目标锁定,盘他。
首先把apk反编译了,找到构造请求的地方。
b.c()就是获取uid的方法了,要让每次uid都不同,简单一点的方法,我想到两种:
(1)b.c()再加一个随机数作为uid
(2)b.c()再加时间戳的一部分数据作为uid
我这里用的第一种方法,由于不知道服务器允许的uid范围是多少,我只在b.c()的基础上,再加了一个1-100之间的随机数,游客每天有15次免费观看机会,一天100个uid相当于1500部影片,这么多我也看不完啊(身体要紧,狗头保命)。
接下来,先用Android Studio写一段叠加随机数的程序,然后反编译拿出对应的smali代码 。(不知道有没有更好的方法,望大佬指点)
然后把这段smali代码复制到生成getMovieInfo请求的地方,并做出适当修改。
修改smali代码的过程中踩了好多坑,特别需要注意的几个在这里列一下,毕竟这是我们这次学习的主要目的(继续狗头保命)。
(1)插入的代码尽量避开原有代码使用的寄存器。举例:
原本的smali代码中使用了v0-v4这几个寄存器,所以我修改之后的代码是从v6开始的。
这一点如果没注意到,修改时可能覆盖寄存器中原本的数据导致程序崩溃。
(2)不同指令使用的寄存器数量不同,要特别注意某些指令会占用两个寄存器。举例:
调用b.c()时有一句move-result v4,这条指令中将b.c()的返回值存到了寄存器v4中,move-result这条指令只占用一个寄存器;
调用random()时move-result-wide v6语句,同样是将random()的返回值保存到寄存器中,这时使用的不仅仅是v6,而是v6和v7两个寄存器,所以后续在使用round()函数取整时,传入的参数是v6和v7,而在存储浮点数100.0时使用的寄存器是直接从v8开始的。
关于move-result和move-result-wide这两条指令的区别如下图。
其他smali指令可以参考这里
smali代码参考
修改smali代码时,要特别注意某条指令占用了几个寄存器,防止出现数据覆盖的情况。
(3)由于我们新增了寄存器,所以需要修改函数开头的.local字段
.local 10表示我们使用了v0-v9共10个寄存器,代码中可以看到我们只写到v8寄存器。
where is v9?
结合第(2)点,const-wide/high16指令占用了v8和v9两个寄存器,虽然v9寄存器没明确写出来,但是确实是使用了的,所以.local字段应该是10。
关于寄存器和.local的关系,我找到了这样一个描述
好的,盘完手工,对我一个半路入门的外行来说,这些坑花了一整天才爬出来,大佬们见笑,如果文中哪里有错或者哪里有可以改进的地方,希望大佬们不吝指导。
再次感谢@卓桐大佬,站在大佬的肩膀上,分析10分钟,修改一整天。
不说了,我要去休息一下了,毕竟也为郭嘉的扫黄打非和祖国人民的心理健康做出了一些微小的贡献。
[公告]看雪.纽盾 KCTF 2019晋级赛Q3攻击方规则,9月10日开赛,华为P30 Pro、iPad、kindle等你来拿!
文章来源: https://bbs.pediy.com/thread-254319.htm
如有侵权请联系:admin#unsafe.sh