WYY快播1.6正式版破解(代码混淆)

查看 132|回复 10
作者:mengxinb   
app:网易云快播1.6正式版(https://wwb.lanzoub.com/iHCan23t1gxa)
工具:jadx、Burp、frIDA、雷电模拟器
方法:修改网络响应难点:代码混淆、动态控制流(while中套多个case的switch)
app界面:


image.png (176.13 KB, 下载次数: 2)
下载附件
2024-7-31 19:06 上传

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


image.png (25.85 KB, 下载次数: 2)
下载附件
2024-7-31 20:10 上传



image.png (31.13 KB, 下载次数: 2)
下载附件
2024-7-31 20:10 上传



image.png (21.07 KB, 下载次数: 2)
下载附件
2024-7-31 20:11 上传



image.png (40.04 KB, 下载次数: 2)
下载附件
2024-7-31 20:12 上传

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


image.png (125.83 KB, 下载次数: 2)
下载附件
2024-7-31 20:17 上传

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


image.png (140.11 KB, 下载次数: 2)
下载附件
2024-7-31 20:25 上传



image.png (96.45 KB, 下载次数: 2)
下载附件
2024-7-31 20:28 上传

[color=]总结尝试:正常来说,拿到软件后一般都是从最简单的搜关键字符串开始,但是此app混淆了代码,根本无从下手,然后从活动控件下手,想着找到显示输入卡密的对话框,直接将它hook掉就行,但是我对安卓活动控件的获取缺乏相关知识,导致无从下手,最后只能尝试抓包
正文:
一:抓包
1.直接输入aaa后在burp上看抓包信息,发现是个get请求,并且都是明文,而
[color=]secret=aaa
就是我输入的卡密


image.png (171.52 KB, 下载次数: 2)
下载附件
2024-7-31 20:46 上传

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


image.png (114.4 KB, 下载次数: 2)
下载附件
2024-7-31 20:52 上传



image.png (18.98 KB, 下载次数: 2)
下载附件
2024-7-31 20:52 上传



image.png (18.77 KB, 下载次数: 2)
下载附件
2024-7-31 20:53 上传



image.png (19.16 KB, 下载次数: 1)
下载附件
2024-7-31 20:53 上传

3.之后我就直接搜app_id;发现只有2个,网络请求中携带了id那么它肯定调用了return app_id去获取id并放入发送请求中


image.png (42.55 KB, 下载次数: 2)
下载附件
2024-7-31 20:58 上传



image.png (40.31 KB, 下载次数: 2)
下载附件
2024-7-31 21:01 上传

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


image.png (41.41 KB, 下载次数: 2)
下载附件
2024-7-31 21:05 上传



image.png (154.42 KB, 下载次数: 1)
下载附件
2024-7-31 21:09 上传

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


image.png (82.15 KB, 下载次数: 2)
下载附件
2024-7-31 21:21 上传

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


image.png (71.03 KB, 下载次数: 1)
下载附件
2024-7-31 21:23 上传



image.png (86.88 KB, 下载次数: 2)
下载附件
2024-7-31 21:26 上传

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


image.png (35.42 KB, 下载次数: 2)
下载附件
2024-7-31 21:35 上传



image.png (112.04 KB, 下载次数: 2)
下载附件
2024-7-31 21:38 上传

三:回溯服务器响应的判断代码
1.查看是谁调用了m5181,可以发现有两个调用,但是第一个就是我们刚才才看的cd.m8.f()中的,我们直接看第二个


image.png (102.28 KB, 下载次数: 2)
下载附件
2024-7-31 21:48 上传

2.在public static /* synthetic */ void e(String str, Map map, f3 f3Var)

m5181的值被传给str4,之后有两处关键点对str4(也就是服务器的响应信息)进行判断和处理,我们先查看第一次str4做判断的地方(C0120.m3149(str4))


image.png (147.93 KB, 下载次数: 2)
下载附件
2024-7-31 21:59 上传

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


image.png (40.01 KB, 下载次数: 2)
下载附件
2024-7-31 22:07 上传



image.png (153.41 KB, 下载次数: 2)
下载附件
2024-7-31 22:11 上传



image.png (98.49 KB, 下载次数: 2)
下载附件
2024-7-31 22:13 上传

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


image.png (85.5 KB, 下载次数: 2)
下载附件
2024-7-31 22:18 上传

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


image.png (25.14 KB, 下载次数: 2)
下载附件
2024-7-31 22:24 上传



image.png (15.08 KB, 下载次数: 2)
下载附件
2024-7-31 22:25 上传



image.png (20.7 KB, 下载次数: 2)
下载附件
2024-7-31 22:26 上传

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


image.png (89.83 KB, 下载次数: 2)
下载附件
2024-7-31 22:34 上传



image.png (118.96 KB, 下载次数: 2)
下载附件
2024-7-31 22:36 上传



image.png (146.81 KB, 下载次数: 2)
下载附件
2024-7-31 22:40 上传

四:大胆尝试
1.思考本质:
这个app的本质不就是获取用户输入的卡密然后发送给服务器进行验证,然后服务器返回结果,之后app再从服务器返回的结果中来判断是否成功
2.猜想:
如果我直接修改服务器返回的结果呢?我管它服务器返回啥,我直接自己去自定义一个成功的返回值不就行了嘛
3.实践:
3-1.修改msg的值为“卡密正确”,可以看到在只修改msg值的时候,app会显示卡密正确,并且没有出现闪退报错等情况,但是也只是改变了消息,并没有实现功能


image.png (118.2 KB, 下载次数: 2)
下载附件
2024-7-31 22:56 上传

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


image.png (125 KB, 下载次数: 2)
下载附件
2024-7-31 23:02 上传



image.png (126.44 KB, 下载次数: 2)
下载附件
2024-7-31 23:03 上传

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


image.png (103.89 KB, 下载次数: 2)
下载附件
2024-7-31 23:06 上传

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


image.png (241.89 KB, 下载次数: 2)
下载附件
2024-7-31 23:10 上传



image.png (266.6 KB, 下载次数: 2)
下载附件
2024-7-31 23:11 上传

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

下载次数, 下载附件

debug_cat   


mengxinb 发表于 2024-8-1 12:28
我当时也是 hook都没效果
我发现问题了,这个app他双进程的,frida默认hook到的进程居然不是这个app的业务进程。
可以通过查找进程的pid来hook。
先进入shell
blueline:/ # ps -A | grep com.example
u0_a293       9729  1118 49252836 153964 futex_wait_queue_me 0 S com.example.script1719198634987:script
u0_a293       9765  1118 15142616 55960 SyS_epoll_wait      0 S com.example.script1719198634987
发现2个pid。要hook谁?
dump当前堆栈。得到:
  ACTIVITY com.android.chrome/org.chromium.chrome.browser.ChromeTabbedActivity d2bc28e pid=8729
  ACTIVITY com.google.android.apps.nexuslauncher/.NexusLauncherActivity aa9a841 pid=2829
  ACTIVITY com.example.script1719198634987/com.stardust.autojs.inrt.SplashActivity 77b9e69 pid=9729
看这里:9729,就是他了。
接着frida:
firda -U -p 9729 -l test.js
└─[0]  frida -U -p 9729 -l sun.js
     ____
    / _  |   Frida 16.4.7 - A world-class dynamic instrumentation toolkit
   | (_| |
    > _  |   Commands:
   /_/ |_|       help      -> Displays the help system
   . . . .       object?   -> Display information about 'object'
   . . . .       exit/quit -> Exit
   . . . .
   . . . .   More info at https://frida.re/docs/home/
   . . . .
   . . . .   Connected to Pixel 3 (id=)
[Pixel 3::PID::9729 ]-> onResume hook ~~~
p8.e is called: str=https://360mixup.com/feature/pack/verify, map=[object Object], f3Var=cd.xi$a@8b7ac87
C0115.m2849 is called: obj=android.app.ContextImpl@8a0594c, obj2=卡密无效, i7=1
C0115.m2849 result=android.widget.Toast@1c93e11
mengxinb
OP
  

@正己 版主 秒审核啊
ziyezy   

自动审核的,能抓到包的情况,就试试0改1,code改成200,有时候可以瞎猫碰上死耗子
落红护花   

看起来真厉害,我还得慢慢学一学
wasm2023   

这个卡密界面怎么这么熟悉?好像是叫做“云注入”这个app,这么说解决掉一个用云注入加卡密的app之后所有云注入加的卡密通杀了?楼主优秀!!
suolun   

学习了,感谢楼主
lvyuang   

感谢 非常有用 谢谢
lidaxi   

学习咯!
sun0512   

学习了,谢谢
您需要登录后才可以回帖 登录 | 立即注册

返回顶部