js逆向实战之某监管平台请求参数加密

声明:本篇文章仅用于知识分享,不得用于其他用途
网址:http://tzxm.jxzwfww.gov.cn/icity/ipro/open/publicity

加密步骤解析

  1. 看流量包。
    image
  2. 请求参数都是经过加密的,但是字段名比较普通,不能通过搜索字段名去定位。尝试用url关键字去搜索,有两处,但是都看不到请求参数相关的代码。
    image
  3. 换一种思路,再次刷新界面,看看请求参数中有没有不变化的。
    image
  4. 经过对比,发现s字段值是一样的,全局搜索s字段值。
    image
  5. 只有一处,在当前文件搜索__signature,也只有一处。
    image
  6. 全局搜索__signature,在其他文件中找到了。
    image
  7. 不过还是没有请求参数的相关代码,先在这里打断点,触发。
    image
  8. 可以看到ot变量都还没有赋值,一步一步放断点,看执行到哪里这两个被赋上值了。
    image
  9. 终于看到关键代码了。
    curUrl+= "?s=" + sig;
    curUrl+= "&t=" +  t;
    curUrl+= "&o=" + tkey;
    
    接下来去找sigttkey的生成过程即可。
    • sig:是个定值。
      image
    • t
      image
    • tkey
      image
  10. 把相关的代码抠出来。
    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};
    }
    
    运行一下,没问题。
    image
  11. 还要关注一个验证码的问题,每次发起请求的时候都会有一个请求验证码的过程。
    image
    在请求数据中也需要带上验证码。
    image
  12. 编写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)
    
    运行可获到验证码。
    image
  13. 编写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)
    
    运行发现获取不到数据。
    image
    调试了一下也不知道问题在哪里,暂时先到这里吧。
posted @ 2024-11-30 09:31  死不悔改奇男子  阅读(37)  评论(0编辑  收藏  举报