声明:本文仅供学习交流使用,所涉及的APP和破解版均不提供下载渠道。所涉及的技术请勿用于非法活动,否则所带来的一切后果自负。
朋友提供的某个要收费的虚拟定位灰产APP,破解难度极低。不是很能理解这样的东西也配收费。
环境和工具
环境
工具
破解过程
逆向分析
首先打开未破解的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层,它真我哭。是有些幽默了,破解难度感觉还没我逆向课程设计高,这种也就只能赚不懂技术的人的钱了。(这下断人财路了)
参考