某灰产收费虚拟定位APP逆向破解教程

查看 132|回复 10
作者:DetLFY   
写在前面

声明:本文仅供学习交流使用,所涉及的APP和破解版均不提供下载渠道。所涉及的技术请勿用于非法活动,否则所带来的一切后果自负。

朋友提供的某个要收费的虚拟定位灰产APP,破解难度极低。不是很能理解这样的东西也配收费。
环境和工具
环境
  • MacOS 13.6.3
  • Java 20.0.2
  • Python 3.11.5

    工具
  • Android Studio 2022.3.1 Patch 2
  • JEB 5.2.0.202308292043
  • frida 16.1.8
  • apktool 2.9.3
  • shell-tools

    破解过程
    逆向分析
    首先打开未破解的APP,映入眼帘的就是要求输入卡密才能使用......(什么CrackMe?)


    1.png (68.8 KB, 下载次数: 0)
    下载附件
    2024-3-21 17:47 上传

    先打开JEB,搜索字符串“登录”,很快啊,在yz.local下就找到了:


    2.png (582.48 KB, 下载次数: 0)
    下载附件
    2024-3-21 17:49 上传

    初步判断yz.local就是和登录以及卡密获取、试用逻辑啥的相关的一个类。可以看到类中的成员变量local.host和local.host2这两个域名和IP(图中已打码部分),初步判断这个就是来远程判断是否拥有卡号(卡密)的,这样的话,应该有和API直接交互的逻辑。往下找:


    3.png (75.42 KB, 下载次数: 0)
    下载附件
    2024-3-21 17:49 上传

    果然啊,有个和API进行交互的方法。而且通过构造传递给API的参数(在别的方法中可以找到需要传递的参数),可以确认这个API就是检验卡号是否正确以及有没有过期的(幽默订阅制)。
    那么目前可以确定的就是卡号的合法性验证逻辑在远程,并且需要联网访问,但是返回的值判断却在本地(因为API只返回状态值),因此要绕过理论是可以通过发伪包的(没试过)。
    现在还要确认的是实现这个虚拟定位功能需不需要和远程的某个API进行交互。通过购买了卡号的朋友断网验证:虚拟定位的逻辑是写在本地的。这就有些搞笑了,这也就意味着只有卡号验证是要通过远程API来的,而实际的功能部分却写在了本地。换言之,卡号验证只是一个限制,只要绕过了这个限制,就能免费正常使用虚拟定位的功能。
    那么要做的事情就很简单了,绕过卡号验证,也就是crack掉最开始的那个输入框。经过简单的寻找,发现这个框的逻辑是写在local.load这个方法里的:


    4.png (377.22 KB, 下载次数: 0)
    下载附件
    2024-3-21 17:49 上传

    frida hook
    还是个public的静态方法,写个frida hook验证一下:
    import frida  # 导入frida模块
    import sys    # 导入sys模块
    jscode = '''
        Java.perform(function(){
            var targetClass = Java.use('yz.local');
            targetClass.load.implementation = function() {
                console.log('hack');
                return;
            }
        });
    '''
    def on_message(message,data): #js中执行send函数后要回调的函数
        print(message)
    # 获取设备
    device = frida.get_usb_device()
    # 应用程序包名
    app_name = 'xu.nx.zheror'
    # 启动应用程序并获取其进程 ID
    pid = device.spawn([app_name])
    # 附加到应用程序进程
    session = device.attach(pid)
    # 创建并加载 Frida 脚本
    script = session.create_script(jscode)
    # 添加消息监听器
    script.on('message', on_message)
    # 加载脚本
    script.load()
    # 从 spawn 状态过渡到运行状态
    device.resume(pid)
    # 保持 Python 脚本运行,直到手动中断或者其他操作
    sys.stdin.read()
    跑一下,成功绕过,只能说过于幽默了:


    5.png (1.5 MB, 下载次数: 0)
    下载附件
    2024-3-21 17:49 上传

    crack
    决定采用最简单粗暴也最有效的方法:解包,硬改smali,重签名打包
    解包和签名打包的脚本用的是:https://github.com/8enet/shell-tools
    首先是解包,执行:
    ./decompile.sh ***.apk    # ***.apk是安装包路径
    不出意外的话会得到类似这样的结果:


    6.png (1005.51 KB, 下载次数: 0)
    下载附件
    2024-3-21 17:49 上传

    然后找到apk解包后的目录/smali_classes9/yz/local.smali打开,搜索“load”找到smali对应的方法,把方法中其都删掉,只保留一个.locals和return,修改后的如下图:


    7.png (33.92 KB, 下载次数: 0)
    下载附件
    2024-3-21 17:49 上传

    然后保存修改后的smali文件。
    最后是重签名打包,执行:
    ./rebuild.sh ***    # ***是解包后的路径
    失败的话记得用keytool先生成keystore的签名文件,然后修改rebuild.sh里的keystore路径等信息,成功的话会得到类似这样的结果:


    8.png (1.54 MB, 下载次数: 0)
    下载附件
    2024-3-21 17:49 上传

    将修改后重签名的apk安装到实机上测试(如果之前有安装过的话记得卸载,不然会有签名冲突),赋予相应权限后可以看到虚拟定位的功能可以正常使用,破解成功:


    9.jpg (98.14 KB, 下载次数: 0)
    下载附件
    2024-3-21 17:49 上传

    后记
    没有暗桩、加壳、加密、混淆,判断逻辑写在Java层,它真我哭。是有些幽默了,破解难度感觉还没我逆向课程设计高,这种也就只能赚不懂技术的人的钱了。(这下断人财路了)
    参考
  • 修改smali插入代码
  • frida入门总结
  • frida hook 工具基础使用(一)
  • 8enet/shell-tools

    下载次数, 下载附件

  • DetLFY
    OP
      


    LUN 发表于 2024-3-22 16:52
    楼主发个成品我测试下

    不太敢发出来。
    tl2012   

    大哥   我是绝对新人,研究你这个帖子好多天了,我用的是win10系统,用你说的https://github.com/8enet/shell-tools这个脚本一直没办法反编译,就用了apktool,反编译后没有你说的smali文件,又将反编译出来的classes1-9.dex。文件变成jar文件,查看了还是没有你说的yz文件夹,load也没找到一样的,好多天了  太难了。能给我讲一下吗?
    lun   

    楼主发个成品我测试下
    PKUYJSWLL   

    成品想试试
    yzx1091074551   


    LUN 发表于 2024-3-22 16:52
    楼主发个成品我测试下

    打的算盘我这都听到了
    stonepc   

    我也想测试一下成品
    mx290031   

    大家期望这么高 来一个吧
    Skiing   

    mark数字补丁
    liuhai7435   

    大佬原版软件发出来练练手可否
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部