目标网站:
http://www.bjmtg.gov.cn/ggzy/jyxxzc/index.jhtml
分析加密点:
我们想要详情页的数据,但是详情页的url链接并不是为们想的简单通过数字方式相加就可以,或者是再主页面拿到的详情页url链接也是不对的。一般来讲我们会再主页面拿到详情页url,然后进行数据抓取。但是这个网站并不是这样,为们可以看一下:
如上图:==1==代表是为们通过爬虫拿到的详情页的url,但是我们再看看,这个真正的详情页的链接,点击==2==。
这才是我们真正的链接。
现在我们思考:我们可以通过手动点击进入这个详情页,那么肯定是在们点击的时候对上面的==步骤1==当中的url进行了一下加密,这样我们就能跟容易的通过跟踪鼠标点击事件,找到他的加密点。
解密:
1、跟踪鼠标点击事件:
到这里,我们看到他对a标签做了一个点击事件的监听,我们看看a标签到底是什么(将鼠标点击右边的框),很显然这个a标签就是我的a链接,我们点进去看。
到这里我们就知道了,他采用的是aes加密,现在加密点分析出来了,后面的操作就简单了。
我们也可打上断点,进行试验一下,看看是不是这里进行了加密:
打上断点之后,我们再点击一下详情页,即可。然后我们往下分析,看见了他的整个加密过程,最后就是重写js代码的问题了。
2、解密实现:
直接从写他的js代码即可:
var Cryoptojs = require('crypto-js');function decrypt(href) { var s = "qnbyzzwmdgghmcnm"; var hh = href; var aa = hh.split("/"); var aaa = aa.length; var bbb = aa[aaa - 1].split('.'); var ccc = bbb[0]; var cccc = bbb[1]; var r = /^\+?[1-9][0-9]*$/; if (r.test(ccc) && cccc.indexOf('jhtml') != -1) { var srcs = Cryoptojs.enc.Utf8.parse(ccc); var k = Cryoptojs.enc.Utf8.parse(s); var en = Cryoptojs.AES.encrypt(srcs, k, { mode: Cryoptojs.mode.ECB, padding: Cryoptojs.pad.Pkcs7 }); var ddd = en.toString(); ddd = ddd.replace(/\//g, "^"); ddd = ddd.substring(0, ddd.length - 2); var bbbb = ddd + '.' + bbb[1]; aa[aaa - 1] = bbbb; var uuu = ''; for (i = 0; i < aaa; i++) { uuu += aa[i] + '/' } uuu = uuu.substring(0, uuu.length - 1); // window.open(uuu) return uuu } }console.log(decrypt('http://www.bjmtg.gov.cn:80/ggzy/jyxxzbhxrgs/2518.jhtml'));
我这里直接用crypto-js
这个模块的,里面自带了相关的函数。
3、运行截图:
这里还有一个问题,如果你想再python
中调用这个javascript
代码,他会报错,因为python
中是没有这个crypto-js
的,当然你也可以选择给它从加密点抠出来,放在javascript
代码,这里我们不用这种方法,我们直接用node.js
开放一个本地API
接口,然后再python
中直接请求这个接口,调用函数。
var Cryoptojs = require('crypto-js');const express = require('express');const bodyParser = require('body-parser');const app = express();app.use(bodyParser.json());app.use(bodyParser.urlencoded({ extended: true }));app.post('/post',function (req,res) { data= req.body; console.log( "传过来的数值为: %s",data ); function decrypt(href) { var s = "qnbyzzwmdgghmcnm"; var hh = href; var aa = hh.split("/"); var aaa = aa.length; var bbb = aa[aaa - 1].split('.'); var ccc = bbb[0]; var cccc = bbb[1]; var r = /^\+?[1-9][0-9]*$/; if (r.test(ccc) && cccc.indexOf('jhtml') != -1) { var srcs = Cryoptojs.enc.Utf8.parse(ccc); var k = Cryoptojs.enc.Utf8.parse(s); var en = Cryoptojs.AES.encrypt(srcs, k, { mode: Cryoptojs.mode.ECB, padding: Cryoptojs.pad.Pkcs7 }); var ddd = en.toString(); ddd = ddd.replace(/\//g, "^"); ddd = ddd.substring(0, ddd.length - 2); var bbbb = ddd + '.' + bbb[1]; aa[aaa - 1] = bbbb; var uuu = ''; for (i = 0; i < aaa; i++) { uuu += aa[i] + '/' } uuu = uuu.substring(0, uuu.length - 1); // window.open(uuu) return uuu } } let datas = decrypt(data['href']); console.log( '返回的参数为:%s',datas ); res.json(datas)});const server = app.listen(8000, function () { let port = server.address().port; console.log( "node服务启动,监听地址为: http://%s:%s", '127.0.0.1', port )});
看到如下信息,证明你成功开发了,接口。然后只需要再python
中去访问它,并且把你从主页面中拿到的详情页的url链接传入进去即可:
import requestsfrom urllib import parseurl = 'http://www.bjmtg.gov.cn:80/ggzy/jyxxzccg/2445.jhtml'real_url = requests.post('http://localhost:8000/post', data={'href': url}).json()print(real_url)quotedURL = parse.quote(real_url)# 防止有 ^ 导致其访问不正常
结束:
到此为止,所有分析完毕。
整个加密并不困难,有一定js逆向基础的朋友都能很快的解决,并且解决的肯定比我好。
如果大家感兴趣,可以自行试试。
声明:本站所有资源均由网友分享,如有侵权内容,请在文章下方留言,本站会立即处理。