爬蟲網(wǎng)絡請求之JS解密四(中國裁判文書網(wǎng)下)

-前言:

之前對中國裁判網(wǎng)文書網(wǎng)關于JS加密過程進行了詳細的講解璧函,但是還留下了一些問題,關于文書ID和RunEval的加密還未解開能庆,這里分開上下來講啊楚,也是因為最后這邊關于文書ID的解密會比之前參數(shù)加密要復雜和麻煩一些,上下并不關聯(lián)电谣,所以即使單看這一章也沒有問題。

一抹蚀、介紹

我們上一章爬蟲網(wǎng)絡請求之JS解密三(中國裁判文書網(wǎng)上)講到獲取到網(wǎng)頁List中文書ID后剿牺,或者打開裁判文書網(wǎng)抓到的數(shù)據(jù)報文找到獲取list數(shù)據(jù)的接口返回的數(shù)據(jù),可以看到如圖1-1所示:

圖1-1 獲取到的RunEval與文書ID

我們能得到的就是一個RunEval的參數(shù)和加密了的文書ID环壤,而我們需要的文書ID應該是如圖1-2所示:
圖1-2 DocID

真實DocID是有數(shù)字加字母和‘-’組成晒来,所以我們需要想辦法加密獲取到的文書ID

二、頁面分析

我們先在網(wǎng)頁上找到鏈接獲取位置郑现,發(fā)現(xiàn)如圖2-1所示:


圖2-1 DocID加密位置

我們發(fā)現(xiàn)在一個id=dataItem1的div標簽中屬性key為我們獲取到的DocID密文湃崩,在下面有一個點擊觸發(fā)的JS函數(shù),函數(shù)名Navi接箫。所以我們需要獲取Navi的JS代碼才能清楚攒读,如何解密DocID。

三辛友、JS解密

我們同樣通過瀏覽器的抓包發(fā)現(xiàn)在Lawyee.CPWSW.List.js下發(fā)現(xiàn)Navi函數(shù)薄扁,代碼如下:

function Navi(id,keyword){
    var unzipid=unzip(id);
        try{
                var realid=com.str.Decrypt(unzipid);    
                if(realid==""){
                  setTimeout("Navi('"+id+"','"+keyword+"')",1000)}
                else{
                   var url="/content/content?DocID="+realid+"&KeyWord="+encodeURI(keyword);
                    openWin(url)
                        }
                                  }
         catch(ex){
                setTimeout("Navi('"+id+"','"+keyword+"')",1000)}
              }

Navi函數(shù)定義中我們可以看到里面定義了一個url剪返,url="/content/contentDocID="+realid+"&KeyWord="+encodeURI(keyword)
其中DocID=realid,我們讀這個代碼知道邓梅,realid=com.str.Decrypt(unzip(id))脱盲,id獲取位置在這個js文件中找到如圖3-1所示:


圖3-1 id定義位置

id就等于dataitem屬性中key的值,這就如我們想的一樣日缨,我們獲取到加密的文書ID就是這里的id參數(shù)钱反。所以我們只需要得到com.str.Decrypt和unzip函數(shù)就可以解開Navi加密的DocID。
我們接下來找unzip函數(shù)定義位置匣距,在數(shù)據(jù)報文/Assets/Js/pako.min.js中找到我們要找的函數(shù)面哥,代碼如下:

    function unzip(b64Data){
    var strData;if(!window.atob){}else{}
    var charData;
    if(!Array.prototype.map){}else{}
    strData=Base64_Zip.btou(RawDeflate.inflate(Base64_Zip.fromBase64(b64Data)));
    return strData
    }
    var com={};com.str={_KEY:"12345678900000001234567890000000",_IV:"abcd134556abcedf",
    Encrypt:function(str){var key=CryptoJS.enc.Utf8.parse(this._KEY);
    var iv=CryptoJS.enc.Utf8.parse(this._IV);var encrypted="";
    var srcs=CryptoJS.enc.Utf8.parse(str);encrypted=CryptoJS.AES.encrypt(srcs,key,{iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7});
    return encrypted.ciphertext.toString()},
    Decrypt:function(str){var result=com.str.DecryptInner(str);
    try{var newstr=com.str.DecryptInner(result);if(newstr!=""){result=newstr}}catch(ex){var msg=ex}return result},
    DecryptInner:function(str){var key=CryptoJS.enc.Utf8.parse(this._KEY);var iv=CryptoJS.enc.Utf8.parse(this._IV);var encryptedHexStr=CryptoJS.enc.Hex.parse(str);var srcs=CryptoJS.enc.Base64.stringify(encryptedHexStr);var decrypt=CryptoJS.AES.decrypt(srcs,key,{iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7});
    var decryptedStr=decrypt.toString(CryptoJS.enc.Utf8);
    var result=decryptedStr.toString();try{result=Decrypt(result)}catch(ex){var msg=ex}return result
    }};
    function iemap(myarray,callback,thisArg){
    var T,A,k;if(myarray==null){throw new TypeError(" this is null or not defined")}var O=Object(myarray);var len=O.length>>>0;
    if(typeof callback!=="function"){throw new TypeError(callback+" is not a function")}if(thisArg){T=thisArg}A=new Array(len);k=0;while(k<len){var kValue,mappedValue;if(k in O){kValue=O[k];mappedValue=callback.call(T,kValue,k,O);A[k]=mappedValue}k++}return A};

這里的函數(shù)很重要,因為很多東西只能猜墨礁,我們能看懂的是這里有一個unzip函數(shù)定義幢竹,下面有一個com={},定義了一個字典類型(dict)參數(shù)com恩静,它有兩個個默認值_KEY焕毫、_IV。其中_Key為我們需要解密DocID用的秘鑰驶乾,另一個_IV應該是解開KeyWord參數(shù)的秘鑰邑飒,但是我們這里只需要DocID就可以了,所以只需要這個_KEY级乐,這里有個坑疙咸,一定要留意,大家如果用這里的_KEY作秘鑰风科,即使最后獲得了解密方法也無法解出來DocID ,因為這里給的秘鑰是一個默認密鑰撒轮,只能解最開始默認的那一頁。
同樣我們需要改寫這里的函數(shù)贼穆,我們知道com.str下面定義了Encrypt,Decrypt题山,DecryptInner函數(shù),并且傳入了參數(shù)this._KEY故痊,我們在這些函數(shù)頭增加新的參數(shù)str_key顶瞳,這樣來傳入我們獲取的秘鑰。改寫如下所示:

    function unzip(b64Data){
    var strData;if(!window.atob){}else{}
    var charData;
    if(!Array.prototype.map){}else{}
    strData=Base64_Zip.btou(RawDeflate.inflate(Base64_Zip.fromBase64(b64Data)));
    return strData
    }
    var com={};com.str={_KEY:"12345678900000001234567890000000",_IV:"abcd134556abcedf",
    Encrypt:function(str,str_key){var key=CryptoJS.enc.Utf8.parse(str_key);
    var iv=CryptoJS.enc.Utf8.parse(this._IV);var encrypted="";
    var srcs=CryptoJS.enc.Utf8.parse(str);encrypted=CryptoJS.AES.encrypt(srcs,key,{iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7});
    return encrypted.ciphertext.toString()},
    Decrypt:function(str,str_key){var result=com.str.DecryptInner(str,str_key);
    try{var newstr=com.str.DecryptInner(result,str_key);if(newstr!=""){result=newstr}}catch(ex){var msg=ex}return result},
    DecryptInner:function(str,str_key){var key=CryptoJS.enc.Utf8.parse(str_key);var iv=CryptoJS.enc.Utf8.parse(this._IV);var encryptedHexStr=CryptoJS.enc.Hex.parse(str);var srcs=CryptoJS.enc.Base64.stringify(encryptedHexStr);var decrypt=CryptoJS.AES.decrypt(srcs,key,{iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7});
    var decryptedStr=decrypt.toString(CryptoJS.enc.Utf8);
    var result=decryptedStr.toString();try{result=Decrypt(result)}catch(ex){var msg=ex}return result
    }};
    function iemap(myarray,callback,thisArg){
    var T,A,k;if(myarray==null){throw new TypeError(" this is null or not defined")}var O=Object(myarray);var len=O.length>>>0;
    if(typeof callback!=="function"){throw new TypeError(callback+" is not a function")}if(thisArg){T=thisArg}A=new Array(len);k=0;while(k<len){var kValue,mappedValue;if(k in O){kValue=O[k];mappedValue=callback.call(T,kValue,k,O);A[k]=mappedValue}k++}return A};

改寫完后愕秫,我們需要做的就是找到之前講的秘鑰_KEY慨菱,這個也是解開DocID的關鍵。
我們回憶之前獲取到圖1-1中數(shù)據(jù)報戴甩,除了文書ID外還有一個參數(shù)RunEval符喝,這個就是我們需要的用來解開_KEY的關鍵。
在Lawyee.CPWSW.List.js文件下也就是找到Navi函數(shù)定義那甜孤,檢索RunEval會發(fā)現(xiàn)如圖3-2所示:

圖3-2 RunEval參數(shù)

之前也是在想這個參數(shù)有什么作用洲劣,每次請求一次Listcontent都會有一個新的RunEval值备蚓,所以懷疑這里會是KEY,這也就是需要靠點直覺囱稽,畢竟這么多js文件 也不能全看明白郊尝。如果你能找到這里,會看到它會用到unzip(RunEval)战惊,我們繼續(xù)用谷歌控制后臺(console)運行這一步流昏。發(fā)現(xiàn)如圖3-3所示:
圖3-3 unzip(RunEval)

