js逆向实战之某监管平台请求参数加密
声明:本篇文章仅用于知识分享,不得用于其他用途
网址:http://tzxm.jxzwfww.gov.cn/icity/ipro/open/publicity
加密步骤解析
- 看流量包。
- 请求参数都是经过加密的,但是字段名比较普通,不能通过搜索字段名去定位。尝试用url关键字去搜索,有两处,但是都看不到请求参数相关的代码。
- 换一种思路,再次刷新界面,看看请求参数中有没有不变化的。
- 经过对比,发现
s
字段值是一样的,全局搜索s
字段值。
- 只有一处,在当前文件搜索
__signature
,也只有一处。
- 全局搜索
__signature
,在其他文件中找到了。
- 不过还是没有请求参数的相关代码,先在这里打断点,触发。
- 可以看到
o
和t
变量都还没有赋值,一步一步放断点,看执行到哪里这两个被赋上值了。
- 终于看到关键代码了。
接下来去找curUrl+= "?s=" + sig; curUrl+= "&t=" + t; curUrl+= "&o=" + tkey;
sig
、t
和tkey
的生成过程即可。sig
:是个定值。
t
:
tkey
:
- 把相关的代码抠出来。
运行一下,没问题。function generate() { var sig = "a641111732925321731"; var chars = "0123456789abcdef"; var key = ""; var keyIndex = -1; for (var i = 0; i < 6; i++) { var c = sig.charAt(keyIndex + 1); key += c; keyIndex = chars.indexOf(c); if (keyIndex < 0 || keyIndex >= sig.length) { keyIndex = i; } } var timestamp = parseInt(Math.random() * (9999 - 1000 + 1) + 1000) + "_" + key + "_" + Date.parse(new Date()); var tkey = ""; var tkeyIndex = -1; for (var i = 0; i < 6; i++) { var c = timestamp.charAt(tkeyIndex + 1); tkey += c; tkeyIndex = chars.indexOf(c); if (tkeyIndex < 0 || tkeyIndex >= timestamp.length) { tkeyIndex = i; } } var t = timestamp;//LEx.azdg.encrypt(timestamp,key); t = t.replace(/\+/g, "_"); // console.log(sig, t, tkey); return {"sig": sig, "t": t, "o": tkey}; }
- 还要关注一个验证码的问题,每次发起请求的时候都会有一个请求验证码的过程。
在请求数据中也需要带上验证码。
- 编写python代码获取验证码。
运行可获到验证码。import requests import time verify_code_url = "http://tzxm.jxzwfww.gov.cn/icity/bsp/verifyCode?time={}".format(int(time.time()*1000)) resp = requests.get(verify_code_url) with open("verify_code.jpg", mode="wb") as f: f.write(resp.content)
- 编写python代码获取数据,这里可以利用
ddddocr
库识别验证码。
运行发现获取不到数据。import requests import execjs import time import ddddocr verify_code_url = "http://tzxm.jxzwfww.gov.cn/icity/bsp/verifyCode?time={}".format(int(time.time()*1000)) resp = requests.get(verify_code_url) with open("verify_code.jpg", mode="wb") as f: f.write(resp.content) ocr = ddddocr.DdddOcr(old=True) with open("verify_code.jpg", 'rb') as f: image = f.read() verify_code = ocr.classification(image) print(verify_code) file = open("test.js", "r") exec_js = file.read() exec_code = execjs.compile(exec_js) res = exec_code.call("generate") # print(res) url = "http://tzxm.jxzwfww.gov.cn/icity/api-v2/jxtzxm.app.icity.ipro.IproCmd/getBusinessListByProjectCode" params = { "s": res["sig"], "t": res["t"], "o": res["o"], } data = {"page":"2","rows":"10","projectType":"A00001,A00002","currentState":"A0501,A0502,A0503","verifyCode":verify_code,"flag":"1","projectName":"","projectCode":"","searchType":"week"} headers = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 " "Safari/537.36", "content-type": "application/json", "cookie": "ICITYSession=xxxxxx; XSRF-TOKEN=xxxxxx", "referer": "http://tzxm.jxzwfww.gov.cn/icity/ipro/open/publicity", "accept": "application/json, text/javascript, */*; q=0.01", "origin": "http://tzxm.jxzwfww.gov.cn", "host": "tzxm.jxzwfww.gov.cn", "accept-encoding": "gzip, deflate", "accept-language": "zh-CN,zh;q=0.9" } resp = requests.post(url, params=params, data=data, headers=headers) print(resp.text)
调试了一下也不知道问题在哪里,暂时先到这里吧。