安卓逆向 -- 某云快播逆向分析

admin 2024年9月4日06:55:05评论17 views字数 2538阅读8分27秒阅读模式

样本下载地址:

https://pan.quark.cn/s/5bd3282fd3da

安卓逆向 -- 某云快播逆向分析

工具:jadx、Burp、frIDA、雷电模拟器

方法:修改网络响应难点:代码混淆、动态控制流(while中套多个case的switch)

app界面:

安卓逆向 -- 某云快播逆向分析

尝试:

一:搜索关键字

1.搜卡密、提交、有问题、请输入等等均无合适结果,可以说是无论搜界面中的啥,都是没有结果

安卓逆向 -- 某云快播逆向分析

安卓逆向 -- 某云快播逆向分析

二:查询活动控件

1.直接adb shell dumpsys activity | findstr "mResumedActivity"查看当前界面信息,然后再编写代码查看是谁调用了这个;但是其实这个输出的是主页信息,并不是让你输入卡密的对话框信息,所以根本没有

安卓逆向 -- 某云快播逆向分析

2.我想着用开发助手的布局查看试试,但是收费;之后我想着用mt管理器中Activity记录试试看;结果发现是com.stardust.autojs.inrt.SplashActivity > cd.o4,我其实看不懂这个(有没有大佬能解释一下),但是还是尝试去搜了一下cd.o4,然后去hook它里面的方法,但是发现都没调用

安卓逆向 -- 某云快播逆向分析

安卓逆向 -- 某云快播逆向分析

总结尝试:正常来说,拿到软件后一般都是从最简单的搜关键字符串开始,但是此app混淆了代码,根本无从下手,然后从活动控件下手,想着找到显示输入卡密的对话框,直接将它hook掉就行,但是我对安卓活动控件的获取缺乏相关知识,导致无从下手,最后只能尝试抓包

一:抓包

1.直接输入aaa后在burp上看抓包信息,发现是个get请求,并且都是明文,而secret=aaa就是我输入的卡密

安卓逆向 -- 某云快播逆向分析

2.所以直接去jadx中搜secret看看,有47条,但是都是无用的,之后我又尝试搜了一下网址信息,发现都是空的

安卓逆向 -- 某云快播逆向分析

安卓逆向 -- 某云快播逆向分析3.之后我就直接搜app_id;发现只有2个,网络请求中携带了id那么它肯定调用了return app_id去获取id并放入发送请求中

安卓逆向 -- 某云快播逆向分析

4.编写hook代码验证是否调用(感谢@debug_cat 大佬为我解答jadx可以直接复制成frida代码,我之前是直接手动复制“  ۦۦۧۥ   ”这个吊符号,导致hook找不到目标);发现果然app发包时就调用了这个

安卓逆向 -- 某云快播逆向分析

安卓逆向 -- 某云快播逆向分析

二:回溯网络请求

1.查看是谁调用了m2144这个方法;因为混淆,一眼根本看不出来是谁,只能一个个试,但是运气不错,第二个就是

安卓逆向 -- 某云快播逆向分析

2.我们直接hook看看是不是;可以看到public static java.lang.String f(java.lang.String r33, int r34, java.util.Map<java.lang.String, java.lang.String> r35)这个方法第一参数就是网络请求的地址,第二个是0,第三个是个object,而且它的返回值就是服务器的响应信息;说明这个方法就是用来发送网络请求并且返回网络响应

 

安卓逆向 -- 某云快播逆向分析

安卓逆向 -- 某云快播逆向分析3.继续跟进看看是谁调用了它;我们继续hook它看看都有啥有用的信息;m5181就是获取请求地址,0,还有输入的卡密信息,然后调用f()返回服务器的响应信息;我们最终的目的是找到判断服务器响应的代码,然后修改它,继续回溯 

安卓逆向 -- 某云快播逆向分析

安卓逆向 -- 某云快播逆向分析

