<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    【Web逆向】m3u8的ts文件的PES加解密分析以及示例

    VSole2022-05-05 12:43:10

    一、前言

    最近有朋友問我,某個視頻網站也是*里ts加密方式。恰巧51假期,就拿來分析一番,一看代碼與之前某視頻網的加密方法幾乎完全一樣。唯一不同的是 AES解密時邏輯稍有不同。還有一些奇怪的問題,同時發現,自己寫過的代碼,自己都已經不理解了,之前吾愛發的解密文章,被xx了,綜合種種吧,冒出了寫此文,算是一個復習,同時把方法分享給大家。此外,前些日子有個朋友在帖子中提到了PES解密的問題,希望此文也可以幫助到他。@VOOV

    二、TS文件結構概述

    1、幾個基本概念

    ES流(Elementary Stream) 基本碼流,不分段的音頻、視頻或其他信息的連續碼流。

    PES流 把基本流ES分割成段,并加上相應頭文件打包成形的打包基本碼流。PES是打包過的ES,已經插入PTS和DTS,一般一個PES是一幀圖像。

    TS流(Transport Stream) 傳輸流,將具有共同時間基準或獨立時間基準的一個或多個PES組合(復合)而成的單一數據流(用于數據傳輸)。

    其數據內容可包含視頻、音頻、字幕等數據。將一個視頻切成多個ts文件,實現視頻的分段傳輸。多用于電視媒體。

    2、ts文件格式

    ts文件由ts數據包組成,每個包大小為188字節(或204字節,在188個字節后加上16字節的CRC校驗數據,其他格式一樣),每個數據包存儲的內容可能不同,可能是視頻、音頻、字幕,或索引表信息,索引表就類似于一本書的目錄,通過目錄,就可以找到需要的章節,章節就類似于視頻或音頻等數據。

    注:本文所描述的ts包,均為188字節。

    ts數據包 由 4字節包頭、附加數據(一般用來填充,為了滿足188字節)、負載數據(即PES的部分數據)如下圖:

    一個完整的PES包數據,可能存在于多個ts數據包中,也就是說,一個ts包中,可能含有pes包的包頭,也可能僅僅含有pes包的負載數據.

    下圖展示了,PES包是如何轉為TS包的。

    下面來分析占4字節(32比特)ts包頭的結構以及附加域(長度不定)的結構。先上圖。

    這里我們僅分析我們用到的字段,其中頭中用到4個字段值,附加域只用到長度字段。如下表。

    序號標識位數說明0sync_byte8 bits同步字節,固定是0x47

    即每個ts包的首字節都是0x472payload_unit_start_indicator1 bit負載單元開始標識

    用來判斷是否是pes包的起始包

    若為0,則表示非起始包。

    非PES起始包,不含有PES包頭4PID(Packet ID)13 bitsts包的數據類型

    ts包有幾種數據類型:

    PAT、PMT、音頻、視頻、字幕等6adaptation_field_control2 bits附加域數據標識,有如下值:

    00:供未來使用,出ISO/IEC所保留

    01:無adaptation field,僅有效載荷

    10:僅有Adaptation field,無有效載荷

    11:Adaptation field后,帶有效載荷

    翻譯下:

    因為ts包長度固定188字節,因此

    若附加域數據過多,就會無法裝載payload

    附加域中的字段

    0adaptation field length8 bits自適應域長度,后面數據長度

    除去本字段外,附加域其余字段的長度

    表中提及的PAT、PMT相當于一本書的目錄,PAT相當于目錄的目錄,通過他們就可以找到某視頻的位置。

    PAT的pid為0,首先我們就會分析PAT。

    接下來分析下PES頭的數據格式。為我們后面解密做鋪墊。先上圖。

    字段很多,只分析我們需要的字段。如下表:

    序號標識位數說明0pes開始標識24 bitspes包開始標識

    固定值:0x00000110PES頭中后面數據的長度8 bitspes頭后面字段的長度

    pes頭的長度就等于:

    本字段以及之前所有字段的長度

    加上本字段的值

    這里其實只要拿到pes頭數據的長度。顯然通過第10個字段,就可以計算出pes頭的長度了。

    以上知識點,就可以支撐我們繼續分析ts文件的加解密了。

    三、ts加密分析

    結合代碼,我們分析下加密的邏輯。

    為了便于調試,這里我用未解密的video.ts文件作為樣例,以及自己寫的解密demo,來分析。

    (關于demo以及源代碼等,我會放在文末)

    用其他軟件(我用SublimeText)以16進制的形式,打開video.ts。

    這個一直開著,用來與代碼讀取的數據進行對比。看我們代碼讀的數據是什么。為什么這么讀。

    a、首先找到ts文件數據解析函數。這里就是append(...)函數。(關于如何定位此函數,請參考我之前的文章)

    運行demo, 輸入key,導入ts。提前在append函數首行打上斷點。點擊開始解密。會進入我們的斷點。

    接下來看下我們傳入的ts數據。

    以16進制的形式打印e1的值,與我們的video.ts數據對比,是一致的。

    看下圖(此步驟,沒啥意義,就是為了找找感覺)

    繼續,在587行 C = syncOffset(e); 代碼處添加斷點,繼續執行,程序會停留在此斷點。

    此函數是在找 ts包的起始偏移,因為每個ts包都是188字節,

    所以此函數就通過判斷連續3個188字節的首字節是否是71(16進制0x47), 若是則確定此索引為起始索引。

    我們這里都是0,也就是ts文件的第一個字節就是0x47,細心的朋友,已經發現了。

    接下來進入循環開始解析ts數據了。注意代碼中 bill開頭的函數與變量,是用來解密的。暫時忽略。

    在638行,也就是for循環的第一行,加斷點,繼續執行,會停在這里。我們分析下for循環的條件。先看看圖。

    看637行的for循環

    for (o -= (o + C) % 188, a = C; a < o; a += 188)
    

    這里C是587行同步偏移返回的值,我們這里都是0。所以for循環就等于以下:

    for (o -= o % 188, a = 0; a < o; a += 188)
    

    這就清晰多了

    這里只有2個變量,a和o,a初始值是0,然后每次循環累加188,看看o是哪里來的。

    在本函數的第三行,也就是568行,看到 o = e.length, e在上一行,就是我們ts數據的uint8數組。

    因此,o就是ts數據的總長度, 那么o -= o % 188,是什么意思?

    先用總長度對188取余,然后總長度再減去余數, 也就是說,是為了保證我們循環總長度為188的整數倍。

    為什么這么做?是為了循環體內,不出現數組越界情況。(循環內部會分析)

    延伸下,這里循環結束后,取余出去的那部分數據不就沒有分析到了嘛。

    所以當循環結束后,還得解析取余出去的那部分數據。這樣整個ts文件數據就都被解析到了。

    繼續,看638行的 if (71 === e[a]) ,顯然這是在判斷ts包的首字節是否為71(71是十進制,16進制0x47)

    如果首字節是0x47,則分析此包數據。否則直接報錯。

    此時a為0,那么我們看看e[0]的值,確實是71。

    去之前打開的video.ts文件,看看第一個字節是不是0x47。一定是的。

    目前,我們是在video.ts文件的第一個字節處,也就是第一個ts包。此時方便我們查看本地的video.ts的數據。

    所以結合ts文件格式和代碼,我們分析下一段代碼,就是 639->643行間的 if...else...

    先來看 639行:

    if (f = !!(64 & e[a + 1]), c = ((31 & e[a + 1]) << 8) + e[a + 2], (48 & e[a + 3]) >> 4 > 1)
    

    好家伙,看著就懵逼的感覺。

    可以看到,if條件內,有3個語句,逗號分割,當最后一個語句為真時,就會進入if內部。

    也就是說,前2個語句,就是執行下,跟if條件沒啥關系。那也得分析?

    先來看第一個語句

    f = !!(64 & e[a + 1])
    

    嘆號取反,雙嘆號就是負負得正。等于沒有。所以只看:64 & e[a + 1]

    我們知道a是0,那么e[a+1],顯然就是video.ts的第二個字節的值。

    我們可以看到,e[1]的值也為64 , 然后再 與 64 進行與運算。

    我們把64都轉為2進制(1個字節8bits, 所以補足8位)

    64:  0100 0000

    64:  0100 0000

    然后進行與運算。

    可以發現和64進行與運算的目的,就是取 取本字節8位中的左起第二位。

    該bit就是ts頭中的第9位(0開始),前面我們分析過 ts頭的第9位是payload_unit_start_indicator,

    即負載標志位。判斷本ts包的負載數據是否是pes的起始包。

    (不理解的話,可以翻閱ts文件結構概述章節)

    因此我們可以知道

    f 即判斷本ts包的數據是否是pes的起始包。(若是起始包,包含pes頭)

    若是起始包,則f為1,否則0

    繼續看第二個語句:

    c = ((31 & e[a + 1]) << 8) + e[a + 2]

    直接翻譯下:

    把 第二個字節的值 和 31 進行與運算,然后左移8位,再和第三個字節值 相加。

    分析過程省略,大家自行操作。

    上結果,c的值就是 ts頭中占有13個比特的pid。

    pid代表了ts包的數據類型,可以是音頻,視頻、PAT、PMT或其他

    此時的pid,不用看,一定是0,0代表是PAT。

    這里再介紹下PAT與PMT。

    PMT存儲了媒體的目錄信息,哪個視頻在哪里,哪個是音頻等

    PAT則是存儲了PMT的信息,PMT在哪之類的。

    因此一開始一定是先解析PAT,通過PAT找到PMT,解析PMT找到我們需要的 音視頻數據。

    繼續看第三個語句:

    (48 & e[a + 3]) >> 4 > 1

    翻譯:

    第四個字節和48進行與運算,右移4位,然后看是否大于1

    分析略,直接上結果:

    給(48 & e[a + 3]) >> 4 起個名字叫k吧,

    k的值就是 ts包頭的32位占2bits的 adaptation_field_control,附加區域控制字段。

    該字段的值,用來判斷附加區域是否存在,大于1 表示存在 附加域。(具體可看上一章節)

    由此,我們可以知道,只要存在附加域,就會進入if內部。

    若不存在附加域,則執行else,稍后分析。

    先來看if內部,也就是640行:

    if ((d = a + 5 + e[a + 4]) === a + 188)
    

    因為此時,a=0,所以簡化下d的等式:

    d = 5 + e[4]  ===  188

    翻譯下:ts的第5個字節值加上5。

    我們知道ts的頭是4個字節,并且此時在if內部,即是存在附加域的。

    因此 我們去上一章節 看下附加域的數據格式,可以知道:

    第一個字節(8bits)代表的是adaptation_field_length, 即附加域后面的數據長度。就是此字節后面的數據長度。

    那么再加5,就表示算上 4字節的ts頭長度,以及 adaptation_field_length 所占的1字節。

    也就是說 d = 5 + e[4] 的值,就是 ts頭長度 和 附加域長度 之和,

    那么和188比較是為什么?  因為ts包的總長度為188,當ts頭和附加域的總長度已經達到188時,就不會存在負載數據了,

    所以就不必繼續分析此包,直接 continue,繼續下一個包解析。

    好,接下來看看else代碼,就一行,643行:d = a + 4;

    相信大家應該能猜到了。這里的4就是ts頭的長度,d = a + 4,d 即表示ts負載數據的起始索引了。

    綜上, 簡單總結下這個if ... else ...

    1、f: 計算ts包的負載數據是否是pes的包的起始包。

    2、c: 計算ts包的pid

    3、判斷是否存在附加域,若存在計算附加域和ts頭的總長度。得到ts負載數據的起始索引d的值。

    4、若不存在附加域,則 ts負載數據的起始索引 d 的值為:包起始索引 + 4(ts頭的長度)。

    結論:f表示是否是pes起始包, c代表pid, d表示ts包負載數據的起始索引。

    f、c、d 后面會一直用。如下圖:

    接下來就是 switch 語句了。

    switch (c) {    case m:        f && (E && (l = D(E)) && bill_appendTsData(l,d) && void 0 !== l.pts , E = {            data: [],            size: 0,            bill_dataIdx:[]         }), E && (E.data.push(e.subarray(d, a + 188)), E.bill_dataIdx.push(d), E.size += a + 188 - d);        break;    case _:        f && (T && (l = D(T)) && bill_appendTsData(l,d) && void 0 !== l.pts, T = {            data: [],            size: 0,            bill_dataIdx:[]         }), T && (T.data.push(e.subarray(d, a + 188)), T.bill_dataIdx.push(d), T.size += a + 188 - d);        break;    case w:        f && (A && (l = D(A)) && bill_appendTsData(l,d) && void 0 !== l.pts , A = {            data: [],            size: 0,            bill_dataIdx:[]         }), A && (A.data.push(e.subarray(d, a + 188)), A.bill_dataIdx.push(d), A.size += a + 188 - d);        break;    case 0:        f && (d += e[d] + 1), S = R(e, d);        break;    case S:        f && (d += e[d] + 1);        var O = k(e, d, true, false);        m = O.avc, m > 0 , _ = O.audio, _ > 0 , w = O.id3, w > 0 , p && !b && (p = !1, a = C - 188), b = !0;        break;    case 17:    case 8191:        break;    default:        p = !0}
    

    我們前面分析知道 c 就是pid, 因此,switch,就是根據pid來進行解析不同數據包。

    看下 switch的case值:

    case m: , case _: , case w: , case 0:, case S:, case 17:, case 8191: , defalut:

    只有 m 、_ 、w 、 S ,4個變量的未知。

    我們知道此時 c的值是0, 會進入 case 0 分支的代碼,

    此處是解析PAT,S = R(e, d); 得到S的值。

    看S分支的代碼,我們可以看到其中會給 m,_,w 3個變量賦值,其實S是解析PMT。

    PMT解析完,就得到了 其他3個case 分支的值,我們繼續看其他 case m,_,w 分支的代碼,

    非常像,只是變量不同。通過分析知道,此3個分支就是解析加密數據的部分。在此不再敘述。

    接下來就分析這3個分支的一個, 就選第一個case m

    直接在case m 分支內部第一行打斷點,即646行,其他斷點全部過掉,然后繼續執行。程序停在了646行。

    分析下變量的值:

    首先分析:f,表示是否是pes起始包。此時的f的值一定是 1(true),為什么?

    因為我們是第一次進入m分支,說明我們第一次解析pid為m的類型ts包,第一次解析此包,說明它一定是pes的起始包。

    所以 f 一定是1, 結合上一章節pes包在ts包中的裝載格式,就會明白,pes的包被分割到不同的ts中,

    那么切割到第一個ts 包中的pes數據,一定包含pes的包頭,所以該ts的 f 值一定是1 。如下圖:

    f 是1 ,就會繼續執行f后面的代碼。

    接下來一行一行分析下 case m 的代碼。bill_開頭的代碼,暫時過濾,是解密用的。

    case m:    f && (E && (l = D(E)) && bill_appendTsData(l,d) && void 0 !== l.pts , E = {        data: [],        size: 0,        bill_dataIdx:[]     }), E && (E.data.push(e.subarray(d, a + 188)), E.bill_dataIdx.push(d), E.size += a + 188 - d);    break;
    

    有兩個語句以逗號分割,兩個語句之間是依次執行。

    分析語句1:

    f && (E && (l = D(E)) && bill_appendTsData(l,d) && void 0 !== l.pts , E = {        data: [],        size: 0,        bill_dataIdx:[]
        })
    

    翻譯以下:

    當 f 為真時, 若E 有值,則執行 (l = D(E)) && bill_appendTsData(l,d) && void 0 !== l.pts,并給E重新賦值

                    若E 為空,則直接給E賦值

    當 f 為假時, 后面代碼不會執行,語句1結束

    這里 l = D(E), 此代碼將加密的PES數據解密,返回給l

    分析語句2:

    無論語句1如何執行,語句2都會執行。

    E && (E.data.push(e.subarray(d, a + 188)), E.bill_dataIdx.push(d), E.size += a + 188 - d);
    

    若E 為真,則給E的data添加 e的索引d到a+188之間的數據, 給E的size累加值:a + 188 -d ,這是剛才添加數據的長度。

    若E 為空, 則結束

    我們知道 d是 ts包負載數據的起始索引,d > a, a是ts包的起始索引。所以 e.subarray(d, a + 188),這個數據,就是ts包的負載數據。

    因此語句2的目的就是:將ts包的負載數據添加到 E.data中,同時記錄下添加的數據的總大小。

    我們將語句1和2一起翻譯下:

    當f為真時,即ts包負載是pes的起始包,若E為存在值,則直接去解密E的數據,返回給l,

    接下來則給E重新賦值,然后將此時ts的負載數據,添加到E.data中,并記錄總大小size

    當f為假時,即ts包負載不是pes的起始包,將此時ts的負載數據,添加到E.data中,并記錄總大小size

    我們可以發現規律,只有當 f 為真時且E數據存在,會去解密pes數據,且解密的數據是 f為假時, 添加到E.data中的數據。

    由此,我們可以得出,加密的數據是一個完整的PES數據,(PES頭未加密,需要在pes解析中分析才能知道)。且這些PES數據存在于多個ts包中。

    接下來分析PES解密函數:l = D(E)

    在此函數的第一行,即:457行,打斷點,刪除其他斷點,繼續執行。會停留在此處。

    查看下傳進來的參數t的值,其實就是上個函數的E的值,發現有size與data。

    其中data即pes的數據,data是個數組,數組內的元素其實是 存在于各個ts包中的pes數據。看圖:

    直接斷點到493行,在這里我們分析下 c 的值,這個比較重要。

    在476行, c = a + 9, a = r[8] , r = u[0], u其實就是我們的傳進來的t.data

    我們觀察下u[0]的數據,發現開頭的三個值是 0 0 1, 這3個值是 0x 00 00 01,表示PES包的開始。

    所以u[0], 就是第一個ts包的負載,也就是包含pes包頭的負載數據。

    也就是說,r = u[0]的數據中是有pes頭數據的。

    結合我們上一章節的PES頭數據格式,分析下a = r[8], 可以知道r[8]就是PES中占8bits的,PES頭中后

    面數據長度的字段。也就是說,r[8]的值就是PES頭中,此字段后面的數據的長度。

    那么 c = a + 9, 其實就是 PES頭的總長度。此處c的值為31。

    因為r[8]字段的值代表PES頭后面剩余數據的長度,

    加上本字節以及之前字節的長度,所以就是PES頭的總長度了。

    接下來繼續分析:

    將斷點設在518行,繼續執行,程序停留在518行。

    查看下o的值、長度,以及t.data的第一個的值,對比下。看圖:

    可以看到o的值比t.data的總長度少了 31,就是c的值。

    再看o的值與t.data[0]的數據從第31個索引開始,是不是完全相同了。

    說明上面497行的for循環做的事就是:將PES的數據合并到一起,并去除PES頭的數據。o便是結果。

    for (var b = 0, g = u.length; b < g; b++) {    r = u[b];   [/b] var v = r.byteLength;    if (c) {        if (c > v) {            c -= v;            continue        }        r = r.subarray(c), v -= c, c = 0    }    o.set(r, e), e += v}
    

    再看518行:o = startAES(o);

    此代碼就是將 去除PES頭的數據進行解密。得到解密后的數據。

    本函數將解密后的PES數據返回。進行下一步處理。

    由此我們知道,此ts的加密方式是對每個pes的負載數據(去除pes頭)進行加密的。

    至此,ts的加密邏輯分析完成。

    總結下:

    1、程序首先加載ts數據

    2、每188個字節的循環,解析ts包

    3、根據包的數據類型(pid判斷),去進行不同的解析。

    4、先解析PAT、得到PMT、得到其他媒體數據音視頻等

    5、將存在于多個ts包中的pes包的數據以及總大小,保存至變量。

    6、將取得的PES包的數據和大小,傳遞給pes解析函數

    7、解析函數將所有pes數據組裝到一起并去除PES頭

    8、將組裝的后的 pes數據,傳給AES解密函數進行解密

    9、得到解密后的PES數據,返回給播放器

    我們現在知道了ts的數據是如何解析的,數據是在哪里解密的,以什么形式加密的。

    那么接下來就來分析下,我們如何對ts文件進行解密。

    四、如何進行解密

    聰明的你,估計已經想到了。既然我們在上一章節拿到了解密數據,那么把解密數據,替換掉加密數據,然后重新保存ts,不就ok了嗎

    我只能說,聰明!!!

    先分析下思路:

    我們已知道 加密數據存在于多個ts包中,將多個ts中的數據提取,然后整和,再去解密,得到解密的整和數據。

    所以,我們就要將 解密后的數據 進行拆分 到多個ts中。

    得到解密的數據:多個ts包 --> 得到待解密的pes --> 得到解密的數據

    將解密數據還原:解密的數據 --> 拆分到解密數據 --> 復原到多個ts包中

    如何拆分解密的數據?

    根據解密時,傳遞進來的整和的pes數據的size來進行拆分。

    如何復原到ts包中?

    記錄解密時,獲取pes數據時,pes數據所在的索引。

    根據索引將相應的數據替換ts中的數據。

    下面來具體操作:

    1、首先在ts中提取pes數據時,記錄下提取數據的索引。

    因為此時記錄的索引是包含PES的頭的長度。實際的解密數據是不包含PES頭的。

    所以我們要把索引傳遞到pes解析函數中,因為只有在pes解析函數中,才能拿到pes頭的長度。

    拿到pes頭的長度后,把有pes包頭的 的數據的索引值去掉pes頭的長度。

    上代碼,在所有提取pes數據的地方,添加索引數組,并記錄提取pes數據的索引。看圖:

    2、接下來在解析pes的函數中,對得到的pes解密數據進行拆分。

    其實拆分與組合是類似,方向相反。根據傳進來的pes數據的大小,以及ts包的數量來拆分。

    拿到解密的數據,拆分后,將數據保存,同時將第一個含有pes頭的索引加上pes頭的長度。

    將索引和拆分的數據,一同隨其他數據返回。

    每解析一個pes,我們就替換一個原始的未解密的pes數據。看圖:

    3、在解析ts的append函數中,收到拆分了解密的PES數據以及索引后,開始替換ts的原加密數據。

    先看下解密的數據替換的函數:

    function bill_appendTsData(nd, idx) {    //idx 沒有用到,可忽略         var i = 0,j = 0;    let dataArr = nd.bill_pd.data;    let idxArr = nd.bill_pd.dataIdx;    let len = dataArr.length;    if( len != idxArr.length ) {        console.log('數據索引與數據數量不同');        return;    }         for( i = 0; i < len; i++ ) {        let darr = dataArr[i];        let didx = idxArr[i];                 for ( j = 0; j < darr.length; j++) {            bill_d[didx+j] = darr[j];        }    }}
    

    其實很簡單,根據拿到的解密的數據和數據在ts文件的索引,替換相應的數據。

    這里打了個斷點,看下接收到的拆分后的解密數據以及索引。

    這是替換函數,看下在哪里調用替換函數。在收到解密的pes數據后,緊接著就調用。

    此外,當for循環結束后,還需要對3個類型的ts包的數據,進行解密一次。

    為什么這么做?大家思考啊

    至此,PES解密分析就完成了。

    五、總結以及demo

    demo源碼和示例視頻,我上傳到網盤了,下圖為demo示例

    總結

    1、在某代碼中,js函數如果不寫返回值,竟然不會返回。之前代碼正常。

    2、關于ts包和pes包的關系,理解了很久,最后結合代碼和文章,才弄清楚最終邏輯,有些文章內容是錯的,會帶跑偏。

    3、對于代碼中ts頭和pes頭的分析,也思考了很久,有時候半天想不明白。

    4、對于ts數據格式,什么PAT等等各種表,懵逼的狠。也是結合代碼,總算梳理明白了。

    5、文章寫了3天,梳理ts的知識,梳理代碼,準備素材,再整理成文,期望對大家有所幫助。

    6、因本人水平有限,文中若有錯誤之處,還望各位批評指正,共同進步。

    解密示例和demo

    鏈接: https://pan.baidu.com/s/1r_36JRZYPRgAnacMzxf4Ng?pwd=x9hr 提取碼: x9hr

    解析函數pes
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    最近有朋友問我,某個視頻網站也是阿里ts加密方式。恰巧51假期,就拿來分析一番,一看代碼與之前某視頻網的加密方法幾乎完全一樣。唯一不同的是 AES解密時邏輯稍有不同。
    一般情況下利用URL解析導致SSRF過濾被繞過基本上都是因為后端通過不正確的正則表達式對URL進行了解析。該方式主要是利用URL解析器和URL請求器之間的差異性發起攻擊,由于不同的編程語言實現URL解析和請求是不一樣的,所以很難驗證一個URL是否合法。下圖展示了cURL請求函數與其他語言解析函數結合使用時,由于差異性造成的漏洞。
    近年來,瀏覽器安全事件頻發,給人們帶來嚴重的損失。目前這兩類技術的研究重點主要在于對瀏覽器的JavaScript引擎的模糊測試,基礎思想都是首先將JS代碼轉換為語法樹AST,再在語法樹上進行相關變異操作。同時對其他部分進行變異,以便可以發現類似的或新的錯誤。⑤DIE記錄運行時覆蓋反饋信息決定新文件將被保存。此外,DIE同樣記錄自定義函數的參數和返回值的類型,以便在新構建的AST節點中進行合法調用。
    盡管該工具包只出售給受信任的組織進行安全測試,但由于源代碼泄露,它的各種組件不可避免地進入了攻擊者的武器庫,從勒索軟件組織到國家支持的攻擊組織。濫用Cobalt Strike的惡意軟件甚至在2020年臭名昭著的SolarWinds供應鏈攻擊事件發揮了作用。當有效負載是靜態防護的、僅存在于內存中并且拒絕執行時,這種情況會給檢測帶來問題。我們將這些Cobalt Strike裝載程序稱為KoboldLoader, MagnetLoader和LithiumLoader。MagnetLoader的所有導出函數內部調用相同的主要惡意軟件例程。
    發現看雪等國內安全論壇好像CoAP協議相關內容很少,以及CVE中基本也是CoAP協議庫存在的漏洞,所以將最近對某設備CoAP漏洞挖掘的相關分析整理記錄一下。
    Spring的英文翻譯為春天,可以說是給Java程序員帶來了春天,因為它極大的簡化了開發。
    Rootkit 是植入操作系統最深處的c。盡管在紙面上它們似乎對攻擊者很有吸引力,但創建它們會帶來重大的技術挑戰,并且最輕微的編程錯誤都有可能使受害計算機完全崩潰。
    隨著 5G、云計算、人工智能、大數據、區塊鏈等技術的日新月異,數字化轉型進程逐步推進,軟件已經成為日常生產生活必備要素之一,滲透到各個行業和領域。
    隨著 5G、云計算、人工智能、大數據、區塊鏈等技術的日新月異,數字化轉型進程逐步推進,軟件已經成為日常生產生活必備要素之一,滲透到各個行業和領域。容器、中間件、微服務等技術的演進推動軟件行業快速發展,同時帶來軟件設計開發復雜度不斷提升,軟件供應鏈也愈發復雜,全鏈路安全防護難度不斷加大。近年來,軟件供應鏈安全事件頻發,對于用戶隱私、財產安全乃至國家安全造成重大威脅,自動化安全工具是進行軟件供應鏈安全
    函數簡介 云函數是騰訊云為企業和開發者們提供的無服務器執行環境,可以無需購買和管理服務器的情況下運行代碼。只需使用平臺支持的語言編寫核心代碼并設置代碼運行的條件,即可在騰訊云基礎設施上彈性、安全地運行代碼。SCF是實時文件處理和數據處理等場景下理想的計算平臺。服務端配置云函數基礎配置選擇自定義創建,地域自選,部署模式,代碼部署,運行環境Python3.6,其余默認即可。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类