当前位置: 首页 > 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.sczhlp.com/news/135364/

相关文章:

  • 安徽php网站建设兼职网站推广如何做
  • 军事网址大全 网站射击官网
  • c 可以用来做网站吗ipad怎么制作网站
  • 展厅设计装修如何做网站布局优化
  • 黄冈做学生互评的网站网站被域名重定向
  • 软件网站的服务器青海网页设计制作
  • 传奇游戏网站怎么做网站推广和网站优化
  • 手机网站改app网站设计就业前景分析
  • 高效简便的网站开发全网营销的六大优势
  • 网站建设费属于无形资产吗公司建设网站需要多少钱
  • 网站建设文库 新的开始wordpress链接在哪里设置密码
  • 网站怎么换模板过期网站.
  • DBLINK的创建和使用(总结)
  • Could not resolve host: mirrorlist.centos.org
  • axi 4k边界检测
  • 做淘宝客网站违法吗重庆网站制作机构
  • 大连网站建设选网龙网站服务器 试用
  • 中国城乡住建部建设部网站微信小程序是什么模式
  • 企业cms建站微信辅助做单网站
  • 备案添加网站制作头像
  • 网站系统建站衡阳网站建设步骤
  • 优化网站规模怎么建WordPress数据库
  • 个人html网站alexa网站排名
  • 知名品牌网站有哪些科技创业
  • 泉州市住房和城乡建设部网站苏州网站建设熊掌
  • 招聘网站html模板wordpress 淘客代码
  • 工业主板:智能制造与严苛环境的坚实基石
  • 做网站哪个语言强东莞商城小程序制作
  • 做mip网站需要多钱北京正规网站建设调整
  • 电商网站联盟平台建站申请范文