前言前几天在python星耀和最强王者交流群里边,好几个人都在问js逆向的视频和相关代码,看来都在学习进阶的知识,真是卷不动了。正好这几天我也在看js的部分学习资料,看到一个还不错的案例,这里拿出来给大家分享一下,也当记录一下。
js代码关于js代码的寻找,写文章说明倒是挺难的,录制视频讲解会更好一些,这里直接把现成的js的代码安排上了。这个js加密代码找起来一开始是挺难的,需要不断的打断点,找到加密规律,一层一层的剥洋葱,才能一探究竟。本文使用的这个js加密代码来自某个小视频网站,网页上呈现的加密函数如下图所示:
加密方式不算太难,其中decodemp4.decode()加密函数核心代码如下所示。
define(tool, function(a, b, c) {
var d = a(jquery)
, e = a(support)
, f = a(constants)
, g = a(base64)
, h = substring
, i = split
, j = replace
, k = substr;
b.decodemp4 = {
gethex: function(a) {
return {
str: a[h](4),
hex: a[h](0, 4)[i]().reverse().join()
}
},
getdec: function(a) {
var b = parseint(a, 16).tostring();# 对应python中的str(int(a, 16))
return {
pre: b[h](0, 2)[i](),
tail: b[h](2)[i]()
}
},
substr: function(a, b) {
var c = a[h](0, b[0])
, d = a[k](b[0], b[1]);
return c + a[h](b[0])[j](d, )
},
getpos: function(a, b) {
return b[0] = a.length - b[0] - b[1],
b
},
decode: function(a) {
var b = this.gethex(a)
, c = this.getdec(b.hex)
, d = this[k](b.str, c.pre);
return g.atob(this[k](d, this.getpos(d, c.tail)))
}
};
可以看到调用了decodemp4中的decode()函数,而decode()函数中依次又调用了gethex(a)、getdec(b.hex)、g.atob()、getpos(d, c.tail)等函数,而我们要做的,就是将这些函数,转换为python的写法,然后构造对应的加密方式,得到加密后的结果,就可以完成逆向效果了。
转换过程这里的变量a通过打断点的方式,得到的是一个长字符串,这里以下面的变量作为示例。
a = c0b1ly9tdnpflq3cqppzpzgvvmtaubwvpdhvkyxrhlmnvbs82mwm0ndnlogi1mmfmmtyzmi5tcdkboyq
这里先提前把后面需要用到的函数做个简单的整理,这样也方便大家后面查看。
依次以每个函数来作为拆解,具体如下:
1、gethex(a)函数var h = substring,i = split;
gethex: function(a) {
return {
str: a[h](4),
hex: a[h](0, 4)[i]().reverse().join()
}
},
上面这个是对应的gethex()函数js代码,可以看到直接返回了一个字典,字典的key分别是str和hex,其中str对应的值是a[h](4),h的定义是substring,这个函数的意思是字符串从指定下标开始取值直到到字符串结尾,这里翻译过来就是a.substring(4),也就是字符串a从下标4开始取到结束;a[h](0, 4)[i]().reverse().join()这个理解起来复杂一些,首先是取字符串的值,位置是从0到4,之后调用了函数i,即split函数,以空格()作为分割,调用reverse()函数倒序排序,之后调用join()进行字符串连接,拆解之后就简单很多了。接下来就是构造python代码了,对照写完之后如下所示:
def gethex(a):
return {
str: a[4:],# js中的substring(4)指的是从4开始取值到字符串末尾
hex: .join(list(a[0:4])[::-1])# [::-1]代表的是反向取值
}
看着是不是似曾相识呢?同上面的js代码如出一辙。
2、getdec(a)函数其js代码如下:
getdec: function(a) {
var b = parseint(a, 16).tostring();
return {
pre: b[h](0, 2)[i](),
tail: b[h](2)[i]()
}
},
根据对应关系,可以写出对应的python代码如下所示:
def getdec(a):
b = str(int(a, 16))
print(b)
return {
pre: list(b[:2]),
tail: list(b[2:])
}
3、substr(a, b)函数其js代码如下:
substr: function(a, b) {
var c = a[h](0, b[0])
, d = a[k](b[0], b[1]);
return c + a[h](b[0])[j](d, )
},
根据对应关系,可以写出对应的python代码如下所示:
def substr(a, b):
c = a[0: int(b[0])]
print(c)
d = a[int(b[0]):int(b[0])+int(b[1])]
print(d)
return c + a[int(b[0]):].replace(d, '')
4、getpos(a, b)函数其js代码如下:
getpos: function(a, b) {
return b[0] = a.length - b[0] - b[1],
b
},
根据对应关系,可以写出对应的python代码如下所示:
def getpos(a, b):
b[0] = len(a) - int(b[0]) - int(b[1])
print(b[0])
return b
5、decode(a, b)函数其js代码如下:
decode: function(a) {
var b = this.gethex(a)
, c = this.getdec(b.hex)
, d = this[k](b.str, c.pre);
return g.atob(this[k](d, this.getpos(d, c.tail)))
}
根据对应关系,可以写出对应的python代码如下所示:
b = gethex(a)
# print(b)
c = getdec(b['hex'])
print(c)
# d = k(str(b), c.pre)
d = substr(b['str'], c['pre'])
# print(d)
return base64.b64decode(substr(d, getpos(d, c['tail'])))
效果展示直接通过网络爬虫进行请求,你拿不到最终的这个加密后的地址的,不论你怎么请求,都是拿不到的,你只能拿到data-src,即上面说的字符串变量a,只有通过逆向之后,通过上面的解析,运行代码,即可得到和网页上一样的请求地址,如下图所示,逆向成功!
把这个地址放到浏览器,是可以播放的,然后一个请求下载,即可把视频拿下。
总结大家好,我是python进阶者。这篇文章主要基于python网络爬虫中的js逆向问题,做了一个案例讲解。网页有js加载的情况,如果直接通过网络爬虫进行请求,你拿不到最终的这个加密后的地址的,针对该逆向问题,做了一个简单的逆向示例实现过程。
以上就是盘点一份js逆向代码转换为python代码的教程的详细内容。