這篇文章主要介紹“JS逆向代碼轉(zhuǎn)換為Python代碼怎么寫(xiě)”,在日常操作中,相信很多人在JS逆向代碼轉(zhuǎn)換為Python代碼怎么寫(xiě)問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”JS逆向代碼轉(zhuǎn)換為Python代碼怎么寫(xiě)”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
10年積累的成都網(wǎng)站建設(shè)、做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有興寧免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
本文使用的這個(gè)JS加密代碼來(lái)自某個(gè)小視頻網(wǎng)站,網(wǎng)頁(yè)上呈現(xiàn)的加密函數(shù)如下圖所示:
加密方式不算太難,其中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();# 對(duì)應(yīng)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))) } };
可以看到調(diào)用了decodeMp4中的decode()函數(shù),而decode()函數(shù)中依次又調(diào)用了getHex(a)、getDec(b.hex)、g.atob()、getPos(d, c.tail)等函數(shù),而我們要做的,就是將這些函數(shù),轉(zhuǎn)換為Python的寫(xiě)法,然后構(gòu)造對(duì)應(yīng)的加密方式,得到加密后的結(jié)果,就可以完成逆向效果了。
這里的變量a通過(guò)打斷點(diǎn)的方式,得到的是一個(gè)長(zhǎng)字符串,這里以下面的變量作為示例。
a = "c0b1Ly9tdnPflQ3cQpPZpZGVvMTAubWVpdHVkYXRhLmNvbS82MWM0NDNlOGI1MmFmMTYzMi5tcDkBOyQ"
這里先提前把后面需要用到的函數(shù)做個(gè)簡(jiǎn)單的整理,這樣也方便大家后面查看。
依次以每個(gè)函數(shù)來(lái)作為拆解,具體如下:
var h = "substring",i = "split"; getHex: function(a) { return { str: a[h](4), hex: a[h](0, 4)[i]("").reverse().join("") } },
上面這個(gè)是對(duì)應(yīng)的getHex()函數(shù)JS代碼,可以看到直接返回了一個(gè)字典,字典的key分別是str和hex,其中str對(duì)應(yīng)的值是a[h](4),h的定義是substring,這個(gè)函數(shù)的意思是字符串從指定下標(biāo)開(kāi)始取值直到到字符串結(jié)尾,這里翻譯過(guò)來(lái)就是a.substring(4),也就是字符串a(chǎn)從下標(biāo)4開(kāi)始取到結(jié)束;a[h](0, 4)[i]("").reverse().join("")這個(gè)理解起來(lái)復(fù)雜一些,首先是取字符串的值,位置是從0到4,之后調(diào)用了函數(shù)i,即split函數(shù),以空格("")作為分割,調(diào)用reverse()函數(shù)倒序排序,之后調(diào)用join("")進(jìn)行字符串連接,拆解之后就簡(jiǎn)單很多了。接下來(lái)就是構(gòu)造Python代碼了,對(duì)照寫(xiě)完之后如下所示:
def getHex(a): return { "str": a[4:],# JS中的substring(4)指的是從4開(kāi)始取值到字符串末尾 "hex": "".join(list(a[0:4])[::-1])# [::-1]代表的是反向取值 }
看著是不是似曾相識(shí)呢?同上面的JS代碼如出一轍。
其JS代碼如下:
getDec: function(a) { var b = parseInt(a, 16).toString(); return { pre: b[h](0, 2)[i](""), tail: b[h](2)[i]("") } },
根據(jù)對(duì)應(yīng)關(guān)系,可以寫(xiě)出對(duì)應(yīng)的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, "") },
根據(jù)對(duì)應(yīng)關(guān)系,可以寫(xiě)出對(duì)應(yīng)的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 },
根據(jù)對(duì)應(yīng)關(guān)系,可以寫(xiě)出對(duì)應(yīng)的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))) }
根據(jù)對(duì)應(yīng)關(guān)系,可以寫(xiě)出對(duì)應(yīng)的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'])))
直接通過(guò)網(wǎng)絡(luò)爬蟲(chóng)進(jìn)行請(qǐng)求,你拿不到最終的這個(gè)加密后的地址的,不論你怎么請(qǐng)求,都是拿不到的,你只能拿到data-src,即上面說(shuō)的字符串變量a,只有通過(guò)逆向之后,通過(guò)上面的解析,運(yùn)行代碼,即可得到和網(wǎng)頁(yè)上一樣的請(qǐng)求地址,如下圖所示,逆向成功!
把這個(gè)地址放到瀏覽器,是可以播放的,然后一個(gè)請(qǐng)求下載,即可把視頻拿下。
到此,關(guān)于“JS逆向代碼轉(zhuǎn)換為Python代碼怎么寫(xiě)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!