首页 > 编程语言 >盘点一份JS逆向代码转换为Python代码的教程

盘点一份JS逆向代码转换为Python代码的教程

时间:2023-04-23 14:38:09浏览次数:31  
标签:function return Python 代码 JS str


云母屏风烛影深,长河渐落晓星沉。

大家好,我是Python进阶者。

前言

前几天在Python星耀和最强王者交流群里边,好几个人都在问JS逆向的视频和相关代码,看来都在学习进阶的知识,真是卷不动了。正好这几天我也在看JS的部分学习资料,看到一个还不错的案例,这里拿出来给大家分享一下,也当记录一下。

JS代码

关于JS代码的寻找,写文章说明倒是挺难的,录制视频讲解会更好一些,这里直接把现成的JS的代码安排上了。这个JS加密代码找起来一开始是挺难的,需要不断的打断点,找到加密规律,一层一层的剥洋葱,才能一探究竟。本文使用的这个JS加密代码来自某个小视频网站,网页上呈现的加密函数如下图所示:


盘点一份JS逆向代码转换为Python代码的教程_算法

加密方式不算太难,其中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"

这里先提前把后面需要用到的函数做个简单的整理,这样也方便大家后面查看。


盘点一份JS逆向代码转换为Python代码的教程_编程语言_02

依次以每个函数来作为拆解,具体如下:

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,只有通过逆向之后,通过上面的解析,运行代码,即可得到和网页上一样的请求地址,如下图所示,逆向成功!


盘点一份JS逆向代码转换为Python代码的教程_人工智能_03

把这个地址放到浏览器,是可以播放的,然后一个请求下载,即可把视频拿下。


盘点一份JS逆向代码转换为Python代码的教程_人工智能_04

总结

大家好,我是Python进阶者。这篇文章主要基于Python网络爬虫中的JS逆向问题,做了一个案例讲解。网页有JS加载的情况,如果直接通过网络爬虫进行请求,你拿不到最终的这个加密后的地址的,针对该逆向问题,做了一个简单的逆向示例实现过程。



标签:function,return,Python,代码,JS,str
From: https://blog.51cto.com/u_13389043/6217571

相关文章

  • 每次记歌词——使用Python自动发邮件提醒你记歌词
    今日鸡汤八骏日行三万里,穆王何事不重来。大家好,我是Python进阶者。前言前几天在Python交流群里边,【冫马讠成】大佬分享了一个有趣的代码,用于定时发送歌词到邮箱,觉得挺有意思,这里拿出来给大家分享。实现思路实现思路倒是不难,其一是Python网络爬虫,将网页上的歌词信息抓取到,然后存起......
  • 盘点4种方法用Python批量提取[]括号内的第一个元素
    今日鸡汤葡萄美酒夜光杯,欲饮琵琶马上催。大家好,我是Python进阶者。前言前几天在才哥交流群里边遇到一个叫【上海-数据分析-小粒】的粉丝提了一个小问题,如下:数据如下:咋一看,这个题目倒是也确实不太难,群里提供思路的人也很多,一起来看看吧!思路和实现方法针对这个问题,群里的小伙伴纷纷......
  • 厉害了,Python也能使用动态链接库
    今日鸡汤未谙姑食性,先遣小姑尝。大家好,我是Python进阶者。前言动态链接库(DLL)想必大家都不陌生了吧,C/C++编程经常会用到,那么,它跟我们的Python有什么关系?要说关系恐怕也就是Python是用C写的了,不过,还有一点更重要的关系,那就是Python可以调用C函数,这一点,在Pywin32中有所体现。下面我......
  • Python能不能只选择合并一个excel当中指定的sheet 当中指定的列呢?
    春风桃李花开日,秋雨梧桐叶落时。大家好,我是皮皮。一、前言前几天在Python钻石交流群【不争】问了一个Python自动化办公的基础问题,这里拿出来给大家分享下。二、实现过程这里【瑜亮老师】、【狂吃山楂片】、【一级大头虾选手】给了一个解决思路,如下图所示:方法有很多。【瑜亮老师】......
  • Python正则怎么匹配\啊?
    玉容寂寞泪阑干,梨花一枝春带雨。大家好,我是皮皮。一、前言前几天在Python白银交流群【膨胀西瓜汁】问了一个Python正则表达式的问题,这里拿出来给大家分享下。下面是匹配的结果:二、实现过程这里【论草莓如何成为冻干莓】给了一个思路,在前面加个r,防止转义。后来发现\5不是反斜杠。......
  • 盘点几道Python面试题【ChatGPT作答】
    风吹仙袂飘飖举,犹似霓裳羽衣舞。大家好,我是皮皮。一、前言前几天在Python白银交流群看到了几道Python基础题目,这里拿出来给大家分享下,感兴趣的小伙伴可以学习学习。1、字典、元组、列表、集合的区别是什么?2、什么是装饰器,怎么用?3、为什么要有闭包?4、什么是订阅发布模式,写一个demo5......
  • JS学习笔记
    js中有几种数据类型8种\(number\)、\(string\)、\(null\)、\(undefined\)、\(boolean\)、\(Symbol\)、\(object\)、\(BigInt\).ArrayFunction的本质也是Object前5种是基本数据类型number,string,null、undefined、boolean后面三种是引用数据类型Symbol、object、BigInt.......
  • 爬虫利器:jsDOM
    之前使用node做爬虫的时候,使用puppeteer来模拟浏览器,然后抓取信息,但是这样的效率和消耗太大了,所以需要一种更为效率的方法:直接使用axios来请求对应的url,然后通过jsDom,渲染成一个虚拟的html然后进行取值。废话不多说直接上代码:先安装jsdomnpmijsdom然后写下面实例化cons......
  • Python生成requirements.txt方法
    Python生成requirements.txt方法 requirements.txt可以通过pip命令自动生成和安装,这种情况更适用于此项目是单独的虚拟python环境,生成requirements.txt文件。安装requirements.txt依赖:pipinstall-rrequirements.txt1.方法1:生成requirements.txt文件pipfreeze>re......
  • 浅析python中装饰器原理
    一、什么叫装饰器?装饰器(decorator)的本质是一个函数,它接收一个函数作为参数,并返回一个被装饰过后的函数二、装饰器的作用?在不修改被修饰过函数的代码和和调用方式的情况下,给被装饰函数增加额外的功能三、装饰器的应用场景?插入日志、性能测试、事务处理、缓存、权限校验等场景......