关于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"
这里先提前把后面需要用到的函数做个简单的整理,这样也方便大家后面查看。
依次以每个函数来作为拆解,具体如下:
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代码如出一辙。
其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:])
}
其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, '')
其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
其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'])))
直接通过网络爬虫进行请求,你拿不到最终的这个加密后的地址的,不论你怎么请求,都是拿不到的,你只能拿到
把这个地址放到浏览器,是可以播放的,然后一个请求下载,即可把视频拿下。
大家好,我是Python进阶者。这篇文章主要基于Python网络爬虫中的JS逆向问题,做了一个案例讲解。网页有JS加载的情况,如果直接通过网络爬虫进行请求,你拿不到最终的这个加密后的地址的,针对该逆向问题,做了一个简单的逆向示例实现过程。
来源: Python爬虫与数据挖掘
JavaScript 是 Web 开发领域里非常重要的技术之一,并且是每个开发者都必须掌握的技能。而我作为一个开始使用 Python 编程的人
Python 是机器学习最广泛采用的编程语言,它最重要的优势在于编程的易用性。如果读者对基本的 Python 语法已经有一些了解,那么这篇文章可能会给你一些启发。作者简单概览了 30 段代码,它们都是平常非常实用的技巧
Python是一种通用的高级编程语言。用它可以做许多事,比如开发桌面 GUI 应用程序、网站和 Web 应用程序等。作为一种高级编程语言,Python 还可以让你通过处理常见的编程任务来专注应用程序的核心功能。
Python在3.4引入了 asyncio 库,3.6新增了关键字 async 和 await ,此后,异步框架迅速发展了起来,性能上能和Node.js比肩,除非是CPU密集型任务,否则没有理由不适用异步框架
Python 是一门对初学者友好的编程语言,是一种多用途的、解释性的和面向对象的高级语言。它拥有非常小的程序集,非常易于学习、阅读和维护。其解释器可在Windows、Linux 和 Mac OS 等多种操作系统上使用
在 Python 中,函数是「头等公民」(first-class)。也就是说,函数与其他数据类型(如 int)处于平等地位。因而,我们可以将函数赋值给变量,也可以将其作为参数传入其他函数
Python 字典通过检查键值是否相等和比较哈希值来确定两个键是否相同.具有相同值的不可变对象在Python中始终具有相同的哈希值.注意: 具有不同值的对象也可能具有相同的哈希值(哈希冲突)
而且上面这种方法只有第一次 get_instance() 的时候能给对象传递参数,总之有许多弊端。Python 提供了 __new__ 方法正好完美解决了这个问题,再加上锁,就能实现一个线程安全的单例模式:
web开发框架存在的意义就在于可以快速便捷的构建应用,而不用去在意那些没必要的技术细节,到2020年为止,基于Python创建的的web应用已经非常多了,国外知名的有youtube.com、instagram、reditt、国内有知乎、豆瓣等等
每种语言都有自己的优势,互相结合起来各取所长程序执行起来效率更高或者说哪种实现方式较简单就用哪个,nodejs是利用子进程来调用系统命令或者文件,NodeJS子进程提供了与系统交互的重要接口,其主要API有: 标准输入
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!