07.逆向练习-识货APP

1. 老版本强制更新绕过

Pasted image 20250507161725
这里打开要求我们要更新。而且不能关闭掉

2. 常见更新情况

  • 选择更新:只是弹出更新框,但是有 关闭,可以关闭,暂时不更新----》app中的所有接口肯定是能用的
  • 强制更新:弹出更新框,直接覆盖住app,无法关闭,必须更新---》可以绕过更新,看看接口是否还能用---》接口能用,接口

2.1. 绕过强制更新的方式

  • 断网重进:app一启动---》向后端发送请求,获取最新版本版本号,跟本地app版本号做比较,如果相差太大,它就会让你更新app,一般情况下,代码就在app开启的第一个页面上,只要切换到别的页面了,这个代码也就不执行了,于是就绕过了
  • HOOK更新弹窗:断网,绕不过,只要连上网,又需要更新

    注意点:一定要运行一次app,第一次运行app,一定会弹出一个框,再执行hook

3. 识货绕过强制更新

3.1. 反编译找关键代码

Pasted image 20250507163139
搜索关键词“版本 、更新”
找到了一个这个 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()

3.2. 删SO文件绕过frida反调试

发现我们运行frida脚本就会闪退

基本上有3种绕过方式

  1. 删so文件
  2. ptrace占坑
  3. frida加强版

这里我们采用第一种方式进行绕过

3.2.1. 如何定位SO文件

使用一个通用脚本即可(通过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()

Pasted image 20250507185149
然后删掉这个so文件即可

4. 抓包分析

4.1. 抓包乱码且少包

Pasted image 20250507185851
这种就是代理有问题。只能抓到静态资源

4.2. 抓更底层的包-socket

非root推荐使用 SocksDroid 进行socket抓包
有root用小黄鸟抓包

Pasted image 20250507194428

在搜索栏中,输入 马丁靴 点击搜索,抓包查看
Pasted image 20250507202010
可以发现请求参数和请求体都很多。 但是这里很多都不需要携带

4.3. 直接通过python重写搜索商品接口

可以看到这里是有两个接口的,一个老的,一个新的
Pasted image 20250507202339

4.3.1. 老接口获取商品

# 老接口,  搜索台球杆  
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拦截
Pasted image 20250507203447

但是新版的应该是可以的
Pasted image 20250507203501