前言前几天在Python星耀和最强王者交流群里,有好几个人在问JS反码视频和相关代码,貌似是所有的学习和进步。知识水平,实在是搬不动。正好这几天在看一些JS的学习资料,看到了一个挺不错的案例。在这里分享给大家,也应该记录下来。JS代码关于JS代码的搜索,很难写一篇文章来解释它。最好录个视频讲解。这里我们直接整理现成的JS代码。这个JS加密代码一开始很难找到,需要不断打断点,找到加密规律,一层层剥洋葱才能找出来。本文使用的JS加密代码来自于一个小视频网站。网页上呈现的加密函数如下图所示:加密方式并不太难,decodeMp4.decode()加密函数的核心代码如下所示。define("tool",function(a,b,c){vard=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),十六进制:a[h](0,4)[i]("").reverse().join("")}},getDec:function(a){varb=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){varc=a[h](0,b[0]),d=a[k](b[0],b[1]);返回c+a[h](b[0])[j](d,"")},getPos:function(a,b){返回b[0]=a.length-b[0]-b[1],b},decode:function(a){varb=this.getHex(a),c=this.getDec(b.hex),d=this[k](b.str,c.pre);返回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)函数varh="substring",i="split";getHex:function(a){return{str:a[h](4),hex:a[h](0,4)[i]("").reverse().join("")}},上面是对应的getHex()函数的JS代码,可以看到直接返回创建了一个字典,字典的键是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()函数反转order排序,然后调用join("")把字符串连接起来,拆解后就简单多了。下一步是构建Python代码。比较写完之后是这样的:defgetHex(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){varb=parseInt(a,16).toString();return{pre:b[h](0,2)[i](""),tail:b[h](2)[i]("")}},根据对应关系,对应Python代码可以这样写:defgetDec(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){varc=a[h](0,b[0]),d=a[k](b[0],b[1]);returnc+a[h](b[0])[j](d,"")},根据对应关系,相应的Python代码可以这样写:defsubstr(a,b):c=a[0:int(b[0])]print(c)d=a[int(b[0]):int(b[0])+int(b[1])]print(d)返回c+a[int(b[0]):].replace(d,'')4、getPos(a,b)函数的JS代码如下:getPos:function(a,b){returnb[0]=a.length-b[0]-b[1],b},根据对应关系,对应的Python代码可以写成:defgetPos(a,b):b[0]=len(a)-int(b[0])-int(b[1])print(b[0])returnb5和decode(a,b)函数的JS代码如下:decode:function(a){varb=this.getHex(a),c=this.getDec(b.hex),d=this[k](b.str,c.pre);returng.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'])#打印(d)返回base64。b64decode(substr(d,getPos(d,c['tail'])))展示的是直接通过网络爬虫请求的效果,拿不到最终的加密地址,怎么请求都拿不到get只能获取到data-src,也就是上面提到的字符串变量a。只有经过逆向工程,通过上面的分析,运行代码,才能得到和网页上一样的请求地址,如下图。反转成功!把这个地址放到浏览器里,就可以播放了,然后一键下载视频。总结大家好,我是Python进阶。本文主要针对Python网络爬虫中的JS逆向问题,做了一个案例讲解。该网页有JS加载。如果直接通过网络爬虫请求,将得不到最终的加密地址。为了解决这个逆向问题,做了一个简单的逆向实例实现过程。
