当前位置: 首页 > news >正文

第16章 Day19 Charles安装和使用---微信小程序逆向

Charles安装(三方抓包工具)

Charles客户端下载
官网地址:https://www.charlesproxy.com/download/

选择适合自己的系统版本下载

Snip20230828_127

下载安装完成后激活
激活网站地址:https://www.zzzmode.com/mytools/charles/

Snip20230828_128

打开安装好的Charles,菜单栏 Help->Register Charles 弹出注册的窗口填入Registered Name和生成的license key,点击 Register。

Charles配置,打开Charles,先安装证书并且信任

Snip20230828_130

证书下载好之后,找到证书文件,双击进行安装,将其安装到【受信任】目录中,出现信任选项,点击始终信任即可。

Snip20230831_136

Snip20230831_136

Snip20230831_136

Snip20230831_136

Snip20230831_136

点击完成后提示导入成功。此时需要重新进入Help -> SSL Proxying -> Install Charles Root Certificate,查看证书结果,成功时如下提示:

Snip20230831_136

设置SSL,保证可以抓取https协议的请求:

Snip20230828_131

这是端口号:

Snip20230828_132

如果是mac操作系统需要如下操作,其他系统忽略该操作:

Snip20230828_134

配置完成,可以使用Charles进行抓包了

工具栏功能介绍

Snip20230828_133

什么是证书?为何需要证书?

首先明确一点,安装证书的目的是为了是的抓包工具可以抓取https协议的请求。

http协议是不安全的

在https诞生之前,所有网站都使用http协议,而http协议在数据传输的过程中都是明文,所以可能存在数据泄露和篡改。

Snip20230831_142

使用对称秘钥进行数据加密

为了防止数据泄露和篡改,我们对数据进行加密,如:生成一个对称密码【DKUFHNAF897123F】,将对称秘钥分别交给浏览器和服务器端,他们之间传输的数据都使用对称秘钥进行加密和解密。

Snip20230831_143

请求和响应流程如下:

  1. 客户端使用对称秘钥对请求进行加密,并发送给服务端。
  2. 服务端接收到密文之后,使用对称秘钥对密文进行解密,然后处理请求。 最后再使用对称秘钥把要返回的内容再次加密,返回给客户端。
  3. 客户端接收到密文之后,使用对称秘钥进行解密,并获取最终的响应内容。

如此一来,数据传输都是密文,解决了明文传输数据的问题。但是,这么干有bug。

  • 浏览器如何获取对称秘钥?
  • 如果每个客户端的对称秘钥相同,浏览器能拿到对称秘钥,那么黑客也可以拿到,所以,数据加密也就没有意义了。

非对称秘钥加密

公钥私钥对儿:公钥负责加密,私钥负责解密

Snip20230831_144

如此一来,解决了 动态对称秘钥 和 数据加密的问题,因为每个用户的对称秘钥都是随机生成且传输的过程中都使用公钥加密(公钥加密的数据只有私钥能解密),所有黑客无法截获对称秘钥。而数据传输是通过对称秘钥加密过的,所以黑客即使能获取数据也无法去解密看到真实的内容。 看似无懈可击,但是,这么干还是又bug:如果黑客在上图 【步骤2】劫持,黑客把自己的公钥返回给客客户端,那么客户端会使用黑客的公钥来加密对称秘钥,黑客在【步骤6】截获请求,使用自己的私钥获取对称秘钥,后面过程全都会完蛋...

CA证书应用

使用 ca 证书可以解决黑客劫持的问题

Snip20230831_145

如此一来,就解决了黑客劫持的问题,因为即使黑客劫持后的给浏览器即使返回了证书也无法通过校验,同时浏览器也会提示错误信息。

https可以保证数据安全,但由过程需要反复加密解密所有访问速度会有所下降(鱼和熊掌不能兼得)。

小技巧

  • 过滤器:

Snip20240228_10

  • 数据包内容搜索:

Snip20230831_145

请求修改:用来验证哪些请求参数是必要的

请求sogou关键字搜索,然后在数据包内容搜索框中,搜索显示页面中的文字内容,定位到指定数据包,然后,选中该数据包,按下Compose键,进行请求参数修改,然后重新发送请求,查看删除参数后,响应数据是否依然正常。

Snip20230831_152

案例

  • 抓取微信小程序---实习僧,python关键字对应的岗位搜索结果
