速通MX Player Pro开心版并无视Native层校验

2026-04-11 15:091阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐
问题描述:

前言

事前声明

本人已购买Pro版授权。此文章仅限用于学习和研究目的,不得将下述内容用于商业或者非法用途。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务

起因经过

晚上睡不着闲得无聊来速通一下这个老牌播放器,正好之前粗粮3.8解锁节给我的17pm放出来了,这不得好好玩一下。
主要也是发现这个软件破解版很多,但是教程很少(几乎是没有),如果你担心下到的apk会导致老鼠搬新家那么此教程将教你如何自己手搓Hook实现开心版。
Native层加固怎么了,动态JNI注册又如何,照样给你手撕

成果展示

不想看教程也可以直接划到最后抄作业

1Z Cr4ck1199×722 85.6 KB


正片

需要准备的东西

  1. 解锁并Root且刷入了LSP(其它Xposed框架也可以)模块的手机一台
  2. SimpleHook模块软件
  3. MT文件管理器(其它能分析Dex和Arsc的也可以)
  4. 官方版MX Player Pro(下载前记得区分x86和arm64)
  5. 聪明的你

分析弹窗

当你的手机在启用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
  • 如果当前Activityd(通常是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
个人用着很省心


--【贰】--:

[!tip]
最重要的一步:

Libws:

解锁并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


正片

需要准备的东西

  1. 解锁并Root且刷入了LSP(其它Xposed框架也可以)模块的手机一台
  2. SimpleHook模块软件
  3. MT文件管理器(其它能分析Dex和Arsc的也可以)
  4. 官方版MX Player Pro(下载前记得区分x86和arm64)
  5. 聪明的你

分析弹窗

当你的手机在启用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
  • 如果当前Activityd(通常是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
个人用着很省心


--【贰】--:

[!tip]
最重要的一步:

Libws:

解锁并Root且刷入了LSP(其它Xposed框架也可以)模块的手机一台


--【叁】--:

看了一下思路,本质上就是通过关键词找到检验会员身份的逻辑然后HOOK一下,确实可以应用于大部分软件


--【肆】--: Libws:

聪明的你

啊吧啊吧~~


--【伍】--:

太强了!


--【陆】--:

从未了解过的道路,大佬有教程链接吗?


--【柒】--:

看不懂,也不会操作,哈哈哈


--【捌】--:

其实你用Npatch做免root和去签也可以


--【玖】--:

正好最近API版本更新了:Telegram: View @NPatch