概述
最近听说了九价疫苗,试了好多次抢不到,感觉有外挂的样子网上也好了未发现,于是自己动手做了一个。最后结果是没有成功,不影响分享思路和方法给大家参考
准备工具
- Fiddler (抓取http 和 https 请求的神器)
- 任意一项开发语言 JAVA 、 Python 、 C 等
- IDEA 开发工具
- Nodejs
- 反编译依赖和工具 wxappUnpacker
抓包分析接口和参数
这里用获取九价列表为例子
- 首先打开FD 配置程序
配置教程百度 - 用电脑版微信访问九价小程序,选中九价
- FD中出现的最新请求就是这个列表接口地址
- 获取完整的地址 分析参数
- act=CustomerList 表示后台接口处理方法
- city=%5B%22%22%2C%22%22%2C%22%22%5D 表示城市参数意思 这里等号后面用了 UrlEncode编码 进行URLDecode 解码九知道是啥了
- lat=30.5702 暂时不知道是啥意思 可以大胆猜测要用逆向思维才能事半功倍后面写死传给他们
- lng=104.06476 暂时不知道是啥意思
- id=0 可能是某个页面按钮的id
- cityCode=0 城市编码
- product=1 九价商品ID
- 用IDEA 编写代码 模拟 抓取的地址和参数
5.1. 编写Http 工具
public class Http {
private static final Logger logger = LoggerFactory.getLogger(Http.class);
public static JSONObject get(HttpClient httpClient, GetMethod getMethod,String url) throws Exception {
logger.info("get:"+url);
JSONObject jsonObject = new JSONObject();
getMethod.setURI(new URI(url, true));
String res ="";
try {
int code =httpClient.executeMethod(getMethod);
if (code == 200) {
res = getMethod.getResponseBodyAsString();
}
logger.info("get:"+res);
jsonObject = parseJsonGet(res);
if("200".equals(jsonObject.getString("status"))){
return jsonObject;
}
throw new Exception("get请求异常"+jsonObject.toJSONString());
} catch (Exception e) {
throw new Exception("程序异常",e);
}
}
public static JSONObject post(HttpClient httpClient, PostMethod postMethod, String url) throws Exception {
logger.info("post :"+url);
JSONObject jsonObject = new JSONObject();
postMethod.setURI(new URI(url, true));
String res ="";
try {
int code =httpClient.executeMethod(postMethod);
if (code == 200) {
res = postMethod.getResponseBodyAsString();
}
logger.info("post:"+res);
jsonObject = parseJsonGet(res);
if("200".equals(jsonObject.getString("status"))){
return jsonObject;
}
throw new Exception("post请求异常"+jsonObject.toJSONString());
} catch (Exception e) {
throw new Exception("程序异常",e);
}
}
private static JSONObject parseJsonGet(String jsonString){
JSONObject jsonObject = JSONObject.parseObject(jsonString);
return jsonObject;
}
}
5.2. 编写测试方法开始测试
将他们的地址不修改的情况下放回去,因为我们不关注其他城市的疫苗当前的就可以了
注意: 这里的header 和cookie 尽量全部模拟下来不要偷懒否则可能会出现错误
public class NinePriceVaccineApplication {
private static Logger logger = LoggerFactory.getLogger(NinePriceVaccineApplication.class);
public static void main(String[] args) throws Exception {
logger.debug("疫苗获取程序开始请输入sessionId 回车键结束:");
Scanner scan = new Scanner(System.in);
String session = scan.next();
HttpClient httpClient = new HttpClient();
HttpState httpState = new HttpState();
Cookie cookie = new Cookie();
cookie.setName("ASP.NET_SessionId");
cookie.setValue(session);
httpState.addCookie(cookie);
httpClient.setState(httpState);
PostMethod postMethod = new PostMethod();
GetMethod getMethod = new GetMethod();
postMethod.setRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat");
postMethod.setRequestHeader("host","cloud.cn2030.com");
postMethod.setRequestHeader("Accept-Encoding","gzip, deflate, br");
postMethod.setRequestHeader("Content-Type","application/json");
postMethod.setRequestHeader("Referer","https://servicewechat.com/wx2c7f0f3c30d99445/91/page-frame.html");
getMethod.setRequestHeader("Cookie","ASP.NET_SessionId="+session);
getMethod.setRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat");
getMethod.setRequestHeader("host","cloud.cn2030.com");
getMethod.setRequestHeader("Accept-Encoding","gzip, deflate, br");
getMethod.setRequestHeader("Content-Type","application/json");
getMethod.setRequestHeader("Referer","https://servicewechat.com/wx2c7f0f3c30d99445/91/page-frame.html");
getMethod.setRequestHeader("Cookie","ASP.NET_SessionId="+session);
Http.get(httpClient,getMethod,"https://cloud.cn2030.com/sc/wx/HandlerSubscribe.ashx?act=CustomerList&city=%5B%22%22%2C%22%22%2C%22%22%5D&lat=30.5702&lng=104.06476&id=0&cityCode=0&product=1");
}
}
SessionId 是由官方通过认证接口返回,后续确认用户信息的等敏感结果需要这个ID 暂时无法通过技术手段破解, 可以用抓包的方式获取在请求体中的cookie获取
返回结果出来了和我们fd抓包返回的报文一样
6. 其他接口同理 这里就不多解释了 找到确认预约时间和提交预约接口
确认预约时间接口:
- act=GetCustSubscribeDateDetail 方法名
- pid=62 疫苗ID
- id=6541 医院和社区的ID
- scdate=2021-12-20 预约时间
这是随便找的一个疫苗的报文,确认预约时间的接口,这里返回的东西很明显是进行加密处理了,也就是说我们越来越接近真相了
提交预约请求接口:
- act=Save20 方法名
- birthday=XXXX-XX-XX 接种人出生年月日
- tel=15911111111 电话
- sex=2 性别 2为女 写死吧 没有男人会接种这个吧
- cname=%E5%BC%A0%E4%B8%89 姓名 做了URL编码处理
- doctype=1 不晓得是啥写死
- idcard=XXXXXXXXXXXXXXXXXX 身份证号码
- mxid=ssfgdrfgasfd 传递给后台加密的东西 应该是确认预约时间接口 返回的结果 生成的东西
程序走到这一步理论上就已经凉了,无法进行下一步了,因为少了这两项加密的东西肯定会报错。
- 改变思路 下载TBS studio 进行 小程序真机调试
这里直接说结果吧, 安卓高版本的系统已经无法调试了, 低版本的可以调试断点 但是小程序调试方式已经被封杀, 只能调试 H5了 吐了吐了 - 再次改变思路 反编译微信小程序
8.1 下载安卓模拟器 这里用夜神举例
8.2 开启root权限
8.3 保存重启
8.4 下载Root Explorer 文件管理器
8.5 找到以下目录
8.6 安装nodejs 并配置环境变量 版本没限制自己百度
8.7 安装反编译依赖
npm install esprima -g
npm install css-tree -g
npm install cssbeautify -g
npm install vm2 -g
npm install uglify-es -g
npm install js-beautify -g
npm install escodegen -g
8.8 将Re文件管理器找到的微信小程序包复制到电脑上的一个目录不要由中文名
8.9 下载反编译插件
https://pan.baidu.com/s/1pbdwbqKmHNUYjGxtbuhv8Q 提取码: 6f1f
8.10 解压进入目录输入命令
D:\wxappUnpacker>node wuWxapkg.js _1601015645_32.wxapkg
8.11 用IDEA工具打开方便找到方法对应关系
8.12 通过自己的经验和逆向思维定位到加密解密那行代码
8.13 经过不懈努力最终得出参数 o 是一个微信SDK加密后的一个参考会随着时间戳等一些参数动态变化无法破解
9. 到这一步其实还可以用办法处理, 因为微信小程序是加了一层壳 可以通过手机加入代理的方式抓取所有的请求,再次分析。。。算了后面再说
10. 总结: 唉!难搞哦
评论区