mengxinb 发表于 2024-7-31 23:20

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

app:网易云快播1.6正式版(https://wwb.lanzoub.com/iHCan23t1gxa)
工具: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不断验证猜想,你也可以完成对混淆代码的破解,感谢支持,大家互相学习学习{:301_975:}

debug_cat 发表于 2024-8-1 15:24

mengxinb 发表于 2024-8-1 12:28
我当时也是 hook都没效果

我发现问题了,这个app他双进程的,frida默认hook到的进程居然不是这个app的业务进程。
可以通过查找进程的pid来hook。
先进入shell
```shell
blueline:/ # ps -A | grep com.example
u0_a293       97291118 49252836 153964 futex_wait_queue_me 0 S com.example.script1719198634987:script
u0_a293       97651118 15142616 55960 SyS_epoll_wait      0 S com.example.script1719198634987
```

发现2个pid。要hook谁?

dump当前堆栈。得到:
```shell
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:
```shell
firda -U -p 9729 -l test.js

└─ <> 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=)

-> onResume hook ~~~
p8.e is called: str=https://360mixup.com/feature/pack/verify, map=, f3Var=cd.xi$a@8b7ac87
C0115.m2849 is called: obj=android.app.ContextImpl@8a0594c, obj2=卡密无效, i7=1
C0115.m2849 result=android.widget.Toast@1c93e11
```

mjai5 发表于 2024-9-19 15:00

本帖最后由 mjai5 于 2024-9-19 15:29 编辑

注意!!!要先安装一遍原版,再安装修改版
修改本体
一、思路
已知靓仔的破解思路,直接在获取服务器消息的方法内修改返回的内容,轻轻松松简简单单,赞美靓仔!{:1_919:}


二、步骤
1 去除签名校验(没试有没有签名校验)
2 找到获取服务器消息的方法的类【mirrorb.com.android.internal.policy.*】


3 搜索方法的定义【Ljava/lang/Object;ILjava/lang/Object;)Ljava/lang/String;】因为方法是【public static String m5181(Object obj, int i7, Object obj2)】


4 清空方法内容


5 填入方法内容,第一行定义修改后的服务器数据,第二行返回值

    const-string v0, "{\"result\":{\"msg\":\"\u5361\u5bc6\u65e0\u6548\",\"datas\":{},\"code\":104},\"ts\":1726650825196,\"status\":1}"

    return-object v0



6 结束:victory:

mengxinb 发表于 2024-7-31 23:26

@正己 版主 秒审核啊{:301_1003:}

正己 发表于 2024-7-31 23:32

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

ziyezy 发表于 2024-7-31 23:41

看起来真厉害,我还得慢慢学一学{:301_1003:}

落红护花 发表于 2024-7-31 23:42

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

wasm2023 发表于 2024-8-1 00:04

学习了,感谢楼主

suolun 发表于 2024-8-1 00:08

感谢 非常有用 谢谢

lvyuang 发表于 2024-8-1 00:10

学习咯!{:1_919:}

sun0512 发表于 2024-8-1 00:22

学习了,谢谢

wuaimhw 发表于 2024-8-1 00:27

学习了,强{:1_921:}
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: WYY快播1.6正式版破解(代码混淆)