Python网络爬虫逆向之frida rpc转发案例(x物)

作者:Python进阶者

来源:Python爬虫与数据挖掘

前言

Hello,大家好,我是码农星期八,本次带来的是如何通过frida rpc算法转发来完成x物搜索商品接口的加密!

用到的app

x物4.74.5版本
链接:https://pan.baidu.com/s/1el0a48vsIl7XI-cDr7iynA 
提取码:tlvb 
--来自百度网盘超级会员V1的分享

环境

pixel2   v10(已root)
Magisk   v23.0
Charles  v4.6.2
Drony    v1.3.154
Python   v3.8.6
frida    v14.2.18

x物抓包

首先进行搜索,根据抓到的包逐条筛选,可以发现这条url数据是吻合的!

Python网络爬虫逆向之frida rpc转发案例(x物)

经过不断测试,发现newSign这个值是不断变化的。

通过构造请求,这个值不对确实是无法请求的!!会返回一个签名校验失败!

Python网络爬虫逆向之frida rpc转发案例(x物)

那,如何搞定这个newSign呢?

简单分析

将app拖入jadx中,搜索newSign

Python网络爬虫逆向之frida rpc转发案例(x物)

发现有很多newSign,是哪个呢?那就只能猜了,我们先hook第一个,看是不是走的这个!

点进入,看看是哪个类,hook的是RequestUtils.c这个方法!

Python网络爬虫逆向之frida rpc转发案例(x物)

hook代码

Java.perform(function () {
    function printMap2(map) {
        return Java.cast(map, Java.use("java.util.HashMap"));
    }
    Java.use("com.shizhuang.duapp.common.utils.RequestUtils").c.implementation = function (map, j2) {
        console.log("RequestUtils c is call")
        console.log("map:", map)
        console.log("map:", printMap2(map))
        console.log("j2:", j2)
        let result = this.c(map, j2)
        console.log("RequestUtils c result:", result)

        return result
    }
})

验证

可以发现走的确实是第一个,并且newSign也能对上!

Python网络爬虫逆向之frida rpc转发案例(x物)

rpc转发

那就好办了,既然已经知道了他调用的是哪个方法,但是也不想使劲扣代码,直接上rpc吧!

com.shizhuang.duapp.common.utils.RequestUtils.c这个函数接受的是两个参数。

一个是一个map,一个是时间戳。

map里面包括了分页,要搜索的内容什么的。

Python网络爬虫逆向之frida rpc转发案例(x物)

rpc转发代码

from fastapi import FastAPI
import uvicorn
import frida

jsCode = """
    function newsign(arg_f,j2) {
    let result = "";
    Java.perform(function () {
        let map = Java.use("java.util.HashMap").$new();
        for (let key in arg_f) {
            map.put(key + "", arg_f[key] + "")
        }
        result = Java.use("com.shizhuang.duapp.common.utils.RequestUtils").c(map, j2)
    })
    return result;
}
    rpc.exports = {
        newsign:newsign
    };
"""
# 准备工作
# process = frida.get_device_manager().add_remote_device('192.168.3.68:27042').attach("com.dodonew.online")
process = frida.get_usb_device().attach('com.shizhuang.duapp')
script = process.create_script(jsCode)
print('[*] Running ')
script.load()
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    m: dict
    j2: int


@app.post("/getnewsign")
async def getencrypt(item: Item):
    result = script.exports.newsign(item.m, item.j2)
    return {"data": result}


if __name__ == '__main__':
    uvicorn.run(app, port=8080)

请求接口代码

代码

import requests
import time
import json

timestamp = int(time.time() * 1000)

url = "https://app.dewu.com/api/v1/app/search/ice/search/list"
params = {
    "originSearch": "false", "catId": 0, "abTest": '[{"name":"search_equlheight_spu_strategy","value":"0"}]',
    "hideAddProduct": 0, "sortType": 0, "showHot": 1, "limit": 20, "productDetailVersionFlag": 1, "typeId": 0,
    "sortMode": 0, "page": 0, "title": "13苹果"
}

# ########### 加密newsign begin
data = {
    "m": params,
    "j2": timestamp,
}
r = requests.post("http://127.0.0.1:8080/getnewsign", data=json.dumps(data))
sign = r.json().get("data")
# ########### 加密newsign end
params["newSign"] = sign
print(params)
headers = {
    "duuuid": "38a763c08fd35e88",
    "duimei": "",
    "duplatform": "android",
    "appId": "duapp",
    "duchannel": "pp",
    "humeChannel": "",
    "duv": "4.74.5",
    "duloginToken": "",
    "dudeviceTrait": "Pixel+2",
    "dudeviceBrand": "google",
    "timestamp": f"{timestamp}",
    "shumeiid": "20220315115339c2791752e1a1601028f3d267a317791d01458b2315a9eba3",
    "oaid": "",
    "User-Agent": "duapp/4.74.5(android;10)",
    "X-Auth-Token": "Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1dWlkIjoiMzhhNzYzYzA4ZmQzNWU4OCIsInVzZXJJZCI6MTg1NDk2MzI5NCwiaXNHdWVzdCI6dHJ1ZSwiZXhwIjoxNjc4ODUyNDE4LCJpYXQiOjE2NDczMTY0MTgsImlzcyI6IjM4YTc2M2MwOGZkMzVlODgiLCJzdWIiOiIzOGE3NjNjMDhmZDM1ZTg4In0.AM9apvMO1rj73LmLF3gHLS0IR5kWICzJIxsjXwMaC3NtlF2VdvH2PEAMDLi-gCb6sceplIC8gJlivVp0WxPOYnA5JOmcaGaA32ihjNCNJdsST2vt-I0vyhi4XVcRvK6-H_H8X-miCXnVkUnq0xs0sz4L9A8QSKJAb9y4xTLPKvw_ncwglg7chNDsBM2AfItPRpqjT-rHrW4tEix9EXCIQsAcRSgqodHOq1TPviNm0j8TaX4DMnTQTN4IktwWqiRXUfDtSraQAFeS_1z4lANCWNshRwNNUxlOHmE8kvN91dr9aZ1PvRF8yoBZg9kWvwOSuxYA7W9VPHx6TsOp2xGFhQ",
    "isRoot": "0",
    "emu": "0",
    "isProxy": "0",
    "Host": "app.dewu.com",
    "Accept-Encoding": "gzip",
    "Connection": "keep-alive"
}
r1 = requests.get(url=url, headers=headers, params=params)
print(r1.url)
print(r1.text)

得到的结果

Python网络爬虫逆向之frida rpc转发案例(x物)

总结

小试牛刀一下,果然,rpc万能,除了有点废环境。

人生没有白走的路,加油!

如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。

越努力,越幸运。

我是码农星期八,如果觉得还不错,记得动手点赞一下哈。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章