溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JS逆向代碼轉換為Python代碼怎么寫

發(fā)布時間:2023-04-14 10:18:01 來源:億速云 閱讀:132 作者:iii 欄目:編程語言

這篇文章主要介紹“JS逆向代碼轉換為Python代碼怎么寫”,在日常操作中,相信很多人在JS逆向代碼轉換為Python代碼怎么寫問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”JS逆向代碼轉換為Python代碼怎么寫”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

JS代碼

本文使用的這個JS加密代碼來自某個小視頻網(wǎng)站,網(wǎng)頁上呈現(xiàn)的加密函數(shù)如下圖所示:

JS逆向代碼轉換為Python代碼怎么寫

加密方式不算太難,其中decodeMp4.decode()加密函數(shù)核心代碼如下所示。

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()函數(shù),而decode()函數(shù)中依次又調用了getHex(a)、getDec(b.hex)、g.atob()、getPos(d, c.tail)等函數(shù),而我們要做的,就是將這些函數(shù),轉換為Python的寫法,然后構造對應的加密方式,得到加密后的結果,就可以完成逆向效果了。

轉換過程

這里的變量a通過打斷點的方式,得到的是一個長字符串,這里以下面的變量作為示例。

a = "c0b1Ly9tdnPflQ3cQpPZpZGVvMTAubWVpdHVkYXRhLmNvbS82MWM0NDNlOGI1MmFmMTYzMi5tcDkBOyQ"

這里先提前把后面需要用到的函數(shù)做個簡單的整理,這樣也方便大家后面查看。

JS逆向代碼轉換為Python代碼怎么寫

依次以每個函數(shù)來作為拆解,具體如下:

1、getHex(a)函數(shù)
var h = "substring",i = "split";
getHex: function(a) {
return {
str: a[h](4),
hex: a[h](0, 4)[i]("").reverse().join("")
}
},

上面這個是對應的getHex()函數(shù)JS代碼,可以看到直接返回了一個字典,字典的key分別是str和hex,其中str對應的值是a[h](4),h的定義是substring,這個函數(shù)的意思是字符串從指定下標開始取值直到到字符串結尾,這里翻譯過來就是a.substring(4),也就是字符串a從下標4開始取到結束;a[h](0, 4)[i]("").reverse().join("")這個理解起來復雜一些,首先是取字符串的值,位置是從0到4,之后調用了函數(shù)i,即split函數(shù),以空格("")作為分割,調用reverse()函數(shù)倒序排序,之后調用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)函數(shù)

其JS代碼如下:

 getDec: function(a) {
var b = parseInt(a, 16).toString(); 
return {
pre: b[h](0, 2)[i](""),
tail: b[h](2)[i]("")
}
},

根據(jù)對應關系,可以寫出對應的Python代碼如下所示:

def getDec(a):
b = str(int(a, 16))
print(b)
return {
"pre": list(b[:2]),
"tail": list(b[2:])
}
3、substr(a, b)函數(shù)

其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, "")
},

根據(jù)對應關系,可以寫出對應的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)函數(shù)

其JS代碼如下:

getPos: function(a, b) {
return b[0] = a.length - b[0] - b[1],
b
},

根據(jù)對應關系,可以寫出對應的Python代碼如下所示:

def getPos(a, b):
b[0] = len(a) - int(b[0]) - int(b[1])
print(b[0])
return b
5、decode(a, b)函數(shù)

其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)))
}

根據(jù)對應關系,可以寫出對應的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'])))
效果展示

直接通過網(wǎng)絡爬蟲進行請求,你拿不到最終的這個加密后的地址的,不論你怎么請求,都是拿不到的,你只能拿到data-src,即上面說的字符串變量a,只有通過逆向之后,通過上面的解析,運行代碼,即可得到和網(wǎng)頁上一樣的請求地址,如下圖所示,逆向成功!

JS逆向代碼轉換為Python代碼怎么寫

把這個地址放到瀏覽器,是可以播放的,然后一個請求下載,即可把視頻拿下。

到此,關于“JS逆向代碼轉換為Python代碼怎么寫”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI