python爬蟲:小程序逆向實戰教程

根據我之前發表的文章,我們進行延伸實戰https://blog.csdn.net/weixin_64809364/article/details/146981598?spm=1001.2014.3001.5501

1. 想要爬取什么小程序,我們進行搜索

?2. 找到我們vx小程序的文件地址,我們就可以進行破解

  • 破解步驟強看一下上一篇文章:開頭的網址
  • 下面圖片就是我們破解成功的圖片

3. ?使用微信開發者工具打開我們的破解之后的小程序(根據下面的圖片勾選配置,不然會影響你的賬號)

?

?4. 如果控制臺沒有報錯或者左側直接可以加載出來,我們小程序的界面,這時候我們的前期工作就已經完畢,接下來就是js請求加密、解密,獲取批量數據(注意:不要干擾小程序的正常運行,違法行為)

?5. 我們先進行響應解密

  • ?通過輸出,我們可以看出來需要響應解密(我們先進行入口定位):這里我們采用關鍵字搜索decrypt(

  • ?通過關鍵字搜索,我們找到了,響應解密入口,看到iv,我們就可以猜到它使用了AES加密算法,我們就可以使用AES進行解密
  • 將圖片中的代碼復制粘貼,放到pycahrm中進行調試,并且再python中獲得加密值,我們進行測試,最終效果如下:

const CryptoJS = require("crypto-js")function i(e, n) {var r = "WAG0JIUGYALACVJF", i = CryptoJS.enc.Utf8.parse(r) // key, t = CryptoJS.enc.Utf8.parse(n); // ivreturn CryptoJS.AES.decrypt(e, i, {iv: t,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7}).toString(CryptoJS.enc.Utf8)
}// 響應解密測試
e = "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"
n = "HVK6TCJKWBLYFT2T"

  • ?然后我們使用python的第三方模塊,使用python調用js代碼
  • 安裝第三方模塊:pip install execjs
  • 我們在使用前要導入以下代碼(在windows電腦下,mac不需要):
import subprocess
from functools import partialsubprocess.Popen = partial(subprocess.Popen, encoding="utf-8")import execjs
# -*- coding: utf-8 -*-
# coding=utf-8
import base64import requests
import time
import subprocess
from functools import partialsubprocess.Popen = partial(subprocess.Popen, encoding="utf-8")import execjsheaders = {'authority': 'min-api.xliii.cn','user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Mobile/15E148 Safari/604.1 wechatdevtools/1.06.2407110 MicroMessenger/8.0.5 Language/zh_CN webview/','content-type': 'application/json','accept': '*/*','sec-fetch-site': 'cross-site','sec-fetch-mode': 'cors','sec-fetch-dest': 'empty','referer': '',
}params = {'requestData': '3x5T5fobv/lgYOMehTSyKGQD547tWeTGXItoZhgPp0fdGFU9fLYHyxyriTtogilHi2THpYQGaGYne7kTTUQ/vAcuyg03cf2ijUKRdbV9DNcxl17qsxy3PXtIHU2jYIBNv7g7bywLOSKdhrOlSIpDEM2PVCfOGbirswA0LP1wlTM=','iv': 'zbdozs4sjdtIxKmY',
}response = requests.get('', params=params, headers=headers)
ret = response.json().get('data')
b64 = ret.get('data')
# print(b64)# 響應解密
with open("APP_decrypt.js", encoding="utf8") as f:jsCode = f.read()
js_compile = execjs.compile(jsCode)
n = "HVK6TCJKWBLYFT2T"
ret = js_compile.call("i", str(b64), n)
print(ret)
  • 展示效果如下,我們可以獲取到數據了:

6. 我們在進行請求加密

  • 我們在network中發現,要使用請求加密,所以我們直接使用關鍵字搜索

  • ?我們把所需要的代碼復制到pycharm中進行分析調試
  • 最終效果如下:
// 請求加密
const CryptoJS = require("crypto-js")let c = '{"res_id": 88038, "appid": "wx41cd4f32cf8164b3", "ver": "7.0.0", "min_push": 0, "scene": 1001}'function t(e, n) {var r = "WAG0JIUGYALACVJF", i = CryptoJS.enc.Utf8.parse(r), t = CryptoJS.enc.Utf8.parse(n);return CryptoJS.AES.encrypt(e, i, {iv: t,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7}).toString()
}function d() {for (var e = "", a = ["1", "2", "4", "5", "3", "8", "0", "7", "9", "6", "A", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "S", "D", "F", "G", "H", "J", "K", "L", "q", "w", "S", "e", "a", "s", "d", "z", "x", "c", "v", "f", "r", "t", "g", "b", "y", "h", "n", "m", "j", "u", "i", "o", "k", "l", "p"], n = 0; n < 16; n++)e += a[(Math.random() * (a.length - 1)).toFixed(0)];return e
}let u = d()
// console.log(ret)
function s(){return {'requestData':t(c,u,undefined),'iv':u}
}console.log(s())
  • ?然后我們也搬到python中,使用python進行調試:

7.完整代碼如下:

# -*- coding: utf-8 -*-
# coding=utf-8
import base64import requests
import time
import subprocess
from functools import partialsubprocess.Popen = partial(subprocess.Popen, encoding="utf-8")import execjsheaders = {'authority': 'min-api.xliii.cn','user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Mobile/15E148 Safari/604.1 wechatdevtools/1.06.2407110 MicroMessenger/8.0.5 Language/zh_CN webview/','content-type': 'application/json','accept': '*/*','sec-fetch-site': 'cross-site','sec-fetch-mode': 'cors','sec-fetch-dest': 'empty','referer': '',
}params = {'requestData': '3x5T5fobv/lgYOMehTSyKGQD547tWeTGXItoZhgPp0fdGFU9fLYHyxyriTtogilHi2THpYQGaGYne7kTTUQ/vAcuyg03cf2ijUKRdbV9DNcxl17qsxy3PXtIHU2jYIBNv7g7bywLOSKdhrOlSIpDEM2PVCfOGbirswA0LP1wlTM=','iv': 'zbdozs4sjdtIxKmY',
}response = requests.get('', params=params, headers=headers)
ret = response.json().get('data')
b64 = ret.get('data')
# print(b64)# 響應解密
with open("APP_decrypt.js", encoding="utf8") as f:jsCode = f.read()
js_compile = execjs.compile(jsCode)
n = "HVK6TCJKWBLYFT2T"
ret = js_compile.call("i", str(b64), n)
print(ret)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/75725.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75725.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/75725.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言變長數組(VLA)詳解:靈活處理動態數據的利器

引言 在C語言中&#xff0c;傳統的數組大小必須在編譯時確定&#xff0c;這限制了程序處理動態數據的靈活性。C99標準引入的變長數組&#xff08;Variable-Length Array, VLA&#xff09; 打破了這一限制&#xff0c;允許數組長度在運行時動態確定。本文將深入解析VLA的語法、…

串口數據轉換為IP數據

串口數據轉換為IP數據是一種常見的通信技術,用于將傳統的串行設備(如傳感器、控制器等)接入現代的IP網絡。以下是詳細介紹: 1. 轉換原理 串口數據轉換為IP數據的過程涉及硬件和軟件的結合,核心是將串行數據封裝為TCP/IP或UDP/IP數據包,通過網絡傳輸。具體步驟如下: 硬…

client-go如何監聽自定義資源

如何使用 client-go 監聽自定義資源 在 Kubernetes 中使用 client-go 監聽自定義資源&#xff08;Custom Resource&#xff0c;簡稱 CR&#xff09;需要借助 Dynamic Client 或 Custom Informer&#xff0c;因為 client-go 的標準 Clientset 只支持內置資源&#xff08;如 Pod…

C++軟件開發架構

文章目錄 1.全局消息通信MsgHandler.h單元測試(QTest)MsgHandlerUnitTest.hMsgHandlerUnitTest.cpp 2.實例間通信InstMsgHandler.h單元測試InstMsgHandlerUnitTest.hInstMsgHandlerUnitTest.cpp 1.全局消息通信 1. 適用于類與類單個對象實例之間的通信&#xff0c;多個對象需要…

AI Agent設計模式一:Chain

概念 &#xff1a;線性任務流設計 ? 優點&#xff1a;邏輯清晰易調試&#xff0c;適合線性處理流程? 缺點&#xff1a;缺乏動態分支能力 from typing import TypedDictfrom langgraph.graph import StateGraph, END# 定義后續用到的一些變量 class CustomState(TypedDict):p…

Git三劍客:工作區、暫存區、版本庫深度解析

一、引言&#xff1a;為什么需要理解Git的核心區域&#xff1f; 作為開發者&#xff0c;Git是日常必備的版本控制工具。但你是否曾因以下問題感到困惑&#xff1f; 修改了文件&#xff0c;但 git status 顯示一片混亂&#xff1f; git add 和 git commit 到底做了什么&#x…

Python數據類型-list

列表(List)是Python中最常用的數據類型之一&#xff0c;它是一個有序、可變的元素集合。 1. 列表基礎 創建列表 empty_list [] # 空列表 numbers [1, 2, 3, 4, 5] # 數字列表 fruits [apple, banana, orange] # 字符串列表 mixed [1, hello, 3.14, True] # 混合類型…

Keepalive+LVS+Nginx+NFS高可用項目

項目架構 分析 主機規劃 主機系統安裝應用網絡IPclientredhat 9.5無NAT172.25.250.115/24lvs-masterrocky 9.5ipvsadm&#xff0c;keepalivedNAT172.25.250.116/24 VIP 172.25.250.100/32lvs-backuprocky 9.5ipvsadm&#xff0c;keepalivedNAT172.25.250.117/24 VIP 172.25.2…

【視覺與語言模型參數解耦】為什么?方案?

一些無編碼器的MLLMs統一架構如Fuyu&#xff0c;直接在LLM內處理原始像素&#xff0c;消除了對外部視覺模型的依賴。但是面臨視覺與語言模態沖突的挑戰&#xff0c;導致訓練不穩定和災難性遺忘等問題。解決方案則是通過參數解耦方法解決模態沖突。 在多模態大語言模型&#xf…

AI比人腦更強,因為被植入思維模型【43】蝴蝶效應思維模型

giszz的理解&#xff1a;蝴蝶效應我們都熟知&#xff0c;就是說一個微小的變化&#xff0c;能帶動整個系統甚至系統的空間和時間的遠端&#xff0c;產生巨大的鏈式反應。我學習后的啟迪&#xff0c;簡單的說&#xff0c;就是不要忽視任何微小的問題&#xff0c;更多時候&#x…

AI 數理邏輯基礎之統計學基本原理(上)

目錄 文章目錄 目錄統計學統計學基本概念描述性統計數據可視化圖表工具 匯總統計統計數據的分布情況&#xff1a;中位數、眾數、平均值統計數據的離散程度&#xff1a;極差、方差、標準差、離散系數 相關分析Pearson 線性關系相關系數Spearman 單調關系相關系數 回歸分析回歸模…

無招回歸阿里

這兩天&#xff0c;無招回歸阿里的新聞被刷屏了。無招創業成立的兩氫一氧公司無招的股份也被阿里收購&#xff0c;無招以這種姿態回歸阿里&#xff0c;并且出任釘釘的 CEO。有人說&#xff0c;這是對 5 年前“云釘一體”戰略的糾偏。現在確實從云優先到 AI 優先&#xff0c;但云…

算法題(114):矩陣距離

審題&#xff1a; 本題需要我們找出所有0距離最近的1的曼哈頓距離 思路&#xff1a; 方法一&#xff1a;多源bfs 分析曼哈頓距離&#xff1a; 求法1&#xff1a;公式法&#xff0c;帶入題目公式&#xff0c;利用|x1-x2||y1-y2|求出 求法2&#xff1a;曼哈頓距離就是最短距離 本…

LLM 性能優化有哪些手段?

LLM(大語言模型)性能優化是一個多維度、多層次的系統工程,涉及從提示工程到模型微調,從推理加速到系統架構優化等多個方面。以下是當前主流的優化手段及其技術細節: 一、提示工程(Prompt Engineering) 提示工程是優化LLM性能最直接、成本最低的方法,適用于快速原型開發…

群體智能避障革命:RVO算法在Unity中的深度實踐與優化

引言&#xff1a;游戲群體移動的挑戰與進化 在《全面戰爭》中萬人戰場恢弘列陣&#xff0c;在《刺客信條》鬧市里人群自然涌動&#xff0c;這些令人驚嘆的場景背后&#xff0c;都離不開一個關鍵技術——群體動態避障。傳統路徑規劃算法&#xff08;如A*&#xff09;雖能解決單…

I.MX6ULL 交叉編譯環境配置與使用

一、什么是交叉編譯 我們一般開發程序在自己的電腦上開發&#xff0c;運行的時候將程序燒錄到板子運行。但我們的開發平臺是X86架構&#xff0c;而I.MX6ULL是ARM架構&#xff0c;所以需要一個在 X86 架構的 PC 上運行&#xff0c;可以編譯 ARM 架構代碼的 GCC 編譯器&#xff0…

Harmony OS“一多” 詳解:基于窗口變化的斷點自適應實現

一、一多開發核心概念&#xff08;18N模式&#xff09; 目標&#xff1a;一次開發多端部署 解決的問題&#xff1a; 1、界面級一多&#xff1a;適配不同屏幕尺寸 2、功能級一多&#xff1a;設備功能兼容性處理(CanIUser) 3、工…

SpringMvc獲取請求數據

基本參數 RequestMapping("save5") ResponseBody public User save5(String name, int age) {User user new User();user.setName(name);user.setAge(age);return user; } 在url中將name與age進行編寫&#xff0c;通過框架可以提取url中的name與age&#xff0c;這…

大模型持續學習方案解析:災難性遺忘的工業級解決方案

引言 隨著大型語言模型&#xff08;LLMs&#xff09;如 GPT 系列、BERT 等在自然語言處理領域取得突破性進展&#xff0c;它們強大的理解和生成能力已經滲透到各行各業。然而&#xff0c;這些模型通常是在海量靜態數據集上進行一次性預訓練的。現實世界是動態變化的&#xff0…

推薦系統(二十二):基于MaskNet和WideDeep的商品推薦CTR模型實現

在上一篇文章《推薦系統&#xff08;二十一&#xff09;&#xff1a;基于MaskNet的商品推薦CTR模型實現》中&#xff0c;筆者基于 MaskNet 構建了一個簡單的模型。筆者所經歷的工業級實踐證明&#xff0c;將 MaskNet 和 Wide&Deep 結合應用&#xff0c;可以取得不錯的效果&…