裁判文书网爬虫Docid解密思路

1. 使用node.js本地搭建web,运行js,返回解密结果.getValue()函数获取解密结果

	// 创建服务器
	http.createServer( function (request, response) {
    // 解析请求,包括文件名
    var pathname = url.parse(request.url).pathname;

    // 输出请求的文件名
    console.log("Request for " + pathname + " received.");
    cookie=url.parse(request.url).query.split('=')[1]
    data=getValue(cookie)
    console.log(url.parse(request.url).query.split('=')[1]);
    response.writeHead(200, {'Content-Type': 'text/html',});


    // response.writeHead(200, {'Connection': 'close'});

    // 响应文件内容
    response.write(data.toString());
    response.end();
}).listen(8080);

// 控制台会输出以下信息
console.log('Server running at http://127.0.0.1:8080/');

2. js解密:

  • js代码copy过来不能直接使用,getCookie()函数改写成从Python代码中输入变量到js代码中.
  • 立即执行代码修改:(function(ctx){........}{this} 改为window = {};(function(ctx){........}{window} 这样很容易得到列表页

3. Docid的解密:

关键点在于eval(unzip(datalist[0].RunEval));
unzip执行后是这样的:

'$hidescript=String.fromCharCode(+!+[+[]+!+[]+!..省略..[]+!+!+[]])();

这个是立即执行函数,如果使用eval执行的时候,在浏览器中是这样的一段代码:

function anonymous() {
 setTimeout('com.str._KEY="2c6d7227f85b48ee9af6ce558d92c1b0";',8000*Math.random());
}

表面上com.str._KEY是固定写死了的,但是,在翻页的时候实际上是每一页都重新对_key赋值的

现在的目标是获得这样的的函数,然后执行,对com.str._KEY赋值

但是实际自己操作的时候,在浏览器中执行的时候可以得到这段代码,但是在node中执行的时候会报错,基本是setTimeout没有定义或者callback必须是一个function这样的报错,我自己理解就是,eval()函数在执行的时候,匿名函数里面的setTimeout('com.str._KEY="2c6d7227f85b48ee9af6ce558d92c1b0";',8000*Math.random());本身就是一段字符串,不是一个函数,eval了前一层,内部一层没有把字符串转成代码执行,所偶一才导致的报错(个人理解)

那么怎么办呢?我的思路是,不让这个立即执行函数执行,然后把内层的代码提取出来,手动的执行.

s='$hidescript=String.fromCharCode(+!+[+[]+!+[]+!..省略..[]+!+!+[]])();'.replace('()','')
f=eval(s).toString()
console.log(f)

这样就可以得到匿名函数了:

function anonymous() {
 setTimeout('com.str._KEY="2c6d7227f85b48ee9af6ce558d92c1b0";',8000*Math.random());
}

通过re,匹配出'com.str._KEY="2c6d7227f85b48ee9af6ce558d92c1b0";'
然后eval('com.str._KEY="2c6d7227f85b48ee9af6ce558d92c1b0";'')
这样对com.str._KEY重新赋值了,最核心的地方就在这里了,很多人也是栽在这了

其他的坑:

其他的还有Base64_Zip没有定义等等,这里的Base64放在立即执行函数里面,按照上面的第二条来处理,调用的时候,使用window.Base64_Zip代替,就不会出现找不到函数的情况了

本文仅供自己学习记录

猜你喜欢

转载自blog.csdn.net/wu0che28/article/details/82904732
今日推荐