1. 爬蟲 | JS逆向某驗滑動加密分析

        共 2481字,需瀏覽 5分鐘

         ·

        2020-09-06 17:12

        點(diǎn)擊“Python編程與實(shí)戰(zhàn)”,選擇“置頂公眾號”

        第一時間獲取 Python 技術(shù)干貨!



        聲明:文只用于學(xué)習(xí)研究,禁止用于非法用途,如有侵權(quán),請聯(lián)系我刪除,謝謝!

        今天給大家來分析并還原某驗的 JS 加密,做過爬蟲的應(yīng)該都知道遇到過這個驗證碼,如果你還沒遇到以后你會碰到的相信我

        話不多說,時間寶貴,進(jìn)入正題!

        抓包

        進(jìn)入官網(wǎng),點(diǎn)擊選擇今天的主題滑動驗證,其他驗證類型的加密大同小異,只要你掌握了下面的方法!

        點(diǎn)擊按鈕抓包,隨意拖動一下,請求數(shù)據(jù)包如下

        可以看到一堆請求參數(shù),其實(shí)你要做的就是實(shí)現(xiàn) w 的加密

        點(diǎn)擊進(jìn)去,就能看到加密的 JS 文件,為便于分析將其保存到本地。

        AST 還原

        通過調(diào)試可以看到有大量的 unicode 格式的編碼以及數(shù)組名稱的混淆

        傳統(tǒng)解決方法是在瀏覽器 console 端輸入就能看到它的廬山真面目,但是這種方法太麻煩了,接下來我們用 AST 來將其還原!

        首先還原 unicode 編碼,打開 AST 在線解析網(wǎng)站(https://blogz.gitee.io/ast/[1])

        將待還原的代碼放進(jìn)去

        可以看到只需要把 extra 屬性刪掉就能還原原來的值。遍歷代碼如下:

        const?parser?=?require("@babel/parser");
        const?traverse?=?require("@babel/traverse").default;
        const?t?=?require("@babel/types");??//操作節(jié)點(diǎn)的函數(shù),比如判斷節(jié)點(diǎn)類型,生成新的節(jié)點(diǎn)等:
        const?generator?=?require("@babel/generator").default;??//生成還原后的代碼
        const?fs?=?require('fs');

        var?jscode?=?fs.readFileSync("./slide.js",?{
        ????encoding:?"utf-8"
        });
        const?visitor?=?{
        ????????StringLiteral(path)?{
        ????????????????delete?path.node.extra
        ????????????}
        }

        let?ast?=?parser.parse(jscode);
        traverse(ast,?visitor);
        let?{code}?=?generator(ast,?opts?=?{jsescOption:?{"minimal":?true}});
        fs.writeFile('decode_slide.js',?code,?(err)=>{});

        注意 jscode 就是之前扣下來的 JS 代碼, 最后將還原后的代碼寫入到 decode_slide.js 文件中

        接下來是混淆數(shù)組的還原。觀察調(diào)試代碼,所有的數(shù)組都是基于 JS 文件中開頭的大數(shù)組 KBBji.$_Co,同時將該數(shù)組賦值給很多變量,這些變量名都是隨機(jī)生成的。

        所以接下來我們要做的找出這些變量名稱,然后將其替換成對應(yīng)的字符串值!

        AST 在線解析一下

        image.png

        根據(jù)解析結(jié)果,編寫相應(yīng)的遍歷代碼

        const?visitor?=?{
        ????VariableDeclaration(path){
        ????????const?{declarations}?=?path.node;
        ????????if(!t.isMemberExpression(declarations[0].init))return;
        ????????if(declarations[0].init.property.name?!==?"$_Co")return;
        ????????if(declarations.length?!==3?||?declarations[0].init.property?===?undefined)return;
        ????????let?value1?=?declarations[0].id.name;
        ????????let?value2?=?declarations[2].id.name;
        ????????new_array.push(value1,?value2);
        ????}
        };

        上面就將所有的變量名找出來了,找到之后就能將所有的這種形式 $_DFCB(66) 代碼還原了,這樣代碼就能有個直觀感受!

        相信聰明的你很快就能寫出還原的代碼。經(jīng)過上面幾步整體還原后的代碼是這樣的

        根據(jù)關(guān)鍵詞很快就能搜索到加密所在位置,清晰可見!如果不還原你是搜不到的.. 還原后在網(wǎng)站上我們也能很快定位到加密位置,打上斷點(diǎn)

        同樣的代碼可讀性相差多大,相信你一眼就能看到。你以為這樣就完了?No!

        Reres 替換

        既然代碼已經(jīng)還原了,但是我們在網(wǎng)站上調(diào)試的時候還是混淆的代碼,那怎么辦呢?

        接下來上另一個神器 Reres, 它的作用是將請求映射到本地,即你可以用本地 JS 來代替遠(yuǎn)程 JS 文件。

        用法直接參考它的 github https://github.com/annnhan/ReRes[2]

        好了有了這個東西,我們就能在網(wǎng)站上用還原后的 JS 來進(jìn)行調(diào)試,太強(qiáng)了把!

        效果如下:

        tql,這下加密參數(shù)扣起來就沒壓力了吧!

        后臺回復(fù) tql 獲取相關(guān)代碼!

        參考資料

        [1]

        https://blogz.gitee.io/ast/: https://blogz.gitee.io/ast/

        [2]

        https://github.com/annnhan/ReRes: https://github.com/annnhan/ReRes



        推薦閱讀


        JS逆向之 RSA 案例匯總

        JS逆向?qū)崙?zhàn)之混淆加密和AES加密的破解

        JS逆向之補(bǔ)瀏覽器環(huán)境的兩種監(jiān)控方式



        THANKS

        - End -



        點(diǎn)個“在看”必升職加薪喔!
        瀏覽 75
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
          
          

            1. 精品国产免费久久 | h网站在线| 97人人做人人人难人人做 | 18禁无套内射 | 自拍偷拍19页 |