速通MX Player Pro开心版并无视Native层校验
- 内容介绍
- 文章标签
- 相关推荐
前言
事前声明
本人已购买Pro版授权。此文章仅限用于学习和研究目的,不得将下述内容用于商业或者非法用途。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
起因经过
晚上睡不着闲得无聊来速通一下这个老牌播放器,正好之前粗粮3.8解锁节给我的17pm放出来了,这不得好好玩一下。
主要也是发现这个软件破解版很多,但是教程很少(几乎是没有),如果你担心下到的apk会导致老鼠搬新家那么此教程将教你如何自己手搓Hook实现开心版。
Native层加固怎么了,动态JNI注册又如何,照样给你手撕。
成果展示
不想看教程也可以直接划到最后抄作业
1Z Cr4ck1199×722 85.6 KB
正片
需要准备的东西
- 解锁并Root且刷入了LSP(其它Xposed框架也可以)模块的手机一台
- SimpleHook模块软件
- MT文件管理器(其它能分析Dex和Arsc的也可以)
- 官方版MX Player Pro(下载前记得区分x86和arm64)
- 聪明的你
分析弹窗
当你的手机在启用GMS并正常联网后打开官方软件选择无授权账号后就会弹出如下弹窗
验证失败的弹窗1200×672 151 KB=
可以从弹窗中提取的信息就是"无法验证购买",然后带着这个字符出去MT分析
分析Arsc
搜索相关字符串后这个lic_unauthorized及其对应的7f1203ed就是我们要找的东西
成功定位1200×1413 125 KB
带着7f1203ed去分析Dex
分析Dex
定位与解析
搜索7f1203ed后定位到了一个gR的类中,位于c方法中
成功定位1200×1321 157 KB
将其转为Java代码后可以分析得出c方法是一个处理“许可证验证失败/未授权”的核心回调方法
转为Java代码1200×1212 150 KB
方法签名及参数解析
public final void c(sK sKVar, int i, int i2)
sK:这是一个接口对象,代表当前的许可验证会话/连接i:主状态码/错误码i2:子状态码或附加错误信息
详细执行流程分析
第一步:清理验证会话与清除本地授权标记
sKVar.close();
SharedPreferences.Editor edit = lV.A.d.edit();
edit.remove("gps_manage");
edit.remove("direct_manage");
edit.apply();
- 首先调用
close()关闭当前的网络连接或IPC跨进程验证服务 - 获取应用的SharedPreferences(本地存储)
- 核心动作:清除
gps_manage(Google Play Store验证通过标记)和direct_manage(Direct/直购验证通过标记)以确保在下次启动时会被视为“未授权”状态
第二步:全局特权检查 (后门/白名单/特殊版本)
int i5 = Build.VERSION.SDK_INT; // 获取安卓系统版本
if (App.M()) {
return;
}
App.M()这是一个全局的布尔检查,非常可疑,感觉像是开发者留的授权调试后门或者用于已预授权的版本- 如果为true,则直接return,忽略验证失败 ,让应用继续正常运行。
第三步:针对 Android 6.0 及以上版本的特殊处理
if (i5 >= 23 && ((App) lV.y).N()) {
d d = e2.d();
if (d instanceof d) {
d.u2();
return;
}
return;
}
i5 >= 23意味着系统是Android 6.0 (Marshmallow)及以上App.N()可能是检查应用是否处于某种特定状态(例如:正在请求动态权限,或者处于某种特定播放模式)- 如果满足条件,它会获取当前处于前台的
d - 如果当前
Activity是d(通常是MX Player的主播放界面Activity),则调用其u2()方法直接退出(是一个close直接闪退)
后续步骤
大概就是处理特定的错误码并强制关闭所有页面,然后构建错误提示文本,然后弹窗并结束应用
c方法核心逻辑
发现没有授权 → 删除本地的通过记录 → 强行关闭所有正在显示的界面 → 拼装错误原因 → 弹出一个无法取消的提示框 → 引导用户去 Google Play 购买或者强行结束应用
编写Hook
思路
为了绕过验证,我将尝试对App.M()使用Hook返回值模式,因为
- 在
b()方法中:... || App.M()如果为 true,则认为验证通过。 - 在
c()方法(失败惩罚)中:if (App.M()) { return; }如果为 true,则直接跳过弹窗和闪退惩罚
这说明App.M()是一个全局的“免死金牌”(可能是给开发者调试用的,或者是预授权)
开始配置SimpleHook
- 目标类名 :
com.mxtech.videoplayer.pro.App - 方法名 :
M - 参数类型 :
无 - Hook 模式 :
修改返回值 (Return Value) - 替换值为 :
true (Boolean)
成功开裂
1Z Cr4ck1200×1616 231 KB
后文
补充说明
其实如果仔细分析后会发现除了VF (Google Play 验证)这个类以外,还会有个GV (官网直购验证)的类。
c()方法收集了手机的Account(邮箱)、包名、签名以及android_id作为机器码(设备特征)然后交给GV中的doInBackground()方法中的pm0进行加密并联网验证(需要进入Native层分析了),但是它内部有一个硬编码的密钥可以参考一下。
Native层的分析
我用IDA PRO简单的看了一下许可证的验证逻辑大概是在sub_319B0这个函数中。
然后就是lV类的f()和g()方法涉及的Java_com_ddx_axx_axx_axx_BH_w也就是sub_2EABC函数则是一个网络加固逻辑。
至于为什么不分析sub_319B0或做相应的注入,请看下图,属于是转个伪C都得等一会。
高山流水222×925 28.5 KB
反正有后门就先用着,等作者删了再撕Native也不急
抄作业直通车
[{"packageName":"com.mxtech.videoplayer.pro","appName":"MX 播放器专业版","versionName":"1.93.4","description":"Hello MXP","configs":"[{\"className\":\"com.mxtech.videoplayer.pro.App\",\"methodName\":\"M\",\"resultValues\":\"true\",\"hookPoint\":\"after\",\"desc\":\"from dex browser\"},{\"className\":\"gR\",\"methodName\":\"b\",\"resultValues\":\"true\",\"hookPoint\":\"after\",\"desc\":\"from dex browser\",\"enable\":false},{\"mode\":1,\"className\":\"gR\",\"methodName\":\"c\",\"params\":\"sK,int,int\",\"resultValues\":\"null\",\"hookPoint\":\"after\",\"desc\":\"from dex browser\",\"enable\":false}]","id":1}]
网友解答:
--【壹】--:
懒得改了,直接基于开源项目改了个播放器,很多逻辑模仿了 MX
个人用着很省心
--【贰】--:
Libws:[!tip]
最重要的一步:
解锁并Root且刷入了LSP(其它Xposed框架也可以)模块的手机一台
--【叁】--:
看了一下思路,本质上就是通过关键词找到检验会员身份的逻辑然后HOOK一下,确实可以应用于大部分软件
--【肆】--: Libws:
聪明的你
啊吧啊吧~~
--【伍】--:
太强了!
--【陆】--:
从未了解过的道路,大佬有教程链接吗?
--【柒】--:
看不懂,也不会操作,哈哈哈
--【捌】--:
其实你用Npatch做免root和去签也可以
--【玖】--:
正好最近API版本更新了:Telegram: View @NPatch
前言
事前声明
本人已购买Pro版授权。此文章仅限用于学习和研究目的,不得将下述内容用于商业或者非法用途。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
起因经过
晚上睡不着闲得无聊来速通一下这个老牌播放器,正好之前粗粮3.8解锁节给我的17pm放出来了,这不得好好玩一下。
主要也是发现这个软件破解版很多,但是教程很少(几乎是没有),如果你担心下到的apk会导致老鼠搬新家那么此教程将教你如何自己手搓Hook实现开心版。
Native层加固怎么了,动态JNI注册又如何,照样给你手撕。
成果展示
不想看教程也可以直接划到最后抄作业
1Z Cr4ck1199×722 85.6 KB
正片
需要准备的东西
- 解锁并Root且刷入了LSP(其它Xposed框架也可以)模块的手机一台
- SimpleHook模块软件
- MT文件管理器(其它能分析Dex和Arsc的也可以)
- 官方版MX Player Pro(下载前记得区分x86和arm64)
- 聪明的你
分析弹窗
当你的手机在启用GMS并正常联网后打开官方软件选择无授权账号后就会弹出如下弹窗
验证失败的弹窗1200×672 151 KB=
可以从弹窗中提取的信息就是"无法验证购买",然后带着这个字符出去MT分析
分析Arsc
搜索相关字符串后这个lic_unauthorized及其对应的7f1203ed就是我们要找的东西
成功定位1200×1413 125 KB
带着7f1203ed去分析Dex
分析Dex
定位与解析
搜索7f1203ed后定位到了一个gR的类中,位于c方法中
成功定位1200×1321 157 KB
将其转为Java代码后可以分析得出c方法是一个处理“许可证验证失败/未授权”的核心回调方法
转为Java代码1200×1212 150 KB
方法签名及参数解析
public final void c(sK sKVar, int i, int i2)
sK:这是一个接口对象,代表当前的许可验证会话/连接i:主状态码/错误码i2:子状态码或附加错误信息
详细执行流程分析
第一步:清理验证会话与清除本地授权标记
sKVar.close();
SharedPreferences.Editor edit = lV.A.d.edit();
edit.remove("gps_manage");
edit.remove("direct_manage");
edit.apply();
- 首先调用
close()关闭当前的网络连接或IPC跨进程验证服务 - 获取应用的SharedPreferences(本地存储)
- 核心动作:清除
gps_manage(Google Play Store验证通过标记)和direct_manage(Direct/直购验证通过标记)以确保在下次启动时会被视为“未授权”状态
第二步:全局特权检查 (后门/白名单/特殊版本)
int i5 = Build.VERSION.SDK_INT; // 获取安卓系统版本
if (App.M()) {
return;
}
App.M()这是一个全局的布尔检查,非常可疑,感觉像是开发者留的授权调试后门或者用于已预授权的版本- 如果为true,则直接return,忽略验证失败 ,让应用继续正常运行。
第三步:针对 Android 6.0 及以上版本的特殊处理
if (i5 >= 23 && ((App) lV.y).N()) {
d d = e2.d();
if (d instanceof d) {
d.u2();
return;
}
return;
}
i5 >= 23意味着系统是Android 6.0 (Marshmallow)及以上App.N()可能是检查应用是否处于某种特定状态(例如:正在请求动态权限,或者处于某种特定播放模式)- 如果满足条件,它会获取当前处于前台的
d - 如果当前
Activity是d(通常是MX Player的主播放界面Activity),则调用其u2()方法直接退出(是一个close直接闪退)
后续步骤
大概就是处理特定的错误码并强制关闭所有页面,然后构建错误提示文本,然后弹窗并结束应用
c方法核心逻辑
发现没有授权 → 删除本地的通过记录 → 强行关闭所有正在显示的界面 → 拼装错误原因 → 弹出一个无法取消的提示框 → 引导用户去 Google Play 购买或者强行结束应用
编写Hook
思路
为了绕过验证,我将尝试对App.M()使用Hook返回值模式,因为
- 在
b()方法中:... || App.M()如果为 true,则认为验证通过。 - 在
c()方法(失败惩罚)中:if (App.M()) { return; }如果为 true,则直接跳过弹窗和闪退惩罚
这说明App.M()是一个全局的“免死金牌”(可能是给开发者调试用的,或者是预授权)
开始配置SimpleHook
- 目标类名 :
com.mxtech.videoplayer.pro.App - 方法名 :
M - 参数类型 :
无 - Hook 模式 :
修改返回值 (Return Value) - 替换值为 :
true (Boolean)
成功开裂
1Z Cr4ck1200×1616 231 KB
后文
补充说明
其实如果仔细分析后会发现除了VF (Google Play 验证)这个类以外,还会有个GV (官网直购验证)的类。
c()方法收集了手机的Account(邮箱)、包名、签名以及android_id作为机器码(设备特征)然后交给GV中的doInBackground()方法中的pm0进行加密并联网验证(需要进入Native层分析了),但是它内部有一个硬编码的密钥可以参考一下。
Native层的分析
我用IDA PRO简单的看了一下许可证的验证逻辑大概是在sub_319B0这个函数中。
然后就是lV类的f()和g()方法涉及的Java_com_ddx_axx_axx_axx_BH_w也就是sub_2EABC函数则是一个网络加固逻辑。
至于为什么不分析sub_319B0或做相应的注入,请看下图,属于是转个伪C都得等一会。
高山流水222×925 28.5 KB
反正有后门就先用着,等作者删了再撕Native也不急
抄作业直通车
[{"packageName":"com.mxtech.videoplayer.pro","appName":"MX 播放器专业版","versionName":"1.93.4","description":"Hello MXP","configs":"[{\"className\":\"com.mxtech.videoplayer.pro.App\",\"methodName\":\"M\",\"resultValues\":\"true\",\"hookPoint\":\"after\",\"desc\":\"from dex browser\"},{\"className\":\"gR\",\"methodName\":\"b\",\"resultValues\":\"true\",\"hookPoint\":\"after\",\"desc\":\"from dex browser\",\"enable\":false},{\"mode\":1,\"className\":\"gR\",\"methodName\":\"c\",\"params\":\"sK,int,int\",\"resultValues\":\"null\",\"hookPoint\":\"after\",\"desc\":\"from dex browser\",\"enable\":false}]","id":1}]
网友解答:
--【壹】--:
懒得改了,直接基于开源项目改了个播放器,很多逻辑模仿了 MX
个人用着很省心
--【贰】--:
Libws:[!tip]
最重要的一步:
解锁并Root且刷入了LSP(其它Xposed框架也可以)模块的手机一台
--【叁】--:
看了一下思路,本质上就是通过关键词找到检验会员身份的逻辑然后HOOK一下,确实可以应用于大部分软件
--【肆】--: Libws:
聪明的你
啊吧啊吧~~
--【伍】--:
太强了!
--【陆】--:
从未了解过的道路,大佬有教程链接吗?
--【柒】--:
看不懂,也不会操作,哈哈哈
--【捌】--:
其实你用Npatch做免root和去签也可以
--【玖】--:
正好最近API版本更新了:Telegram: View @NPatch

