从网站中分析出来js代码执行的部分,然后我们将其提取出来,之前我们使用的是execjs执行js代码,实现数据的破解,但是execjs的局限性很大,像很多的传统的库我们可以直接使用js进行引用,不需要繁杂的扣取过程,直接借助node.js的环境,执行js获取数据
第一步:熟悉需求
目标网站:jzsc.mohurd.gov.cn/data/compan…
第二步:找到异步加载的接口,分析接口数据
我们看到数据展示到了页面上,我们来找xhr请求
应该就是从这list?pg=0&pgsz=15&total=0请求中获取的数据,我们首先分析有没有加密参数,发现并没有,可以直接请求到拿到数据
当我们看数据的时候,发现数据部分是一串字符串
我们可以得到的结论就是,数据被加密了,前端从后端获取到数据后,通过js进行了解密,将数据提取出来放到了页面上,分析js吧
第三步:我们要找到解密js部分
3.1 搜索
在上个项目中返回的还是个json,这样我们可以获取到键的名称进行搜索,但是这个我们获取到的是一堆字符串,所以我们使用技巧,搜索JSON.parse
3.2 分析js
有个技巧就是:我们搜索到的多个匹配项,我们直觉过滤,然后我们在不能分辨的上面打上断点,刷新页面,看是否经过那个接口,经过,看看和我们的数据是不是相同的,可以快速的选择出我们要找的变量
3.3 打上断点,刷新页面调试
详细调试过程上个教程中有,这个部分直接查找进行使用
经过在控制台测试,我们可以发现,数据就是通过这个部分解析的,所以接下来就是扣取js的过程了
改写js:对js代码进行简单的整合,变成我们想要的格式
function decode(t) {
var e = JSON.parse(h(t));
return e
}
3.4 追查相关的js
原则:缺什么补充什么
我们可以新建一个js文件,将刚才的o函数放入其中,运行代码
# encrypt_data 可以从请求中获取
import execjs
with open("test.js","r",encoding="utf-8") as f:
str1 = f.read()
ctx = execjs.compile(str1)
a = ctx.call('json_parse', encrypt_data)
我们得到错误 h 不存在 ,寻找h方法,查找过程上个教程中有详细陈述
function h(t) {
var e = d.a.enc.Hex.parse(t)
, n = d.a.enc.Base64.stringify(e)
, a = d.a.AES.decrypt(n, f, {
iv: m,
mode: d.a.mode.CBC,
padding: d.a.pad.Pkcs7
})
, r = a.toString(d.a.enc.Utf8);
return r.toString()
}
接下来按照常规的操作我们应该在运行脚本,定位下一个缺失元素,但是敏感的发现enc.Hex.parse(t),enc.Base64.stringify(e)等这些都是crypto-js库中的加密手段,所以我们可以直接使用crypto-js,我们对上面的js代码进行改写
//这里引入了crypto-js库,所以我们一定需要js运行环境,简单的execjs不能完成,需要使用nodejs
var waws = require("crypto-js")
function h(t) {
var e = waws.enc.Hex.parse(t)
, n = waws.enc.Base64.stringify(e)
, a = waws.AES.decrypt(n, f, {
iv: m,
mode: waws.mode.CBC,
padding: waws.pad.Pkcs7
})
, r = a.toString(waws.enc.Utf8);
return r.toString()
}
使用node调用写好的js文件
电脑中已经安装了nodejs,没安装的自行百度进行安装
在node中安装crypto-js
调用写好的js,node test.js
继续缺什么补什么的模式,缺失 f 我们去网站中查找
更新代码为
var waws = require("crypto-js")
function o(t){
var res = JSON.parse(h(t.data));
return res
}
function h(t) {
var e = waws.enc.Hex.parse(t)
, n = waws.enc.Base64.stringify(e)
, f = waws.enc.Utf8.parse("jo8j9wGw%6HbxfFn")
, a = waws.AES.decrypt(n, f, {
iv: m,
mode: waws.mode.CBC,
padding: waws.pad.Pkcs7
})
, r = a.toString(waws.enc.Utf8);
return r.toString()
}
var res = o("fa8f1891eb026fa5ffabbd521d5acd4dace8066fd57432ad7076b9deb603f4891cb3191f0d89580e6318716b02a1436068eabf7b0d83f4c4ec321449073189023e4fe6381eb360dc5544119aa38b27c6a16270179cc00764df1096772f6c31ae7b691e6091254a81f40152e5125f984d34e721254db09fa56ddbed19028d3979951bfce54c93d1233fc11840f69fbd254324e06b4e20e50b438ab87c329dc57f9ce781cd6881c1365ca41a17690f7c75a32ac7f56e95457d9e1d5ac2ecd6113e6b8ad31e3d19966e28a38bc028217040770da17e2418366b03dcceef88357059")
console.log(res)
在此执行node test.js
继续修正js文件
var waws = require("crypto-js")
function o(t){
var res = JSON.parse(h(t.data));
return res
}
function h(t) {
var e = waws.enc.Hex.parse(t)
, n = waws.enc.Base64.stringify(e)
, f = waws.enc.Utf8.parse("jo8j9wGw%6HbxfFn")
, m = waws.enc.Utf8.parse("0123456789ABCDEF");
, a = waws.AES.decrypt(n, f, {
iv: m,
mode: waws.mode.CBC,
padding: waws.pad.Pkcs7
})
, r = a.toString(waws.enc.Utf8);
return r.toString()
}
var res = o("fa8f1891eb026fa5ffabbd521d5acd4dace8066fd57432ad7076b9deb603f4891cb3191f0d89580e6318716b02a1436068eabf7b0d83f4c4ec321449073189023e4fe6381eb360dc5544119aa38b27c6a16270179cc00764df1096772f6c31ae7b691e6091254a81f40152e5125f984d34e721254db09fa56ddbed19028d3979951bfce54c93d1233fc11840f69fbd254324e06b4e20e50b438ab87c329dc57f9ce781cd6881c1365ca41a17690f7c75a32ac7f56e95457d9e1d5ac2ecd6113e6b8ad31e3d19966e28a38bc028217040770da17e2418366b03dcceef88357059")
console.log(res)
在此执行即可得到数据
我们发现我们已经可以拿到数据了,破解完成。