三:回溯服务器响应的判断代码

1.查看是谁调用了m5181,可以发现有两个调用,但是第一个就是我们刚才才看的cd.m8.f()中的,我们直接看第二个

安卓逆向 -- 某云快播逆向分析

2.在public static /* synthetic */ void e(String str, Map map, f3 f3Var)中m5181的值被传给str4,之后有两处关键点对str4(也就是服务器的响应信息)进行判断和处理,我们先查看第一次str4做判断的地方(C0120.m3149(str4))

安卓逆向 -- 某云快播逆向分析

3.直接跟进,卧槽!!!布尔值!!!难不成就是它???直接hook让它返回true试试!!!其实我当时看见布尔的那一刻,我高兴坏了,以为这个就是判断服务器响应信息的,没想到啊,它是用来判断是否输入卡密的

安卓逆向 -- 某云快播逆向分析安卓逆向 -- 某云快播逆向分析

4.排除了一个,就只剩最后一个 C0118.m3008(f3Var, str4),这里肯定就是对服务器的响应进行提取然后判断;直接跟进看看

安卓逆向 -- 某云快播逆向分析

5.结果发现m3008里面先进行一个判断,然后再执行((f3) obj).c(obj2),跟进去后发现f66是定值-365,之后hook发现C0145.m4569()的值是定值553,说明它一定执行了((f3) obj).c(obj2),我们直接跟进c看看

  

安卓逆向 -- 某云快播逆向分析

6.在c这里,通过分析这里是100%要被调用的,但是hook后显示没有调用;猜测应该是m3008中的obj参数是个接口啥的对obj进行处理;(技术有限,我的分析就止步于此了,欢迎各位大佬继续分析)

  

安卓逆向 -- 某云快播逆向分析

安卓逆向 -- 某云快播逆向分析

四:大胆尝试

1.思考本质:

这个app的本质不就是获取用户输入的卡密然后发送给服务器进行验证,然后服务器返回结果,之后app再从服务器返回的结果中来判断是否成功

2.猜想:

如果我直接修改服务器返回的结果呢?我管它服务器返回啥,我直接自己去自定义一个成功的返回值不就行了嘛

3.实践:

3-1.修改msg的值为“卡密正确”,可以看到在只修改msg值的时候,app会显示卡密正确,并且没有出现闪退报错等情况,但是也只是改变了消息,并没有实现功能

安卓逆向 -- 某云快播逆向分析

3-2.修改datas的值,当它的值为一个时是正常的,但是有两个后就报错了,说明datas的值可能就是是一个

 

安卓逆向 -- 某云快播逆向分析

3-3.修改code的值,我尝试修改了好几个数字,但都是正常的,并没有报错

安卓逆向 -- 某云快播逆向分析


3-4.ts的值跟code的值一样,修改多次依然正常,而且仔细看就知道它是个时间戳,我们直接修改status的值;将status的值修改为1后,app成功完成破解!!!并且一切功能全部正常使用

 

安卓逆向 -- 某云快播逆向分析

总结:此app的卡密验证就是验证服务器返回值中的status的值是否为1,如果为1,卡密正确,如果为0,卡密错误;虽然它做了代码混淆,但是它的包都是明文,而且只判断服务器返回中status的值,这就给了我很大的运气完成了这次破解,这也是我首次完成对混淆代码的破解,虽然有很大的运气成分,对于混淆代码,只要慢慢分析,还是可以知道它的逻辑的,然后再慢慢hook不断验证猜想,你也可以完成对混淆代码的破解,感谢支持,大家互相学习学习

安卓逆向 -- 某云快播逆向分析

原文始发于微信公众号(逆向有你):安卓逆向 -- 某云快播逆向分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年9月4日06:55:05
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   安卓逆向 -- 某云快播逆向分析https://cn-sec.com/archives/3126594.html

发表评论

匿名网友 填写信息