网页抓取 加密html(逆向目标逆向过程分析(二)分析及应用)

优采云 发布时间: 2022-04-11 08:18

  网页抓取 加密html(逆向目标逆向过程分析(二)分析及应用)

  本文章所有内容仅供学习交流。抓取到的内容、敏感URL、数据接口都进行了脱敏处理。严禁商业用途和非法使用。否则由此产生的一切后果与作者无关。,如有侵权,请联系我立即删除!

  反向目标逆过程抓包分析

  这次要反转的对象与以往不同。不是某个界面的参数,而是网页中的数据。一般网页中的数据可以在源代码中看到,或者通过一个接口传递,而这次目标的数据是通过JS加密获得的。我们先抓包看一下基本情况:

  

  用F12查看,可以看到我们要的数据在textarea标签里,好像没有错,然后直接用Xpath解压试试:

  import requests

from lxml import etree

url = '脱敏处理,完整代码关注 GitHub:https://github.com/kgepachong/crawler'

headers = {

'sec-ch-ua': '"Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"',

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'

}

response = requests.get(url=url, headers=headers)

tree = etree.HTML(response.text)

data = tree.xpath('//textarea/text()')

print(data)

  

  可以看到提取出来的数据其实是空的。我们查看网页的源代码,直接搜索textarea,同样不可用。尝试直接搜索数据。

  

  

  加密反向

  由于网页源代码中不存在这种数据,也不是通过其他接口返回的,很有可能是经过JS加密后直接插入到网页源代码中的,那么如何在这里找到加密位置?对比插入数据后的网页源代码和不插入数据的网页源代码,可以看到蓝框内的代码是通过js插入的,100个8.js大部分都是加密的JS 文件:

  

  在这里,我们想到了一种 JavaScript 语法。如果要从 JavaScript 访问 HTML 元素,可以使用 document.getElementById(id) 方法。这个id是一个HTML元素的属性,然后使用innerHTML来获取或者插入元素的内容。可以看菜鸟教程的一个例子:

  

  通过这个语法,结合前面源码中的几个标签,我们可以猜想一个JS中可能有这样的语句:document.getElementById("tehai").innerHTML, document.getElementById("tips")。innerHTML,document.getElementById("m2").innerHTML,可以直接全局搜索这些语句中的任何一个,在1008.js中可以找到对应的结果。当然,你也可以直接搜索这个标签的id来找到结果。埋下断点进行调试:

  

  您可以找到第 913 行 document.getElementById("m2").innerHTML = d + "

  "就是在m2标签中插入值d和换行符,一步步查找,可以发现d里面收录了很多html的东西,而上面的g只是文本,正好是目标数据,那么我们终于直接退货了。好吧。

  继续追踪g值的出处,你会发现步骤比较复杂,那我们直接复制这部分函数(fa函数)运行调试(大约794行到914行),本地调试会提示ga和O是未定义的,我们在其定义语句的下一行埋下断点进行调试,可以看到ga的值其实是一个固定的q,而O是URL后面的q的值,如:336m237p2479s167z3s

  

  这两个变量定义好后,再本地调试,会提示aa、ca等函数未定义,依赖函数很多。这种情况下就不用一一扣除了,fa之前的所有函数都直接复制调试就好了,直接解决了所有的依赖。

  完整代码

  GitHub关注K哥的爬虫,持续分享爬虫相关代码!欢迎明星!

  以下仅演示部分关键代码,完整代码仓库地址:

  Key JS 加密代码架构

  // Copyrights C-EGG inc.

var u = function () {}();

function w() {}

w.prototype = {};

function x(b, a, g, d) {}

// 此处省略 N 个函数

function M(b) {}

function N(b, a) {}

function ea(b) {}

function fa(O) {

function b(a, b) {

var c, d = 0;

for (c = 0; c < a.length; ++c) d += 4 - b[a[c]];

return d

}

// var a = ga, g = O, d;

var a = 'q', g = O, d;

d = "";

switch (a.substr(0, 1)) {

case "q":

d += '標準形(七対国士を含む)の計算結果 / 一般形

';

break;

case "p":

d += '一般形(七対国士を含まない)の計算結果 / 標準形

'

}

for (var c = "d" == a.substr(1, 1), a = a.substr(0, 1), g = g.replace(/(\d)(\d{0,8})(\d{0,8})(\d{0,8})(\d{0,8})(\d{0,8})(\d{0,8})(\d{8})(m|p|s|z)/g, "$1$9$2$9$3$9$4$9$5$9$6$9$7$9$8$9").replace(/(\d?)(\d?)(\d?)(\d?)(\d?)(\d?)(\d)(\d)(m|p|s|z)/g, "$1$9$2$9$3$9$4$9$5$9$6$9$7$9$8$9").replace(/(m|p|s|z)(m|p|s|z)+/g, "$1").replace(/^[^\d]/, ""), g = g.substr(0, 28), f = aa(g), r = -1; r = Math.floor(136 * Math.random()), f[r];) ;

var m = Math.floor(g.length / 2) % 3;

2 == m || c || (f[r] = 1, g += H(r));

var f = ca(f),

n = "",

e = G(f, 34),

n = n + N(e, 28 == g.length),

n = n + ("(" + Math.floor(g.length / 2) + "枚)");

-1 == e[0] && (n += ' / 新しい手牌を作成');

var n = n + "

",

q = "q" == a ? e[0] : e[1],

k,

p,

l = Array(35);

if (0 == q && 1 == m && c) k = 34,

l[k] = K(f),

l[k].length && (l[k] = {

i: k,

n: b(l[k], f),

c: l[k]

});

else if (0 >= q) for (k = 0; 34 > k; ++k) f[k] && (f[k]--, l[k] = K(f), f[k]++, l[k].length && (l[k] = {

i: k,

n: b(l[k], f),

c: l[k]

}));

else if (2 == m || 1 == m && !c) for (k = 0; 34 > k; ++k) {

if (f[k]) {

f[k]--;

l[k] = [];

for (p = 0; 34 > p; ++p) k == p || 4 p; ++p) 4 = q ? "待ち" : "摸";

for (k = 0; k < t.length; ++k) {

v = t[k].i;

d += "";

34 > v && (d += "打" + ('

') + "", g += "打" + H(4 * v + 1) + " ");

d += q + "[";

g += q + "[";

l = t[k].c;

c = t[k].q;

for (p = 0; p < l.length; ++p) r = H(4 * l[p] + 1),

d += '

',

g += H(4 * l[p] + 1);

d += "" + t[k].n + "枚]";

g += " " + t[k].n + "枚]\n"

}

d = d + "

" + ('' + g + "");

-1 == e[0] && (d = d + "" + ea(f));

// document.getElementById("tehai").innerHTML = n;

// document.getElementById("tips").innerHTML = "";

// document.getElementById("m2").innerHTML = d + "

"

return g

}

// 测试样例

// console.log(fa('336m237p2479s167z3s'))

  Python代码

  #!/usr/bin/env python3

# -*- coding: utf-8 -*-

import execjs

url = '脱敏处理,完整代码关注 GitHub:https://github.com/kgepachong/crawler'

def main():

q = url.split('=')[1]

with open('decrypt.js', 'r', encoding='utf-8') as f:

decrypt_js = f.read()

data = execjs.compile(decrypt_js).call('fa', q)

print(data)

if __name__ == '__main__':

main()

  

  分类:

  技术要点:

  相关文章:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线