這里發(fā)現(xiàn)$hidescript=string,fromCharCode()函數(shù),string,fromCharCode()作用是接受一個指定的 Unicode 值吞获,然后返回一個字符串况凉。里面全是一個加密的東西。這個就是使用了JSFuck的加密手段各拷,只用六個字符 [ ] ( ) ! +來表示一段代碼刁绒,據(jù)說是黑客為了防止js注入代碼被過濾所開發(fā)的。附上源碼地址jsfuck源碼git地址 感興趣可以去看看烤黍。這里被加密了知市。
這里其實有jsfuck之外,還進行了一些額外的操作速蕊,如果單獨運行這段代碼嫂丙,會發(fā)現(xiàn)只有一小部分代碼,如圖3-4 所示

圖3-4 直接運行返回jsfuck代碼

這里其實就是返回了$hidescript的值规哲,這里jsfuck后半段代碼跟啤,如圖3-5所示:


圖3-5 jsfuck后半段代碼

在jsfuck中_="constructor"; _ [ _ ] [ _ ]()就是執(zhí)行一個匿名函數(shù),后面有很多$hidescript混在jsfuck代碼中唉锌,我們其實只需要翻譯出執(zhí)行的匿名函數(shù)隅肥,提取這段代碼,分為兩部分袄简,第一部分得出$hidescript的值武福,第二部分代碼中用第一部分得出$hidescript的值替換所有$hidescript,同時去掉最末尾括號痘番。最后運行并返回被隱藏的js代碼運行結(jié)果,如圖3-6所示:


圖3-6 隱藏js代碼運行結(jié)果

這樣我們就發(fā)現(xiàn)了com.str._KEY平痰,然后我們改寫代碼Navi函數(shù)汞舱,加入我們解密的_key。

function Navi(id,str_key){
    var unzipid=unzip(id);
    var realid=com.str.Decrypt(unzipid,str_key);    
    return realid
}

將我們解開的_Key帶入宗雇,加入我們得到的一段DocID密文進去昂芜,運行結(jié)果如3-7所示:


圖3-7 DocID密文解密

這里我們關于DocID的解密工作就完成了( ^ - ^)~!

結(jié)語:

關于裁判文書網(wǎng)的js內(nèi)容就全部總結(jié)完了赔蒲,我之前寫的裁判爬蟲網(wǎng)絡請求之JS解密裁判文書網(wǎng)上泌神,一直被簡書網(wǎng)管給鎖定發(fā)不出來良漱,不知道是不是寫了代碼原因,所以這里也就不貼我的測試代碼了欢际。寫關于js解密的初衷也只是總結(jié)自己對JS加密研究和解密手段并分享一些心得母市,感興趣的朋友一起探討和學習。并沒有想讓大家都去爬這個網(wǎng)站损趋。所以一直也沒有寫一個完整的爬蟲代碼出來患久。還是那句話,僅供學習參考浑槽,切勿用于商業(yè)用途蒋失。

如果您喜歡我的文章,請關注或點擊喜歡桐玻,您的支持是我最大的動力 ^ ^~!
僅供學習參考篙挽,切勿用于商業(yè)用途
轉(zhuǎn)載請注明作者及其出處

黑羊的皇冠 簡書主頁

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市镊靴,隨后出現(xiàn)的幾起案子铣卡,更是在濱河造成了極大的恐慌,老刑警劉巖邑闲,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件算行,死亡現(xiàn)場離奇詭異,居然都是意外死亡苫耸,警方通過查閱死者的電腦和手機州邢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來褪子,“玉大人量淌,你說我怎么就攤上這事∠油剩” “怎么了呀枢?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長笼痛。 經(jīng)常有香客問我裙秋,道長,這世上最難降的妖魔是什么缨伊? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任摘刑,我火速辦了婚禮,結(jié)果婚禮上刻坊,老公的妹妹穿的比我還像新娘。我一直安慰自己谭胚,他們只是感情好徐块,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布未玻。 她就那樣靜靜地躺著,像睡著了一般胡控。 火紅的嫁衣襯著肌膚如雪扳剿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天铜犬,我揣著相機與錄音舞终,去河邊找鬼。 笑死癣猾,一個胖子當著我的面吹牛敛劝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纷宇,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼夸盟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了像捶?” 一聲冷哼從身側(cè)響起上陕,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拓春,沒想到半個月后释簿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡硼莽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年庶溶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片懂鸵。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡偏螺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出匆光,到底是詐尸還是另有隱情套像,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布终息,位于F島的核電站夺巩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏周崭。R本人自食惡果不足惜柳譬,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望休傍。 院中可真熱鬧,春花似錦蹲姐、人聲如沸磨取。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忙厌。三九已至凫岖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逢净,已是汗流浹背哥放。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留爹土,地道東北人甥雕。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像胀茵,于是被迫代替她去往敵國和親社露。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355