绕过xx鲸选APP强制更新,及分析加密解密

版本:v3.43.0
绕过更新
这个版本是要更新的,更新吗,更新是不可能更新的
app是有加固的,使用frida-dexdump脱壳,这里具体方法不展开了
脱完壳后,反编译,查看检测版本及更新的逻辑
在jadx中搜索“更新”关键词
发现可疑的点,追进去
经过梳理,是调用check()这个函数,然后请求接口: client/upgrade/check 来得到app的版本信息,不为空则更新。
那很明确了,只要把check()返回为空,则不会为空了,使用hook大法
hook代码:
Java.perform(function(){
var UpgradeViewModel = Java.use("com.hd123.update.vm.UpgradeViewModel");
UpgradeViewModel["check"].implementation = function (bApplicationCheckUpgradeRequest) {
console.log('check is called' + ', ' + 'bApplicationCheckUpgradeRequest: ' + bApplicationCheckUpgradeRequest);
console.log('hook show')
return '';
};
});
需要注意的点:
因为要在启动的时候就去改这个更新的状态,要在app启动的时候就插入hook代码,不能在启动完成才插入,所以用程序去启动app及插入hook代码
import time
import frida, sys
def on_message(message, data):
print("[%s] => %s" % (message, data))
app_package_name = 'APP包名'
device = frida.get_usb_device()
try:
process = device.attach(app_package_name)
print('App已经启动')
except frida.ProcessNotFoundError:
print('App未启动,开始启动App...')
pid = device.spawn([app_package_name])
device.resume(pid)
time.sleep(1)
process = frida.get_usb_device().attach(app_package_name)
js = """
"""
script = process.create_script(js)
script.on('message', on_message)
script.load()
sys.stdin.read()
然后就进来了!!
这个app的绕过相对来说会简单一些
分析加密解密
进来后,发现请求参数和结果都是加密的,真的是困难重重啊,
但是即使困难重重,我们也绝不打退堂鼓。
经过漫长的分析,发现居然是加载js文件来完成加密解密的,在app-service.js文件,js文件的路径:
/data/user/0/包名/files/apps/__UNI__AC77004/www/app-service.js
搜索"encrypt"关键词,发现疑似是AES加密
扣出测试一下
奇怪了,解密不出来
再梳理了一遍源码,发现别的地方有一个DES加密解密
难道是DES加密,扣出来测试一下,还真的是DES加密。居然还真的是DES加密,目前DES已经是基本淘汰了
测试接口
没问题…
注意如果报错:UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x80 in position 460
解决方案:
在最前面导入
import subprocess
from functools import partial
subprocess.Popen = partial(subprocess.Popen, encoding=“utf-8”)