#实习僧 python招聘信息抓取
import requests
#如果加了verify=False这个关键字参数,使用requests模块发送请求的时候会给你弹出一个警告InsecureRequestWarning,警告你当前的请求可能不安全,可以使用如下代码忽略该警告
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)headers = {'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 MicroMessenger/6.8.0(0x16080000) NetType/WIFI MiniProgramEnv/Mac MacWechat/WMPF XWEB/30817',
}url = "https://apigateway.shixiseng.com/api/interns/v3.0/interns/wxz/search/v4?city=%E5%85%A8%E5%9B%BD&k=Java&intention=&degree=&internship_duration=&days_per_week=&payment_per_day=&emp_chance=&area=&scale=&category=&ipo=&nature=&t=0&p=1&target=intern"
#目前各大网站基本有自己的ca证书,但是不排除有的网站为了节约网站建设开销并没有购买ca证书。又因为requests模块在发送网络请求的时候,默认会验证ca证书。如果当前网站没有ca证书,那么就会报出SSLError错误,则使用verify参数赋值False可以在请求的时候不验证网站的ca证书。
ret = requests.get(url,headers=headers,verify=False).json()
print(ret)
  • 抓取"十点读书"公众号里的【精选美文】
import requests
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)headers = {'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 MicroMessenger/6.8.0(0x16080000) NetType/WIFI MiniProgramEnv/Mac MacWechat/WMPF XWEB/30817',
}
url = 'https://mp.weixin.qq.com/mp/homepage?__biz=MjM5MDMyMzg2MA==&hid=4&sn=27a179d5681d48ed5011c70994508a0a&scene=18&uin=MTM1ODMyODkwNQ%3D%3D&key=06d4c0937920c7fadf27c486114e5b0bb96d03e4c8d7ad16bbf2121d6e11d1124cea5a68fc8e67fa6ad73e234855fc3537e9b1688af3be467627c252d2902cfee4abea79bbe7481a7eae39665697a8ff26a4e09d2dd1c8791132771b6ae4f9f8462d0fda391204e2d8248e3c31f5e7ee3e7231825cb1ee60375e60724680d29e&devicetype=iMac+MacBookPro17%2C1+OSX+OSX+13.5+build(22G74)&version=13080610&lang=zh_CN&nettype=WIFI&ascene=7&fontScale=100&acctmode=0&pass_ticket=9n%2F1k887rHVmwpZwC%2FpTfXPaxFwjBJ7eZeVikkd3AC44Vma0v7JmpX3GnYn%2BdBGcMGR2QGh9dc3m8ovwsU0BLg%3D%3D&session_us=gh_5c7e8b7f586b&cid=0&begin=6&count=5&action=appmsg_list&f=json&r=0.36265542830912967&appmsg_token=1259_HS65EsrjiYe0fsmnuhRibFokbkLFN7mQKYyXag~~'
data = requests.post(url=url,headers=headers,verify=False).json()
print(data)

微信小程序逆向开发

1. 前置知识点

1.1 wxapkg文件

如何查看微信小程序包文件

打开微信的设置:

Snipaste_2024-08-15_09-33-58 Snipaste_2024-08-15_09-38-31 Snipaste_2024-08-15_09-37-22 Snipaste_2024-08-15_09-40-47

.wxapkg概述

.wxapkg是微信小程序的包文件格式,且其具有独特的结构加密方式。它不仅包含了小程序的源代码,还包括了图像和其他资源文件,这些内容在普通的文件浏览器中是无法直接访问的。这种特殊的包装方式是为了保护小程序的代码和资源不被轻易获取和篡改,确保了小程序的安全性。

1.2 解密工具unpackminiapp

unpackminiapp主要用于解密微信小程序的.wxapkg文件,将其转换为可以进一步反编译的格式。该工具能够自动解密小程序包,并将解密后的文件存储在指定的文件夹中,供后续步骤使用。

注意:

  • 在使用该工具时,需要在该工具同级目录下新建一个wxpack的文件夹,用于存储解密后的wxapkg文件。
  • 如果要解密多个文件,则需要对解密后的文件依次进行重命名。因为该工具对解密后的每一个文件的命名是一致的,不重新命名会产生文件覆盖。

1.3 反编译工具unveilr

使用unveilr可以直接通过命令行对.wxapkg文件进行反编译,并将结果输出到指定的文件夹中。

Snipaste_2024-08-15_09-53-24

1.4 微信开发者工具

当使用unveilr完成对小程序的反编译后,微信开发者工具将发挥其强大的功能,帮助开发者进一步进行开发和调试微信小程序。

Snipaste_2024-08-15_10-27-10

打开应用后,设置详情:

Snipaste_2024-08-15_10-35-54

1.5 NodeJs开发环境

Node是在浏览器之外运行js代码的开发环境,可以脱离浏览器在外部运行js程序。

2. 逆向案例

掘金壁纸:请求头参数逆向(requestData和iv)+加密响应数据解密。

进入小程序后,搜索666或者888对应数据包的数据,或者搜索结果页面中全部或者壁纸等选项卡的pageIndex请求数据。

全局搜索requestData关键字,定位到api的数据包

