各位老铁们,当你划到这个视频,请帮忙点个双击加个关注,感谢老铁们。。。。额。。。不好意思,走错片场了,我们今天继续来将如何查找JS的入口,话不多说,开始吧。
目标地址:https://bbs.nubia.cn/
目的:获取该网页的源代码。
工具:Chrome浏览器
第一步:打开Chrome浏览器,地址栏输入网址,并按下F12,打开调试器,再按下回车,进行访问。(如果之前访问过这个网站,还请在 Application面板里面清除掉相关的缓存和记录。),你会看到如下的现象:
又是 debugger,那我们按照第一篇下个条件断点试试?
没用的,这个坑我踩过了,只会让你的浏览器一直在那不停的转,然后你还关不掉,必须用 任务管理器 杀掉进程才行。任凭你内存有多大,也抵不过人家的无限循环呀。
下面介绍两种方法来过这个debugger:
方法一,禁用断点法:
)
点击面板上的这个 按钮,目的是禁用所有断点,这样就不会debugger了。
方法二,置空函数法:
跟踪堆栈,看看是哪个函数导致的,然后将这个函数置空。
原来是递归调用,反正从0开始一直往后加,加到你吐血为止。
那我们将这个函数置空试试。
按F5运行,就可以看到轻松过了这个debugger。
但还是有问题,F5过后,浏览器虽然载入了内容,但还是在不停的刷新,好了一会才停下来,原因在这里:
关于 setInterval函数,请自行百度了解,这里不做深入分析。
停止刷新后,Network面板如下:
面板上深色的两行就是我们要访问的网站,为什么会访问两次,第一次和第二次有什么区别呢?
第一次请求的内容,(也就是我们用requests库请求的内容)
第二次请求的内容:
嗯,这就是我们的所需要的网页源代码。
一般这种情况下,第二次请求肯定是比第一次多了什么内容,才获取到了正确的数据,我们来比对下请求头:
第一次:
第二次:
用我5000度的近视眼可以看出,是多了 Cookie字断,原来要带Cookie才能正常请求啊。。。。。。
那我们分别来看看Cookie值从哪里获取。
点击第一个页面,返回的是 acw_tc 和 aliyungf_tc:
点击第二个页面,没有返回cookies;
点击第三个页面,返回的是 acw_sc__v3:
点击第四个页面,返回的是 SERVERID:
目前就差 acw_sc__v2 不知道是哪里返回的了,如果你对上面的图有印象的话,你会发现它在这里:
也就是我们第一次请求页面是的返回代码里面。
我们将 script 标签内的代码复制出来,使用 https://beautifier.io/ 这个网站美化下,注意勾选这里:
然后复制到文本文档里,并用UE打开,当然你也可以复制到控制台下运行试试,看看有啥结果,坑我已踩,就不再赘述。
我们在代码里面搜索一下 acw_sc__v2:
在这个函数里面,我们再看看 setCookie函数:
这段代码,没多少JS知识的我都能知道是干嘛的。
原来就是 设置一个 cookie,第一个字段为 name,值是value ,以及其他的字段。这下明白了,是在这里设置的cookie。
我们再看看 reload 函数在哪里调用:
原来是这里调用的,setTimeout函数的作用可自行百度。
这下我们知道 value 的实参就是 arg2了。
那arg2 该怎么计算呢?
我们一步一步开始分析:
var _0x23a392 = arg1[_0x55f3('0x19', 'Pg54')]();
arg2 = _0x23a392[_0x55f3('0x1b', 'z5O&')](_0x5e8b26);
arg2是通过 执行_0x23a392[_0x55f3('0x1b', 'z5O&')] 这个函数返回而来,实参是 _0x5e8b26,这一堆代码是经过混淆的,人很难识别到底是干嘛的。
而这个 _0x23a392 肯定是与arg1相关的。
后面的内容因会涉及到侵权,不能细讲,公众号还想多活几天。只能说下思路。
第一个行代码是 arg1的值,是个字符串;
var arg1 = '8BFBB8FAFA6705664B5953DE4F7F48CF68D2DD5D';
第二行代码是个大数组,值都是字符串
var _0x4818 = ['csKHwqMI', 'ZsKJwr8VeAsy', 'UcKiN8O/wplwMA==', 'JR8CTg==', 'YsOnbSEQw7ozwqZKesKUw7kwX8ORIQ==', 'w7oVS8OSwoPCl3jChMKhw6HDlsKXw4s/YsOG', 'fwVmI1AtwplaY8Otw5cNfSgpw6M=', 'OcONwrjCqsKxTGTChsOjEWE8PcOcJ8K6', 'U8K5LcOtwpV0EMOkw47DrMOX', 'HMO2woHCiMK9SlXClcOoC1k=', 'asKIwqMDdgMuPsOKBMKcwrrCtkLDrMKBw64d', 'wqImMT0tw6RNw5k=', 'DMKcU0JmUwUv', 'VjHDlMOHVcONX3fDicKJHQ==', 'wqhBH8Knw4TDhSDDgMOdwrjCncOWwphhN8KCGcKqw6dHAU5+wrg2JcKaw4IEJcOcwrRJwoZ0wqF9YgAV', 'dzd2w5bDm3jDpsK3wpY=', 'w4PDgcKXwo3CkcKLwr5qwrY=', 'wrJOTcOQWMOg', 'wqTDvcOjw447wr4=', 'w5XDqsKhMF1/', 'wrAyHsOfwppc', 'J3dVPcOxLg==', 'wrdHw7p9Zw==', 'w4rDo8KmNEw=', 'IMKAUkBt', 'w6bDrcKQwpVHwpNQwqU=', 'd8OsWhAUw7YzwrU=', 'wqnCksOeezrDhw==', 'UsKnIMKWV8K/', 'w4zDocK8NUZv', 'c8OxZhAJw6skwqJj', 'PcKIw4nCkkVb', 'KHgodMO2VQ==', 'wpsmwqvDnGFq', 'wqLDt8Okw4c=', 'w7w1w4PCpsO4wqA=', 'wq9FRsOqWMOq', 'byBhw7rDm34=', 'LHg+S8OtTw==', 'wqhOw715dsOH', 'U8O7VsO0wqvDvcKuKsOqX8Kr', 'Yittw5DDnWnDrA==', 'YMKIwqUUfgIk', 'aB7DlMODTQ==', 'wpfDh8Orw6kk', 'w7vCqMOrY8KAVk5OwpnCu8OaXsKZP3DClcKyw6HDrQ==', 'wow+w6vDmHpsw7Rtwo98LC7CiG7CksORT8KlW8O5wr3Di8OTHsODeHjDmcKlJsKqVA==', 'NwV+', 'w7HDrcKtwpJawpZb', 'wpQswqvDiHpuw6I=', 'YMKUwqMJZQ==', 'KH1VKcOqKsK1', 'fQ5sFUkkwpI=', 'wrvCrcOBR8Kk', 'M3w0fQ==', 'w6xXwqPDvMOFwo5d'];
然后就是一个 自执行的函数,这个函数很重要,因为它是对 上面的大数组进行操作的,这是它的实参(_0x4818, 0x15b),函数里面有一些坑,你只需要注意:
有没有改变实参,有没有改变全局变量。
这里只改变了这个大数组,函数里面其他不相干的代码可以全部干掉。
这是我运行这个精简函数后得到的大数组
_0x4818 = ["wqImMT0tw6RNw5k=", "DMKcU0JmUwUv", "VjHDlMOHVcONX3fDicKJHQ==", "wqhBH8Knw4TDhSDDgMOdwrjCncOWwphhN8KCGcKqw6dHAU5+wrg2JcKaw4IEJcOcwrRJwoZ0wqF9YgAV", "dzd2w5bDm3jDpsK3wpY=", "w4PDgcKXwo3CkcKLwr5qwrY=", "wrJOTcOQWMOg", "wqTDvcOjw447wr4=", "w5XDqsKhMF1/", "wrAyHsOfwppc", "J3dVPcOxLg==", "wrdHw7p9Zw==", "w4rDo8KmNEw=", "IMKAUkBt", "w6bDrcKQwpVHwpNQwqU=", "d8OsWhAUw7YzwrU=", "wqnCksOeezrDhw==", "UsKnIMKWV8K/", "w4zDocK8NUZv", "c8OxZhAJw6skwqJj", "PcKIw4nCkkVb", "KHgodMO2VQ==", "wpsmwqvDnGFq", "wqLDt8Okw4c=", "w7w1w4PCpsO4wqA=", "wq9FRsOqWMOq", "byBhw7rDm34=", "LHg+S8OtTw==", "wqhOw715dsOH", "U8O7VsO0wqvDvcKuKsOqX8Kr", "Yittw5DDnWnDrA==", "YMKIwqUUfgIk", "aB7DlMODTQ==", "wpfDh8Orw6kk", "w7vCqMOrY8KAVk5OwpnCu8OaXsKZP3DClcKyw6HDrQ==", "wow+w6vDmHpsw7Rtwo98LC7CiG7CksORT8KlW8O5wr3Di8OTHsODeHjDmcKlJsKqVA==", "NwV+", "w7HDrcKtwpJawpZb", "wpQswqvDiHpuw6I=", "YMKUwqMJZQ==", "KH1VKcOqKsK1", "fQ5sFUkkwpI=", "wrvCrcOBR8Kk", "M3w0fQ==", "w6xXwqPDvMOFwo5d", "csKHwqMI", "ZsKJwr8VeAsy", "UcKiN8O/wplwMA==", "JR8CTg==", "YsOnbSEQw7ozwqZKesKUw7kwX8ORIQ==", "w7oVS8OSwoPCl3jChMKhw6HDlsKXw4s/YsOG", "fwVmI1AtwplaY8Otw5cNfSgpw6M=", "OcONwrjCqsKxTGTChsOjEWE8PcOcJ8K6", "U8K5LcOtwpV0EMOkw47DrMOX", "HMO2woHCiMK9SlXClcOoC1k=", "asKIwqMDdgMuPsOKBMKcwrrCtkLDrMKBw64d"]
自执行函数后面是一个 解密字串的函数,这个也不能细讲,基本上后面很很多地方都调用了这个函数。
这里只需要关注:
它的返回值是啥就可以了。
与返回相关的代码可以全部留下,其他不相关的代码可以全部删掉。
这是我调用这个精简函数后得到的值:
这样我们可以将所有调用这个函数的地方通通找出来,然后将相应的结果替换进去,这样会使混淆的代码变得非常清晰。
还原后的代码长这样:
我们把"unsbox" 和 hexXor这两个函数及arg1和_0x5e8b26分别拷出来:
我们看到 arg2的值已经出来了,看看和浏览器的值是否一致:
可以看出是一致的。
到此,已经全部分析完毕,每次请求得到的arg1可能都不一样,因此每次的Cookies都不一样,所以将arg1获取后再通过计算获取arg2的值,带着这个值再次请求,你需要用到session。
代码我就不放了,请大家自行编写。完!
声明:本文如有侵权,请告知本人删除,谢谢。