首頁  >  文章  >  後端開發  >  盤點一份JS逆向程式碼轉換為Python程式碼的教學

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

WBOY
WBOY轉載
2023-04-13 09:46:061321瀏覽

盤點一份JS逆向程式碼轉換為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程式碼的教學

依序以每個函數來作為拆解,如下:

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程式碼的教學

把這個位址放到瀏覽器,是可以播放的,然後一個請求下載,即可把影片拿下來。

總結

大家好,我是Python進階者。這篇文章主要基於Python網路爬蟲中的JS逆向問題,做了一個案例來講解。網頁有JS載入的情況,如果直接透過網路爬蟲進行請求,你拿不到最終的這個加密後的位址的,針對該逆向問題,做了一個簡單的逆向範例實現過程。

以上是盤點一份JS逆向程式碼轉換為Python程式碼的教學的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除