/*处理参数requestData的值:通过调用带参数的函数t返回,且t函数定义中只使用了前两个参数c(固定值)和u(AES的iv)和一个undefine
*/
//直接拷贝JSON.stringify(c)的值即可(固定值)
var c = `{"acc_id":78,"page":1,"class":1,"sort":"4","appid":"wx41cd4f32cf8164b3","ver":"7.0.0","min_push":0,"scene":1001}`
//参数u的处理:上一行函数d()
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
}
var u = d();
//函数t的封装
function t(e, n) {const CryptoJS = require("crypto-js");var r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : "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()}//返回两个逆向参数结果的s封装,可直接作为请求参数
function s(){return {'requestData':t(c,u,undefined),'iv':u}
}/*加密响应数据解密,数据包返回的json数据,其中data的value值是密文数据尝试1:全局搜索data关键字,数据包太多了,放弃尝试2:搜索ajax请求关键字(ajx或者XMLHttpRequest)定位不到,放弃尝试3:搜索数据包的部分url(Product/pageIndex)放弃尝试4:搜索加密算法关键字(AES)可行api包中(因为请求头参数就是AES加密)*/
//数据解密原函数
var i = function(e, n) { //参数e是加密数据,n是固定值var r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : "WAG0JIUGYALACVJF", i = a.CryptoJS.enc.Utf8.parse(r)//t是通过n得来的, t = a.CryptoJS.enc.Utf8.parse(n);return a.CryptoJS.AES.decrypt(e, i, {iv: t, // iv是t,t是n,则iv就是函数参数n这个固定值mode: a.CryptoJS.mode.CBC,padding: a.CryptoJS.pad.Pkcs7}).toString(a.CryptoJS.enc.Utf8)}function decrype(e,n = 'HI9Z3B5DD8CYQ8WH'){const CryptoJS = require("crypto-js");var r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : "WAG0JIUGYALACVJF", i = CryptoJS.enc.Utf8.parse(r), t = CryptoJS.enc.Utf8.parse(n);return CryptoJS.AES.decrypt(e, i, {iv: t,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7}).toString(CryptoJS.enc.Utf8)
}
//解密测试
var data = 'xxx'
var iv = "HI9Z3B5DD8CYQ8WH";
console.log(decrype(data,iv))

python代码

import requests
import execjs
import time
import subprocess
from functools import partial
subprocess.Popen = partial(subprocess.Popen, encoding='utf-8')node = execjs.get()
fp = open('main.js','r',encoding='utf-8')
ctx = node.compile(fp.read())#获取加密数据
url = 'https://min-api.xliii.cn/miniapi/Product/pageIndex'
headers = {'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 webview/',
}
s = ctx.eval('s()')response = requests.get(url,params=s).json()
encrypt_data = response['data']['data']
print(encrypt_data)

错误处理

乡信助农

http://www.hskmm.com/?act=detail&tid=16990

相关文章:

  • DBLINK的创建和使用(总结)
  • Could not resolve host: mirrorlist.centos.org
  • axi 4k边界检测
  • GOSIM 开源出海工作坊:给开源创业者的忠告
  • 华为,让金融智能体月映千江 - 指南
  • 轻量级架构决策记录工具 - ADR Tools
  • 一文搞懂Flex弹性布局空间分配规则
  • AT_agc012_c [AGC012C] Tautonym Puzzle 题目分析
  • 详细介绍:回调函数与错误处理
  • Django系列(七)HttpRequest(请求)和HttpResponse(响应)对象
  • 工业主板:智能制造与严苛环境的坚实基石
  • 课上测试:C编程工具测试(AI)
  • 标题。
  • 虚拟机下的麒麟V10SP1与SP2进行iSCSI连接——基于MobaXterm
  • 中断的基本概念
  • AT_arc173_e [ARC173E] Rearrange and Adjacent XOR
  • 修复gradle8使用Transform第一个构建中断第二次构建失败的问题:java.io.IOException: Unable to delete directory xxxx\build
  • .NET操作Word/WPS打造专业文档 - 页面设置与打印控制完全指南
  • NORDIC蓝牙6.0新品NRF54L15多协议超低功耗高性能BLE芯片 - 动能世纪
  • 记录:git、.${index}. 滚动条
  • 使用springboot开发一个宿舍管理系统练习项目 - 实践
  • 元组
  • CF1542
  • Manim实现涟漪扩散特效
  • CRMEB标准版PHP移动订单功能深度解析:多端同步方案
  • CICD流程建设之持续测试实践指南
  • Xcode 26.0.1 (17A400) 发布 - Apple 平台 IDE
  • Tenable Nessus 10.10 (macOS, Linux, Windows) - 漏洞评估解决方案
  • CNN+MNIST - 实践
  • SonarQube Server 2025 Release 5 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具