爬虫利器:Frida Rpc算法转发

本章来给大家介绍一个爬虫利器,爬虫嗯。利器。算法。爬虫,利器app协议还原利器更合适 ,算法当然,爬虫自己用的利器话是利器,别人用是算法折磨,因为它需要依赖模拟器或手机 。爬虫对于环境来说是利器有些麻烦的!

这个东西我们一般称它为frida rpc算法转发 。源码下载算法

为什么使用rpc算法转发

我们都知道现在开发app主流的爬虫方案是Java,一些中大厂app是利器Java+C++ ,C++最后生成的算法是so ,是arm汇编。

一般分析arm汇编才是最难的,所以中大厂会更倾向把重要加密放在so中 ,来增强爬虫或者破解的难度 !模板下载 ! !

但是如果使用rpc的话  ,你就不太需要分析繁琐的Java层和so层的加密了 !

你需要通过frida主动调用Java层或so层的方法,然后拿到被加密的内容 ,然后其他的操作不是就可以为所欲为了 ?

环境 复制pixel2 v10(已root

)

Magisk v23.0Charles v4.6.2Drony v1.3.154Python v3.8.6frida v14.2.181.2.3.4.5.6. rpc转发案例

本次使用的app是香港云服务器嘟嘟牛 ,百年只刚嘟嘟牛 ,哈哈哈 !

抓包

通过抓包发现,走的接口是http://api.dodovip.com/api/user/login

提交的是一个Encrypt:xxxx,返回的是一串字符串 ,这???啥玩意? ??

所以我们要模拟这个请求  ,必定要捋清这个请求和响应是怎么生成的!亿华云

分析

app拖入jadx中  ,搜索关键字Encrypt :

主要加密逻辑在这一块:

分析不是这一章的重点,相关hook代码 ,稍微研究一下就懂了!

复制Java.perform(function

() {

function printMap2(map

) {

return Java.cast(map, Java.use("java.util.HashMap"

));

}

// Java.use("com.dodonew.online.http.RequestUtil").encodeDesMap.overload(java.lang.String, java.lang.String, java.lang.String).implementation = function (data, desKey, desIV

) {

console.log("RequestUtil encodeDesMap is call"

)

console.log("data:", data

)

console.log("desKey:", desKey)//65102933 console.log("desIV:", desIV)//32028092 let result = this.encodeDesMap(data, desKey, desIV

)

console.log("RequestUtil encodeDesMap result:", result

)

return result

}

Java.use("com.dodonew.online.http.RequestUtil").paraMap.overload(java.util.Map, java.lang.String, java.lang.String).implementation = function (addMap, append, sign

) {

console.log("RequestUtil paraMap is call"

)

console.log("addMap:", addMap

)

console.log("addMap:", printMap2(addMap

))

console.log("append:", append

)

console.log("sign:", sign

)

let result = this.paraMap(addMap, append, sign

)

console.log("RequestUtil paraMap result:", result

)

return result

}

Java.use("com.dodonew.online.http.RequestUtil").decodeDesJson.implementation = function (json, desKey, desIV

) {

console.log("RequestUtil decodeDesJson is call"

)

console.log("json:", json

)

console.log("desKey:", desKey

)

console.log("desIV:", desIV

)

let result = this.decodeDesJson(json, desKey, desIV

)

console.log("RequestUtil decodeDesJson result:", result

)

return result

}

})1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44. 整理

根据上述hook,整理出来主动调用应该是这样调用的,一个加密 ,一个解密。

复制//请求加密function callparaMap(username, userPwd, timeStamp

) {

let result = ""

;

Java.perform(function

() {

let map = Java.use("java.util.HashMap").$new

();

map.put("timeStamp", timeStamp

)

map.put("loginImei", "Androidnull"

)

map.put("equtype", "ANDROID"

)

map.put("userPwd", userPwd

)

map.put("username", username

)

// let r1 = Java.use("com.dodonew.online.http.RequestUtil").paraMap(map, "sdlkjsdljf0j2fsjk", "sign"

)

// console.log("r1:", r1) // result = Java.use("com.dodonew.online.http.RequestUtil").encodeDesMap(r1, "65102933", "32028092"

)

// console.log("r2:", r2)

})

return result

;

}

//响应加密function calldecodedesjson(data

) {

let result = ""

;

Java.perform(function

() {

result = Java.use("com.dodonew.online.http.RequestUtil").decodeDesJson(data, "65102933", "32028092"

)

// console.log("decode:", decode)

})

return result

;

}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29. 搭建服务

既然上述已经把逻辑捋清楚了  ,并且也已经写好的主动调用的js代码  。源码库

那么就来了,如何和python结合到一起,跑成一个web ,这样爬虫只需要响应的参数拿到返回值即可。

代码​ :

复制from fastapi import FastAPIimport uvicornimport fridajsCode = """ function callparamap(username, userPwd, timeStamp

) {

let result = ""

;

Java.perform(function

() {

let map = Java.use("java.util.HashMap").$new

();

map.put("timeStamp", timeStamp

)

map.put("loginImei", "Androidnull"

)

map.put("equtype", "ANDROID"

)

map.put("userPwd", userPwd

)

map.put("username", username

)

// let r1 = Java.use("com.dodonew.online.http.RequestUtil").paraMap(map, "sdlkjsdljf0j2fsjk", "sign"

)

// console.log("r1:", r1) // result = Java.use("com.dodonew.online.http.RequestUtil").encodeDesMap(r1, "65102933", "32028092"

)

// console.log("r2:", r2)

})

return result

;

}

function calldecodedesjson(data

) {

let result = ""

;

Java.perform(function

() {

result = Java.use("com.dodonew.online.http.RequestUtil").decodeDesJson(data, "65102933", "32028092"

)

// console.log("decode:", decode)

})

return result

;

}

rpc.exports =

{

encrypt: callparamap

,

decode: calldecodedesjson

,

};

"""# 准备工作# process = frida.get_device_manager().add_remote_device(192.168.3.68:27042).attach("com.dodonew.online"

)

process = frida.get_usb_device().attach(com.dodonew.online

)

script = process.create_script(jsCode

)

print([*] Running 小肩膀

)

script.load

()

app = FastAPI

()

# http://127.0.0.1:8080/getencrypt?username=18903916120&password=1111&timestamp=1647662720061@app.get("/getencrypt"

)

async def getencrypt(username, password, timestamp

):

result = script.exports.encrypt(username, password, timestamp

)

return { "data": result

}

from pydantic import BaseModelclass Item(BaseModel

):

data: str@app.post("/getdecode"

)

async def getdecode(item: Item

):

result = script.exports.decode(item.data

)

return { "data": result

}

if __name__ == __main__

:

uvicorn.run(app, port=8080)1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.

运行:

构造请求

代码 :

复制import requestsimport timeimport jsondt = time.time() * 1000# 请求加密url = f"http://127.0.0.1:8080/getencrypt?username=18903916120&password=1111&timestamp={ dt}"r1 = requests.get(url

)

print(r1.json

())

# 登录url = "http://api.dodovip.com/api/user/login"headers =

{

"Content-Type": "application/json;charset=utf-8"

}

data =

{

"Encrypt": r1.json().get("data"

)

}

print(data

)

r = requests.post(url=url, headers=headers, data=json.dumps(data

))

print(r.text

)

# 拿到请求解密data =

{

"data": r.text

}

url = "http://127.0.0.1:8080/getdecode"r = requests.post(url=url,headers=headers, data=json.dumps(data

))

print(r.text)1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.

运行:

总结

这个app还是很简单的,但是应该用到了俩加密 ,如果要是硬刚代码的话 ,还是需要研究研究的。免费模板

但是如果使用rpc这种转发方案的话  ,你就可以发现几行代码就完事了!

但是缺陷也是明显的 ,需要依赖电脑和手机,如果只是采集数据的话 ,应该还是挺合适的 !

滇ICP备2023006006号-25