这里打开要求我们要更新。而且不能关闭掉
注意点:一定要运行一次app,第一次运行app,一定会弹出一个框,再执行hook
搜索关键词“版本 、更新”
找到了一个这个 updateDialog.show();
这个一看就感觉是更新弹窗
hook更新: 这里我们hook这个updateDialog类,然后执行一个空的 show()
方法,即可绕过弹窗
#使用spawn方式hook
# 枚举手机上的所有进程 & 前台进程,找到 识货的包名
import frida
# 获取设备信息
rdev = frida.get_remote_device()
# 枚举所有的进程
processes = rdev.enumerate_processes()
for process in processes:
print(process)
# 获取在前台运行的APP
front_app = rdev.get_frontmost_application()
print(front_app)
# Application(identifier="com.hupu.shihuo", name="识货", pid=28602, parameters={})
hook强制更新
###### 端口转发
import subprocess
# 使用sbuprocess模块,执行命令,如果转发不了,就执行命令
'''
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
'''
subprocess.run('adb forward tcp:27042 tcp:27042')
subprocess.run('adb forward tcp:27043 tcp:27043')
####### hook代码
import frida
import sys
rdev = frida.get_remote_device()
pid = rdev.spawn(["com.hupu.shihuo"])
session = rdev.attach(pid)
scr = """
Java.perform(function () {
var UpdateDialog = Java.use('com.azhon.appupdate.dialog.UpdateDialog');
UpdateDialog.show.implementation = function(ctx){
console.log("执行了");
//this.show();
}
});
"""
script = session.create_script(scr)
def on_message(message, data):
print(message, data)
script.on("message", on_message)
script.load()
rdev.resume(pid)
sys.stdin.read()
发现我们运行frida脚本就会闪退
基本上有3种绕过方式
这里我们采用第一种方式进行绕过
使用一个通用脚本即可(通过hook安卓底层,依次打印这款app运行时,加载那些so文件)
一般这种公司的安全人员会单独写so文件用来检测,所以我们可以hook-app启动时,执行了那些so文件,发现执行到最后一个程序闪退了,一般就是因为这个so文件导致的,我们可以尝试删除试试
但此方式不使用所有的APP
#通用脚本,打印app运行时加载的so文件
import frida
import sys
rdev = frida.get_remote_device()
pid = rdev.spawn(["com.hupu.shihuo"])
session = rdev.attach(pid)
scr = """
Java.perform(function () {
var dlopen = Module.findExportByName(null, "dlopen");
var android_dlopen_ext = Module.findExportByName(null, "android_dlopen_ext");
Interceptor.attach(dlopen, {
onEnter: function (args) {
var path_ptr = args[0];
var path = ptr(path_ptr).readCString();
console.log("[dlopen:]", path);
},
onLeave: function (retval) {
}
});
Interceptor.attach(android_dlopen_ext, {
onEnter: function (args) {
var path_ptr = args[0];
var path = ptr(path_ptr).readCString();
console.log("[dlopen_ext:]", path);
},
onLeave: function (retval) {
}
});
});
"""
script = session.create_script(scr)
def on_message(message, data):
print(message, data)
script.on("message", on_message)
script.load()
rdev.resume(pid)
sys.stdin.read()
然后删掉这个so文件即可
这种就是代理有问题。只能抓到静态资源
非root推荐使用 SocksDroid 进行socket抓包
有root用小黄鸟抓包
在搜索栏中,输入 马丁靴 点击搜索,抓包查看
可以发现请求参数和请求体都很多。 但是这里很多都不需要携带
可以看到这里是有两个接口的,一个老的,一个新的
# 老接口, 搜索台球杆
import requests
res = requests.post(
url='https://sh-api.shihuo.cn/daga/search/goods/v1',
params={
'minVersion': '15670',
'clientCode': '{holder}',
'v': '7.20.1',
'channel': 'myapp',
'device': 'Pixel 2 XL',
'platform': 'android',
'timestamp': '1703770453838'
},
json={
"keywords": "篮球", # 搜其他商品,只要改这个名字即可
"page": "1",
"pageSize": "20",
},
verify=False
)
print(res.text)
现在这个脚本应该是过期了。抓不了了,会被waf拦截
但是新版的应该是可以的