一个在IT行业摸爬打滚的程序猿

0%

爬虫:js逆向目前遇到的知识点集合

目前js逆向遇到的函数、解法或者其他注意事项集合

0x01、Object(需要调用的函数名)(参数)用法详解

后面的参数将传递到需要调用的函数名中,如下:

1
2
3
// s.c对应e1    s.d对应e2   s.e对应sig
// 这里注意一下:object(sig)(f)表示将f传递到sig里面去
var f = Object(e1)(Object(e2)(JSON.stringify(l.payload))), p = Object(sig)(f);

0x02、js前加感叹号是什么意思?比如 !function(){}();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
原文来源:https://blog.csdn.net/H_O_W_E/article/details/51388500

内容如下:

--------------------------我是可爱的分割线---------------------------------------------------

此文出自 http://q.cnblogs.com/q/52920/

感谢原创作者和转载者,感谢提问人和解答人。

!function(){}(); !有什么用?

从语法上来开,Javascript中分号表示语句结束,在开头加上,可能是为了压缩的时候和别的方法分割一下,表示一个新的语句开始。所以,如果在一个单独的JS文件中,开头的分号是没有任何意义的,可以删掉。

叹号是逻辑运算符,是“非”的意思,常见这种写法 if(!true){};而将运算符加载函数定义的前面,则是将函数看做一个整体,然后再调用这个函数,并对返回的结构进行逻辑运算。

说白了,此处就是构建了一个立即执行函数,建议楼主知道意思就可以,自己写的时候,可以使用更清晰的格式:

(function(){})();

楼上已经给出很详细的解说了。

这里补充一点:在函数声明【 function (){} 】后面加【 () 】,意思是执行这个函数声明。有的叫法是“匿名自动执行函数”,更准确的表示应该为“立即执行函数”。

但立即执行函数,要作为表达式的一部分才行,不然js解释器会报语法错误。一般,成为表达式的最容易理解方式是:在左右两端加一个圆括号,像这样【 (function (){}) 】。所以,立即执行函数最常见的写法是【 (function (){})() 】,这是一个语句,在前面和后面都可以加【 ; 】。

其实立即执行函数还有N种写法,比如【 (function (){}) 】也行,在函数声明前加一元运算符也行:【 !function (){}() 】、【 ~function (){}() 】。甚至,对一元运算符进行组合也可以:【 !!!!function (){}() 】、【 ~~~function (){}() 】、【 !~!function (){}() 】。
0x03、(function (win){}(window))这个js是什么意思?

1、意思是,把window对象传入这个匿名函数中(即将window传给win),并且同时执行这个函数,==在页面载入之前就执行==;

2、小括号有返回值,也就是小括号内的函数或者表达式的返回值,所以说小括号内的function返回值等于小括号的返回值;

0x04、window对象的某些用法转换为Nodejs的用法

1、对于一些window对象的用法,将js代码扣出来,在nodejs里是不能直接使用的,需要做相应的转换,例如下面这个例子:

1
2
3
4
5
# 源js代码
window["String"]["fromCharCode"](scHZjLUh1["charCodeAt"](i)

# 扣出来在本地webstorm+nodejs执行的代码
String.fromCharCode((scHZjLUh1["charCodeAt"](i))

通过上面代码之间的转换,可以看出,window的某些用法可以在nodejs里面也能找到对应的写法

0x05、Nodejs实现Base64编解码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 用法一:
Base64["decode"](scHZjLUh1) # 源js代码
Buffer.from(scHZjLUh1, 'base64').toString() # 转换成nodejs代码

# 用法二:
window.atob([base64加密后的字符串]) # atob是解密base64字符串,成为普通字符串
window.btoa([base64加密前的字符串]) # btoa是加密字符串,成为base64编码的字符串

01、例子:
源js代码也可能是使用window对象来构造的base64加解密,比如下面:
window.atob("amF2YXNjcmlwdA==") # 解码的结果是javascript
转换为nodejs写法就是:
Buffer.from("amF2YXNjcmlwdA==", 'base64').toString() # nodejs的base64解码方式

02、继续延伸:
nodejs中base64加解密如下:

# base64解密
console.log(Buffer.from("SGVsbG8gV29ybGQ=", 'base64').toString('utf-8'))
Hello World

# base64加密
console.log(Buffer.from("Hello World").toString('base64'));
SGVsbG8gV29ybGQ=
至此本文教程写完了,希望能够帮助到各位在爬虫路上的小伙伴们,觉得不错点个赞呗
感谢认真读完这篇教程的您

先别走呗,这里有可能有你需要的干货文章:

CSS字体反爬实战,10分钟就能学会;
woff字体反爬实战,10分钟就能学会