快捷搜索:  汽车  科技

python爬虫算法教程(Python网络爬虫逆向之frida)

python爬虫算法教程(Python网络爬虫逆向之frida)发现有很多newSign 是哪个呢?那就只能猜了,我们先hook第一个,看是不是走的这个!将app拖入jadx中,搜索newSign经过不断测试,发现newSign这个值是不断变化的。通过构造请求,这个值不对确实是无法请求的!!会返回一个签名校验失败!那,如何搞定这个newSign呢?

作者: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爬虫算法教程(Python网络爬虫逆向之frida)(1)

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

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

python爬虫算法教程(Python网络爬虫逆向之frida)(2)

那,如何搞定这个newSign呢?

简单分析

将app拖入jadx中,搜索newSign

python爬虫算法教程(Python网络爬虫逆向之frida)(3)

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

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

python爬虫算法教程(Python网络爬虫逆向之frida)(4)

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爬虫算法教程(Python网络爬虫逆向之frida)(5)

rpc转发

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

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

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

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

python爬虫算法教程(Python网络爬虫逆向之frida)(6)

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爬虫算法教程(Python网络爬虫逆向之frida)(7)

总结

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

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

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

越努力,越幸运。

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

猜您喜欢: