【转载】某鱼自定义协议请求抓包+加密参数分析

admin 2026-03-27 13:28:14 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文介绍了如何绕过某鱼APP的私有协议(SPDY)以进行抓包分析,并深入解析其请求参数的生成过程。通过使用Frida或Xposed对关键函数进行Hook,可以强制应用使用HTTP协议,从而实现数据包的正常抓取。文章重点分析了x-sign、x-sgext等核心加密参数,并通过HookHashMap的put方法和搜索关键词,定位并追踪到参数的生成源头,为进一步的协议分析提供了详细的技术路径。 综合评分: 85 文章分类: 渗透测试,移动安全,逆向分析,WEB安全,红队


cover_image

【转载】某鱼自定义协议请求抓包+加密参数分析

隐雾安全

2026年3月18日 09:00 四川

好文推荐

文章作者:先知社区(姓*户)

文章来源:https://xz.aliyun.com/news/18258

某些淘系APP使用私有协议(如SPDY)进行网络通信,导致传统抓包工具(例如:Charles、Fiddler)无法直接抓取数据包。本文将介绍如何绕过该私有协议并分析其请求参数的生成过程。

APP分析

使用jadx打开apk,搜索spdy,可以找到多个与私有协议相关的类和方法

可以看到确实搜索到许多私有协议相关的代码

通过查看搜索结果,可以看到有关开启spdy的代码

选择其中传入布尔值的函数

很明显这个函数的作用是根据传入参数决定是否开启spdy协议,因此要绕过该协议,可以hook这个函数,每次调用这个函数时修改传入其中的参数值为false

Hook

Frida Hook

Java.perform(function () {    var SwitchConfig = Java.use('mtopsdk.mtop.global.SwitchConfig');    SwitchConfig.A.overload().implementation = function () {        return false;    }});

Xposed Hook

package com.example.spdy_xposed;
import android.util.Log;import de.robv.android.xposed.XC_MethodHook;import de.robv.android.xposed.XposedHelpers;import de.robv.android.xposed.IXposedHookLoadPackage;import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
public&nbsp;class&nbsp;Hook&nbsp;implements&nbsp;IXposedHookLoadPackage&nbsp;{&nbsp; &nbsp;&nbsp;public&nbsp;void&nbsp;handleLoadPackage(final&nbsp;LoadPackageParam lpparam)&nbsp;throws&nbsp;Throwable {&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(lpparam.packageName.equals("com.taobao.idlefish")) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Class<?> clazz = XposedHelpers.findClass("mtopsdk.mtop.global.SwitchConfig", lpparam.classLoader);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; XposedHelpers.findAndHookMethod(clazz,&nbsp;"A",&nbsp;new&nbsp;XC_MethodHook() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;public&nbsp;void&nbsp;beforeHookedMethod(MethodHookParam param)&nbsp;throws&nbsp;Throwable {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; param.setResult((Object)&nbsp;false);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; ;&nbsp; &nbsp; }}

参数分析

启动hook脚本之后,打开应用的搜索页面,搜索任意商品后查看Charles抓包的结果

可以看到应用已经使用了HTTP协议进行通信,可以正常抓取响应内容。

分析请求中携带的参数

为了分析请求中携带的参数,首先使用Python复现Charles中的请求,验证抓包结果的有效性。

import&nbsp;requests

headers&nbsp;=&nbsp;{&nbsp; &nbsp;&nbsp;"x-sgext":&nbsp;"JBLT1mDmXUuXg6jevoMmPtbi5uLu4vXi5%2Bfv4fXn7vD14uHn7%2Bvv4eLn7vDm4eKy5uPm4u%2Bx5OOwsOfh9efh8OTj9eDi8Obj5uT15%2FXi9eL14vXi9eL14vXi9ef14PXj9eP14%2FXj9eP14%2FXj9fCz8Obw5vCy4O6w5%2Bb14%2Bbj5uP14%2FXhsrL14%2FXw5fDh8Obw5fCskoWr9eP18%2FbhtPP24bDw4ozk9eDq8OHw5e7nsufk5O%2F15Orw4%2FDj8OHv9eb15vXm9eb1ieaJ4%2FDj8OXu57Ln5OTv9eb15vXm9eb15vXmjLeM5PXm9eSM",&nbsp; &nbsp;&nbsp;"umid":&nbsp;"oDUBH55LPG9aVwKXHLSKcn1TwTnLhf/m",&nbsp; &nbsp;&nbsp;"x-sign":&nbsp;"azU7Bc002xAAJImRBe19ymSlZXLalImUhmpqwg42clyTl9mFcHA6Unwx%2Bb34X8EzrkG1hxUs1mrizr3g2tXFICjQLwXZlImUibSJlI",&nbsp; &nbsp;&nbsp;"x-magic_device":&nbsp;"0",&nbsp; &nbsp;&nbsp;"x-nettype":&nbsp;"WIFI",&nbsp; &nbsp;&nbsp;"x-pv":&nbsp;"6.3",&nbsp; &nbsp;&nbsp;"x-nq":&nbsp;"WIFI",&nbsp; &nbsp;&nbsp;"EagleEye-UserData":&nbsp;"spm-cnt=a2170.8011571.0.0&spm-url=a2170.7898022.6364723.3",&nbsp; &nbsp;&nbsp;"first_open":&nbsp;"0",&nbsp; &nbsp;&nbsp;"x-features":&nbsp;"27",&nbsp; &nbsp;&nbsp;"channel_2":&nbsp;"",&nbsp; &nbsp;&nbsp;"x-app-conf-v":&nbsp;"0",&nbsp; &nbsp;&nbsp;"x-mini-wua":&nbsp;"aaQSnmhzkgV%2Fn7jMxcTIiO2NeBwpTQpDPGWctpqoUCKMtT0rMQJvLqD5NOUrwc6ctzCRhMwZoWx51ICVu%2BtrJkmYC9iF%2BFwNIjMj1kiQaOBwICiczC7BJOE477uYwSHwF3rE0K%2FIP1poYkSNg8Ec3waGHZqP1ZvL%2Fd3t%2F5rOkO6Q2pGGWClBaxnTZ%2FulwNUdxB7k%3D",&nbsp; &nbsp;&nbsp;"content-type":&nbsp;"application/x-www-form-urlencoded;charset=UTF-8",&nbsp; &nbsp;&nbsp;"oaid":&nbsp;"f3a11878eaa0773a",&nbsp; &nbsp;&nbsp;"x-t":&nbsp;"1749893761",&nbsp; &nbsp;&nbsp;"Content-Type":&nbsp;"application/x-www-form-urlencoded;charset=UTF-8",&nbsp; &nbsp;&nbsp;"x-bx-version":&nbsp;"6.6.231201.33656539",&nbsp; &nbsp;&nbsp;"f-refer":&nbsp;"mtop",&nbsp; &nbsp;&nbsp;"x-extdata":&nbsp;"openappkey%3DDEFAULT_AUTH",&nbsp; &nbsp;&nbsp;"x-ttid":&nbsp;"700502%40fleamarket_android_7.21.10",&nbsp; &nbsp;&nbsp;"x-app-ver":&nbsp;"7.21.10",&nbsp; &nbsp;&nbsp;"x-c-traceid":&nbsp;"null17498937619300048111492",&nbsp; &nbsp;&nbsp;"x-location":&nbsp;"0%2C0",&nbsp; &nbsp;&nbsp;"x-umt":&nbsp;"3hABbHxLPBDoggKXbSw2t9%2Fgt9y1B7xO",&nbsp; &nbsp;&nbsp;"a-orange-q":&nbsp;"appKey=21407387&appVersion=7.21.10&clientAppIndexVersion=1120250612195902300&clientVersionIndexVersion=0",&nbsp; &nbsp;&nbsp;"x-utdid":&nbsp;"aDXu%2FkOQwcgDAFHssynWEb4Y",&nbsp; &nbsp;&nbsp;"c-launch-info":&nbsp;"3,0,1749893761929,1749893750997,3",&nbsp; &nbsp;&nbsp;"x-appkey":&nbsp;"21407387",&nbsp; &nbsp;&nbsp;"x-falco-id":&nbsp;"061f5d9e5d1c4ccf9b4b461b4307f247",&nbsp; &nbsp;&nbsp;"user-agent":&nbsp;"MTOPSDK%2F3.1.1.7+%28Android%3B9%3BXiaomi%3BMI+6X%29",&nbsp; &nbsp;&nbsp;"Host":&nbsp;"g-acs.m.goofish.com"}url&nbsp;=&nbsp;"https://g-acs.m.goofish.com/gw/mtop.taobao.idlemtopsearch.search/1.0/"data&nbsp;=&nbsp;{&nbsp; &nbsp;&nbsp;"data":&nbsp;"{\"abConfigs\":\"{\\\"isEnterResultNative\\\":\\\"true\\\",\\\"isSearchResultNative\\\":\\\"true\\\"}\",\"activeSearch\":false,\"apiName\":\"com.taobao.idlefish.search_implement.protocol.SearchResultReq\",\"bizFrom\":\"home\",\"disableHierarchicalSort\":0,\"extraFilterValue\":\"{\\\"divisionList\\\":[],\\\"excludeMultiPlacesSellers\\\":\\\"0\\\"}\",\"forceUseInputKeyword\":false,\"forceUseTppRepair\":false,\"fromFilter\":false,\"fromKits\":false,\"fromLeaf\":false,\"fromShade\":false,\"fromSuggest\":false,\"keyword\":\"电动车\",\"mainTab\":true,\"originJson\":false,\"page\":1,\"pageNumber\":1,\"passThroughForSearch\":\"{\\\"bucket_id\\\":\\\"21\\\",\\\"entire_scene_bucket_id\\\":\\\"21\\\",\\\"intelligent_bucket_id\\\":\\\"21\\\",\\\"rn\\\":\\\"e8d2be24a6a01b654990f4c2f35d0213\\\",\\\"user_id\\\":\\\"0\\\"}\",\"relateResultListLastIndex\":0,\"relateResultPageNumber\":1,\"resultListLastIndex\":0,\"rowsPerPage\":10,\"searchReqFromActivatePagePart\":\"recommendItem\",\"searchReqFromPage\":\"xyHome\",\"searchTabType\":\"SEARCH_TAB_MAIN\",\"smartUIFilter\":true,\"supportFlexFilter\":true}"}response&nbsp;=&nbsp;requests.post(url, headers=headers, data=data)
print(response.text)print(response)

然后对于header中的内容逐个进行分析,会发现除了几个和时间戳相关的项(x-tx-c-traceid)之外,主要是以下的参数

  • x-sign

  • x-sgext

  • `x_mini_wua

  • x_umt

    有关如何定位请求需要分析的参数,方法有很多,比如每次修改或者去掉某个参数,然后重新请求,或者重复请求(不同的关键词),然后比较两次请求中不同的参数

为了定位这些参数的生成代码,可以使用搜索关键词或Hook特定函数的方法。这里选择Hook HashMapput方法,因为Header参数通常会通过HashMap进行构造。

function&nbsp;main() {&nbsp; &nbsp;&nbsp;Java.perform(function&nbsp;() {&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;var&nbsp;hashMap =&nbsp;Java.use("java.util.HashMap");&nbsp; &nbsp; &nbsp; &nbsp; hashMap.put.implementation&nbsp;=&nbsp;function&nbsp;(a, b) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;console.log('输出-->', a, b)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;this.put(a, b)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; })}
setImmediate(main);// frida -UF -l tmp.js -o xy.txt

从Frida的输出结果可以看出,Header的参数确实是通过HashMap的put方法构造的。

下一步是匹配关键词,然后匹配到x-sgext等关键词时输出堆栈,方便分析生成header参数的位置

function&nbsp;main() {&nbsp; &nbsp;&nbsp;Java.perform(function&nbsp;() {&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;function&nbsp;showStacks() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Java.perform(function&nbsp;() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;console.log(Java.use("android.util.Log").getStackTraceString(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Java.use("java.lang.Throwable").$new()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; })&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;var&nbsp;hashMap =&nbsp;Java.use("java.util.HashMap");&nbsp; &nbsp; &nbsp; &nbsp; hashMap.put.implementation&nbsp;=&nbsp;function&nbsp;(a, b) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(a ==&nbsp;"x-sgext") {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;console.log('输出-->', a, b);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;showStacks();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;this.put(a, b);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; })}
setImmediate(main);// frida -UF -l tmp.js -o xy.txt

分析输出的堆栈,可以发现其中存在可疑函数getUnifiedSign,接下来将Hook这个函数进行进一步分析。

要hook这个函数,需要知道这个函数的入参返回值等信息,因此使用jadx打开apk,搜索该函数

jadx提供了很方便的功能,可以右键目标函数的名称直接选择复制为frida片段,减少了很多编写重复代码的工作

Java.perform(function&nbsp;() {&nbsp; &nbsp;&nbsp;let&nbsp;InnerSignImpl&nbsp;=&nbsp;Java.use("mtopsdk.security.InnerSignImpl");&nbsp; &nbsp;&nbsp;InnerSignImpl["getUnifiedSign"].implementation&nbsp;=&nbsp;function&nbsp;(params, ext, appKey, authCode, useWua, requestId) {&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;console.log(`InnerSignImpl.getUnifiedSign is called: params=${params}, ext=${ext}, appKey=${appKey}, authCode=${authCode}, useWua=${useWua}, requestId=${requestId}`);&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;let&nbsp;result =&nbsp;this["getUnifiedSign"](params, ext, appKey, authCode, useWua, requestId);&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;console.log(`InnerSignImpl.getUnifiedSign result=${result}`);&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;result;&nbsp; &nbsp; };})

部分输出如下:

InnerSignImpl.getUnifiedSign&nbsp;is&nbsp;called: params={data={"apiName":"mtop.taobao.idle.user.strategy.list","apiVersioin":"1.0","args":"{\"listPreFilter\":{\"_channel\":\"700502\"}}","originJson":false,"pageId":"Page_xySearchResult","ruleName":"luxury_Page_xySearchResult"}, deviceId=null, sid=null, uid=null, x-features=27, appKey=21407387, api=mtop.taobao.idle.user.strategy.list, lat=0, lng=0, mtopBusiness=true, utdid=aDXu/kOQwcgDAFHssynWEb4Y, extdata=openappkey=DEFAULT_AUTH, ttid=700502@fleamarket_android_7.21.10, t=1749917947, v=1.0}, ext={pageId=, pageName=}, appKey=21407387, authCode=null, useWua=true, requestId=r_26InnerSignImpl.getUnifiedSign&nbsp;is&nbsp;called: params={data={"abConfigs":"{\"isEnterResultNative\":\"true\",\"isSearchResultNative\":\"true\"}","activeSearch":false,"apiName":"com.taobao.idlefish.search_implement.protocol.SearchResultReq","bizFrom":"home","disableHierarchicalSort":0,"extraFilterValue":"{\"divisionList\":[],\"excludeMultiPlacesSellers\":\"0\"}","forceUseInputKeyword":false,"forceUseTppRepair":false,"fromFilter":false,"fromKits":false,"fromLeaf":false,"fromShade":false,"fromSuggest":false,"keyword":"树莓派","mainTab":true,"originJson":false,"page":1,"pageNumber":1,"relateResultListLastIndex":0,"relateResultPageNumber":1,"resultListLastIndex":0,"rowsPerPage":10,"searchReqFromActivatePagePart":"historyItem","searchReqFromPage":"xyHome","searchTabType":"SEARCH_TAB_MAIN","shadeBucketNum":"-1","smartUIFilter":true,"suggestBucketNum":"21","supportFlexFilter":true}, deviceId=null, sid=null, uid=null, x-features=27, appKey=21407387, api=mtop.taobao.idlemtopsearch.search, lat=0, lng=0, mtopBusiness=true, utdid=aDXu/kOQwcgDAFHssynWEb4Y, extdata=openappkey=DEFAULT_AUTH, ttid=700502@fleamarket_android_7.21.10, t=1749917947, v=1.0}, ext={pageId=, pageName=}, appKey=21407387, authCode=null, useWua=false, requestId=r_25
InnerSignImpl.getUnifiedSign result={x-sgext=JBIeugwrMYb7TsQT0k5K87ovii+CL5ktiSeOPYgrmT2LKY4ngy+NL4opmS6IKtsuii6LJ9gsinjZL4g9iCuZLIg9iSqZLooujT2OPYs9iz2LPYs9iz2LPYs9jD2IPYo9ij2KPYo9ij2KPYo9mXuZLpkumXqJJtku3z2KLoouij2KPYh62z2KPZktmS+ZLpktmWT7TcI9ij2aPospmj6LJpkq5SycKIM4iDiKONk4ijiKONk4jziKOIo4jziKLosniimcSfl95SvlLpwunCiCKt5/inuKOIo4ijiKOIo4ijiKQdtBiDiKOIpBiy7lTOtb4FX0X+tV61j7e/tninz7NYh8+1bScds101b5avtMi0TVSfhG+0TSSvdw7Vfbbc1QlVX/ed1d/XTTVN1V+0E=, wua=gLpH_KeFXZ7FE0rtKynT2zyhQP39Zy/uinRsCkhx21AP2p/SvMqFTskCUhMuN07cKUiyCxvB2e1sj4YDpRHAkRWd4QBLboiReRXfzBwiUzzA+ylAcoucpuVilxiDfnsFPiSM/CbNyKlR92bz7Q+0mfQ+QItFljb/oDUG9BxGsHA++7gh4GcKbtleML3imnb8gSQ1pmL/Q+jfjssR5SIK9uuRHYr4YIhZwideXfP+3icH7c5zmsfEz8HnH/dl9mGnlOCCwIvgH/ID3nx56e3wzjYLCuMshRfm19HC0DSYh3JPCsaK2bRc5qGHChi+kT3f8bwqGyHGuJP15YSSXyuvItFs5W5aO2FGzbGpdzwFDJtoi8R6zduIdQoJ6vWoXjZsha85T, x-umt=3hABbHxLPBDoggKXbSw2t9/gt9y1B7xO, x-mini-wua=aMQQT99Tc8Q9FSP4vqsVs0l2meYUCrSlGvlneEkwkkCExiusU+klT3tZviWuBDu/MrLEUsGG7lNRP/9ZspngVRQPZof1H1Ccye/V+BbL/tmKwRVZCjsMivSdlD3f+aUGvPd5vMkgyF7E7kkaBdYF1gXWB7VwPC4u9gQzd1Q4lBlWOkXTXZFXLBBgwgUWer/kuKEI=, x-sign=azU7Bc002xAALVzLxm04+7TGNdq9XVzNUzO/m9tvpwVBLFzbmwnvDFJFfOQqH5+mITNXsJedJwm3l2i5D4wQef2J+l38zVzNXO1czV}

通过Hook getUnifiedSign函数,可以看到函数的输入为包含header和data的数据,返回结果是各个加密参数的结果,也就是说这些加密参数是通过header和data构造出来的

为了得到每次请求的加密参数值(x-signx-sgextx_mini_wuax_umt),有两种方法:

  1. 分析代码,逆向出加密参数的计算过程

  2. 通过RPC的方式,每次请求时直接调用原本的函数来计算加密参数的值,无需分析具体的加密逻辑 这里使用第二种方式 RPC是Frida提供的一个非常强大的功能,允许用户在宿主程序中定义可被调用的函数,并在Frida的外部(如Python脚本或其他程序)远程调用这些函数。它为用户提供了在运行时与目标程序交互的便捷方式,使得用户可以动态地获取目标程序的运行状态、修改程序的行为,或者执行一些复杂的逻辑操作。

要通过RPC的方式计算加密参数,就需要在调用内部函数之前构造好需要的输入参数,然后通过Frida建立Python环境与应用程序之间的通信,使得Python代码可以通过Frida调用应用程序内的Java函数 脚本如下

import&nbsp;reimport&nbsp;urllib.parseimport&nbsp;requests as sessimport&nbsp;timeimport&nbsp;fridasession&nbsp;=&nbsp;sess.session()
st&nbsp;=&nbsp;str(int(time.time()))def on_message(message, data):&nbsp; &nbsp;&nbsp;if&nbsp;message['type']&nbsp;==&nbsp;'send':&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;print("[*] {}".format(message['payload']))&nbsp; &nbsp;&nbsp;else:&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;print(message)
def get_sign(datas):&nbsp; &nbsp; jscode&nbsp;=&nbsp;'''&nbsp; &nbsp; rpc.exports&nbsp;=&nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; sign: function (data, times) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;var&nbsp;ret&nbsp;=&nbsp;null;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Java.perform(function () {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Java.choose("mtopsdk.security.InnerSignImpl", {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; onMatch: function (instance) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;var&nbsp;HashMap1&nbsp;=&nbsp;Java.use("java.util.HashMap").$new();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;HashMap1.put("data", data);
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;HashMap1.put("deviceId",&nbsp;"Ap2xlstz9Q-Xqp90jq16YWjUopNFAYEEhFHSXXqIucQC");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;HashMap1.put("sid",&nbsp;"");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;HashMap1.put("uid",&nbsp;"");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;HashMap1.put("x-features",&nbsp;"27");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;HashMap1.put("appKey",&nbsp;"21407387");
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;HashMap1.put("api",&nbsp;"mtop.taobao.idlemtopsearch.search");
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;HashMap1.put("lat",&nbsp;"0");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;HashMap1.put("lng",&nbsp;"0");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;HashMap1.put("utdid",&nbsp;"ZUDUSVa6rmsDAOvsGCex7UWC");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;HashMap1.put("extdata",&nbsp;"openappkey=DEFAULT_AUTH");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;HashMap1.put("ttid",&nbsp;"270200@fleamarket_android_7.8.80");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;HashMap1.put("t", times);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;HashMap1.put("v",&nbsp;"1.0");
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;var&nbsp;jExt&nbsp;=&nbsp;Java.use("java.util.HashMap").$new();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; jExt.put("pageId",&nbsp;"");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; jExt.put("pageName",&nbsp;"");
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ret&nbsp;=&nbsp;instance.getUnifiedSign(HashMap1, jExt,&nbsp;"21407387",&nbsp;"",&nbsp;false,&nbsp;"r_38").toString();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;//console.log('getUnifiedSign ret value is ' + res);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// ret["result"] = res;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; onComplete: function () { }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; })&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; })&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;ret;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; };&nbsp; &nbsp; '''&nbsp; &nbsp; process&nbsp;=&nbsp;frida.get_usb_device().attach("com.taobao.idlefish")&nbsp; &nbsp; script&nbsp;=&nbsp;process.create_script(jscode)&nbsp; &nbsp; script.on('message', on_message)&nbsp; &nbsp; script.load()&nbsp; &nbsp;&nbsp;return&nbsp;script.exports.sign(datas["data"], st)
def get_data(key):&nbsp; &nbsp; url&nbsp;=&nbsp;"https://g-acs.m.goofish.com/gw/mtop.taobao.idlemtopsearch.search/1.0/"&nbsp; &nbsp; headers&nbsp;=&nbsp;{&nbsp; &nbsp; # 'x-sgext': 'JAygFKKVnzhV8GqtfPDkTRSRJJEskTeRJpkmmDeUIYM3kSOULJQmkSyRJoMkk3fBJJAkkSKVJMYkwibFN5QmgyWZN5MggySQJJc3lDeSN5E3kTeRN5E3kjeRN5U3kTeSN5E3kDeQN5A3kDeQN4NxgzeVcpJxkCCDJJAkkCSDJIMmxHWDJIM3kjeQN5A351fITQ%3D%3D',&nbsp; &nbsp; 'umid': 'fCIBXopLPB+i2wKXFkwsK1URDWHN8r4w',&nbsp; &nbsp; # 'x-sign': 'azU7Bc002xAAJXbxSg4zkUl6jB00JXb1eQuVo%2FFXjT1hN1bgnlHFNIzYxtwHkbQ3w6RmI2oqXRZ1%2F7KBJsQy8dex1GXGpXb1dqV29X',&nbsp; &nbsp; 'x-nettype': 'WIFI',&nbsp; &nbsp; 'x-pv': '6.3',&nbsp; &nbsp; 'x-nq': 'WIFI',&nbsp; &nbsp; 'EagleEye-UserData': 'spm-cnt=a2170.8011571.0.0&spm-url=a2170.unknown.0.0',&nbsp; &nbsp; 'first_open': '0',&nbsp; &nbsp; 'x-features': '27',&nbsp; &nbsp; 'x-app-conf-v': '0',&nbsp; &nbsp; # 'x-mini-wua': 'a0ATxYQIeA6uEYRRt7SKxyB%2B1z5cUcu8q5%2FVbswzmZyQ2%2B1vaV3oqdyyd2vKFatsUoIL92if0sD8oI5xFJ%2BgBHFDV9IN6U02RhqZGYnWuKJZZOafVgufWjKbVEsyG%2FuZkCDfqMauTZINvfYBJ0fie3hwVNhLVmcy9p%2FFch0sw4H6sAQ%3D%3D',&nbsp; &nbsp; 'content-type': 'application/x-www-form-urlencoded;charset=UTF-8; application/x-www-form-urlencoded;charset=UTF-8',&nbsp; &nbsp; # 'oaid': 'f3a11878eaa0773a',&nbsp; &nbsp; # 'x-t': '1748422509',&nbsp; &nbsp; 'x-bx-version': '6.5.88',&nbsp; &nbsp; 'f-refer': 'mtop',&nbsp; &nbsp; 'x-extdata': 'openappkey%3DDEFAULT_AUTH',&nbsp; &nbsp; 'x-ttid': '270200%40fleamarket_android_7.8.80',&nbsp; &nbsp; 'x-app-ver': '7.8.80',&nbsp; &nbsp; # 'x-c-traceid': 'aDXu%2FkOQwcgDAFHssynWEb4Y17484225098120043112928',&nbsp; &nbsp; 'x-location': '0%2C0',&nbsp; &nbsp; 'x-umt': 'C%2BMBQ0BLPGuUkgKXFkGBJV7gD6lqlhiD',&nbsp; &nbsp; 'a-orange-q': 'appKey=21407387&appVersion=7.8.80&clientAppIndexVersion=1120250527144606380&clientVersionIndexVersion=0',&nbsp; &nbsp;&nbsp;"x-utdid":&nbsp;"ZUDUSVa6rmsDAOvsGCex7UWC",&nbsp; &nbsp; &nbsp; &nbsp; 'x-appkey': '21407387',&nbsp; &nbsp;&nbsp;"x-devid":&nbsp;"Ap2xlstz9Q-Xqp90jq16YWjUopNFAYEEhFHSXXqIucQC",&nbsp; &nbsp; &nbsp; &nbsp; 'user-agent': 'MTOPSDK%2F3.1.1.7+%28Android%3B9%3BXiaomi%3BMI+6X%29',&nbsp; &nbsp; 'Host': 'g-acs.m.goofish.com',&nbsp; &nbsp;&nbsp;"Accept-Encoding":&nbsp;"gzip",&nbsp; &nbsp; }&nbsp; &nbsp; jsonString&nbsp;=&nbsp;"{\"activeSearch\":false,\"bizFrom\":\"home\",\"disableHierarchicalSort\":0,\"forceUseInputKeyword\":false,\"forceUseTppRepair\":false,\"fromFilter\":false,\"fromKits\":false,\"fromLeaf\":false,\"fromShade\":false,\"fromSuggest\":false,\"keyword\":\""+&nbsp;key&nbsp;+"\",\"pageNumber\":1,\"relateResultListLastIndex\":0,\"relateResultPageNumber\":1,\"resultListLastIndex\":0,\"rowsPerPage\":10,\"searchReqFromActivatePagePart\":\"historyItem\",\"searchReqFromPage\":\"xyHome\",\"searchTabType\":\"SEARCH_TAB_MAIN\",\"shadeBucketNum\":-1,\"suggestBucketNum\":28,\"supportFlexFilter\":true}"&nbsp; &nbsp; datas &nbsp;=&nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; 'data':jsonString&nbsp; &nbsp; }&nbsp; &nbsp; result&nbsp;=&nbsp;get_sign(datas)&nbsp; &nbsp; headers['x-t']&nbsp;=&nbsp;st&nbsp; &nbsp; headers['x-sign']&nbsp;=&nbsp;urllib.parse.quote_plus(re.findall("x-sign=(.*?)}", result,re.S)[0])&nbsp; &nbsp; headers['x-mini-wua']&nbsp;=&nbsp;urllib.parse.quote_plus(re.findall("x-mini-wua=(.*?),", result)[0])&nbsp; &nbsp; headers['x-sgext']&nbsp;=&nbsp;urllib.parse.quote_plus(re.findall("x-sgext=(.*?),", result)[0])&nbsp; &nbsp; headers['x-c-traceid']&nbsp;=&nbsp;f"ZUDUSVa6rmsDAOvsGCex7UWC{st}967005712507"
&nbsp; &nbsp; response&nbsp;=&nbsp;session.post(url, headers=headers, data=datas)&nbsp; &nbsp;&nbsp;print(response.text)
if&nbsp;__name__&nbsp;==&nbsp;'__main__':&nbsp; &nbsp; key&nbsp;=&nbsp;input("输入需要搜索的商品: ")&nbsp; &nbsp; get_data(key)

jsCode的内容是要执行的js脚本,为了和应用程序保持一致,js代码内通过使用Java中HashMap类来构造传入的参数,然后将构造sign的函数导出到python脚本,使得python脚本可以调用js中的函数,最后再在python脚本中构造好header和data,将data传入js中的函数构造sign,然后将返回的加密参数添加到header中发起请求。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:隐雾安全 《【转载】某鱼自定义协议请求抓包+加密参数分析》

PPTOpenClaw养虾全景报告 网络安全文章

PPTOpenClaw养虾全景报告

文章总结: 该文档是一份关于OpenClaw(又称龙虾)的全景报告及相关资源集合,内容涵盖其安全使用指南、生态威胁分析、运行机制与安全威胁研究、网络安全风险分析
评论:0   参与:  0