第一个网站
前置步骤,不懂的话看回之前的文章https://blog.csdn.net/chaopicrawl/article/details/107935239
经过分析我们发现只有 tk q (q是翻译的词) 是变换的,而且直接复制url到浏览器是无法访问的,这就说明了这个 tk 必不可少了
正常全局搜索发现有很多tk
然后 这个 url 又是 xhr 形式的
所以我们可以用 xhr断点技巧去断点
点击上方的 Sources 然后添加 xhr断点
再次回到页面翻译就发现断住了,
这里断住的意思是 页面即将要生成 tk (tk现在仍未生成)
这种 xhr断点方式 查找生成值最好的方式是利用函数流
右侧的 Call Stack
send这个函数停住 然后后面的函数是 send函数之后的函数是做什么的
我们点击pj 函数中的 a变量,发现 Form Data 数据在里面 (因为这个js文档用了 函数名混淆 所以每隔一段时间访问函数名就会变,但逻辑是一样的)
我们在这打个断点 (目前为止我们什么都不知道,只知道这里有我们想要的)
再点击下一个函数 ( ZE函数 )又发现了 Form Data 数据在里面,同样的打个断点
继续下一个函数
再后面的函数就没有了,当然了settimeout 上面的都点一遍检查后发现的
( setTimeout 很大概率已经不是我们想要的,所以先排除,如果后面无法找到 tk 的话再回来看 )
接下来,我们取消之前的 xhr断点 然后打开我们刚刚断的三个点
然后点右上角蓝色图标 (恢复脚本 跟f5 刷新不一样,他是在我们之前停住的 xhr 断点处恢复 所以仍然保持翻译这个动作,因为我们的断点都是 在函数流后面断的 所以自然可以断住了)
发现停在第一个断点处
但没有后面的 Form Data 数据 ( 没有我们要的 tk ) 所以这个断点排除 然后重新翻译 ( 这里可能第一个断点处恢复后就执行完了,所以到不了后面的断点)
同样没有我们想要的 所以排除 然后重新翻译
我们发现 第二个断点有我们想要的 Form Data 数据了 我们就可以开始分析了 ( 经过了之前的所有步骤,在这个函数中突然生成了 Form Data 跟函数里面的代码有关系 )
这里我们只关注 变量 c 因为有我们想要的 然后发现 c 是上面产生的
c = c.toString() 这个就是将c变成字符串 主要是后面的 YE函数
他是生成我们要的 c 的 所以点击进入 YE函数
他就在上面 然后这个 YE函数里 return tu(a)
我们要知道 a 是什么
我们不知道这是个什么东西 没办法 只能 在这打个断点了
然后再次翻译
发现断住了 且 a 是我们翻译的内容
接下来就去找 tu 函数 了
我们不知道他能 return 什么 那么还是 打个断点看看
我们发现 这个 tu 函数 就是返回我们要的 tk 了 那么就可以去构造 js代码了
已经初步成型了我们要的东西了
最后一步就是看看这个 tu函数 里面 有什么我们是缺少的
我们缺少这三样东西 最后面的 su 这个多次运行后发现其实都是一样的 所以我们可以照搬 ,至于上面那两个函数 其实就是在 tu函数上面的 ( 因为是独立的函数,所以我们可以照搬 )
最后成型的 js代码
YE = function(a) {
a = a.Kb("q").join("");
return tu(a)
}
ru = function(a, b) {
for (var c = 0; c < b.length - 2; c += 3) {
var d = b.charAt(c + 2);
d = "a" <= d ? d.charCodeAt(0) - 87 : Number(d);
d = "+" == b.charAt(c + 1) ? a >>> d : a << d;
a = "+" == b.charAt(c) ? a + d & 4294967295 : a ^ d
}
return a
}
var qu = function(a) {
return function() {
return a
}
}
su = "443895.3105296473"
gettk = function(a) {
if (null !== su)
var b = su;
else {
b = qu(String.fromCharCode(84));
var c = qu(String.fromCharCode(75));
b = [b(), b()];
b[1] = c();
b = (su = window[b.join(c())] || "") || ""
}
var d = qu(String.fromCharCode(116));
c = qu(String.fromCharCode(107));
d = [d(), d()];
d[1] = c();
c = "&" + d.join("") + "=";
d = b.split(".");
b = Number(d[0]) || 0;
for (var e = [], f = 0, g = 0; g < a.length; g++) {
var h = a.charCodeAt(g);
128 > h ? e[f++] = h : (2048 > h ? e[f++] = h >> 6 | 192 : (55296 == (h & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (h = 65536 + ((h & 1023) << 10) + (a.charCodeAt(++g) & 1023),
e[f++] = h >> 18 | 240,
e[f++] = h >> 12 & 63 | 128) : e[f++] = h >> 12 | 224,
e[f++] = h >> 6 & 63 | 128),
e[f++] = h & 63 | 128)
}
a = b;
for (f = 0; f < e.length; f++)
a += e[f],
a = ru(a, "+-a^+6");
a = ru(a, "+-3^+b+-f");
a ^= Number(d[1]) || 0;
0 > a && (a = (a & 2147483647) + 2147483648);
a %= 1E6;
return c + (a.toString() + "." + (a ^ b))
}
最后运行结果
最后就是检测了 ( Console 台检测 )
第二个网站
https://dynamic2.scrape.center/page/1
在上篇文章中有介绍如何 js 逆向他的 Form Data数据https://blog.csdn.net/chaopicrawl/article/details/107935239 这里只介绍怎么利用 xhr断点技巧去找到我们想要的
上篇文章中我们知道了 在哪个包,而且我们需要的是token
那么同样的 在 Source中 填写 token 增加xhr断点
再次刷新页面发现断住了
同样也是找 函数流 ( Call Stack )
一个一个找
最后发现 在第二个 ( anonymous ) 函数中找到了 token
然后根据上篇文章就能得到我们想要的了 。
总结:
- 发现 获取数据的 url 是 xhr 的 我们大可以利用 xhr断点技巧去找我们要的 ( 如果全局搜索一下子就能确定的话 那么其实没有必要用这种方法 ) 适合 全局搜索无法搜索的时候
- 多利用 Call Stack ( 函数流,观察数据产生的方式,还是地方然后进行断点,一个一个排除后最终发现我们要的函数 )