成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

盤點一份JS逆向代碼轉換為Python代碼的教程

開發 前端
這篇文章主要基于Python網絡爬蟲中的JS逆向問題,做了一個案例講解。網頁有JS加載的情況,如果直接通過網絡爬蟲進行請求,你拿不到最終的這個加密后的地址的,針對該逆向問題,做了一個簡單的逆向示例實現過程。?

大家好,我是Python進階者。

前言

前幾天在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網絡爬蟲中的JS逆向問題,做了一個案例講解。網頁有JS加載的情況,如果直接通過網絡爬蟲進行請求,你拿不到最終的這個加密后的地址的,針對該逆向問題,做了一個簡單的逆向示例實現過程。

責任編輯:武曉燕 來源: Python爬蟲與數據挖掘
相關推薦

2022-05-13 09:04:20

Python網絡爬蟲JS逆向問題

2019-03-24 14:14:40

代碼閱讀源代碼

2019-11-24 22:57:43

代碼程序軟件開發

2024-03-20 12:44:35

AI訓練

2019-12-03 10:28:53

編程語言PythonJava

2021-04-13 09:09:29

DevOps流程Docker

2022-03-25 11:44:14

Scrapy爬蟲命令

2020-12-29 08:04:38

H橋驅動Arduino

2019-07-16 07:52:49

NumPyPython機器學習

2022-09-25 00:07:18

Python圖形界面

2020-07-15 15:38:15

人臉識別照片活化手機

2020-11-16 11:10:21

代碼開發工具

2021-09-02 10:57:38

Python函數數據

2015-03-19 15:17:11

2018-07-29 15:33:04

2018-05-03 07:06:21

開發規范iOS

2023-09-29 22:41:26

Kubernetes云原生

2024-11-07 08:50:56

用戶分析分類維度標簽

2023-09-01 14:02:25

用戶分析攻略

2023-08-26 16:06:10

COBOLJava數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕一区二区三区精彩视频 | 老司机深夜福利网站 | 免费性视频 | a在线观看 | 99久久精品国产一区二区三区 | 日日天天 | 一区二区三区四区五区在线视频 | 久久久久久久电影 | 亚洲啊v在线 | av影音在线 | 日韩午夜在线观看 | av一区二区三区四区 | 久久精品久久精品久久精品 | 欧美一级免费看 | 日韩三级视频 | 一区二区三区高清 | 成人三级av | 午夜二区 | 中文视频在线 | 亚洲高清网| 69堂永久69tangcom| 成人二区 | 99精品国产一区二区三区 | 久久99精品国产自在现线小黄鸭 | 成人毛片视频免费 | 国产一区高清 | 国产免费一区 | 久久噜噜噜精品国产亚洲综合 | 欧美亚洲国产成人 | 一级毛片免费完整视频 | 精品一区二区三区中文字幕 | 在线欧美亚洲 | 久久久成人动漫 | 黄视频网址 | 国产精品99视频 | 日韩aⅴ片 | 国产精品久久久久久久岛一牛影视 | 国产日韩一区二区 | 免费一区 | 精品网站999| 久久成人一区 |