摘要:前言對某網站加密混淆后的代碼也算分析了一段時間了,雖然還沒搞出來,但多少有些心得,這里記錄一下。因此,應該將局部變量也替換成唯一且更有意義的名字,比如函數名變量索引因此,正確的方法是基于編譯原理進行語法級別的替換。
前言
對某網站加密混淆后的javascript代碼也算分析了一段時間了,雖然還沒搞出來,但多少有些心得,這里記錄一下。
工具和資料QQ群 - Javascript高級爬蟲 - 作者自建群,歡迎加入!
awesome-java-crawler - 我收集的爬蟲相關工具和資料
中國商標網加密接口 - 僅作演示
前一篇文章 - 記錄了之前嘗試的一些初步研究成果
java-curl - java HTTP庫,可用來替換chrome網絡后端,更方便控制底層行為,如緩存、代理、監控、修改請求和應答等
cdp4j - java版的Chrome Devtools Protocol實現,用于控制Chrome瀏覽器。最大的特點就是沒有“特點”,你懂的……
beautifier.io - js代碼在線格式化
estree - ECMAScript抽象語法樹(AST)業界標準
ECMAScript262語言規范 - 幫助理解estree
acornjs - ECMAScript編譯器前端,將js源碼解析成estree格式的AST
astring - ECMAScript代碼生成器,將AST重新還原成js源碼
nashorn - java8以上自帶的javascript解釋器,性能接近原生node
java中調用npm模塊 - 我的工作語言是java和kotlin,使用此方案調用js原生庫
商標局網站分析 - 類似的加密,神箭手云的大佬寫的
裁判文書網分析 - 另一篇類似網站分析
很早的一篇分析文 - 看特征是這種加密的早期版本
分析過程 獲取javascript代碼加密的核心代碼只有一小部分是直接寫在網頁的
處理前:一團亂麻,完全不知所云
處理后:雖然還很費勁,起碼看得出來這是在掛各種事件監聽器。另外,看看人家監聽多少種事件啊……
上面步驟完成后,這代碼至少勉強能看了,別放松,后面還有無數的坑……
還原前的代碼只能是讓人一臉懵逼,還原后的代碼則足以讓人咬牙切齒啊,多大仇啊,滿滿登登5000行全是正面硬懟的……
這里記錄一部分已經發現的反破解手法吧。
var eI_v1 = window["eval"]("(function() {var a = new Date(); debugger; return new Date() - a > 100;}())"); _$n1 = _$n1 || eI_v1; //這個在上篇文章分析了,在這找到調用來源了。注意,在可讀性還原之前這貨長這樣: var _$pW = _$u9[_$mz()](_$oi()); _$n1 = _$n1 || _$pW;js代碼動態混淆
上一篇文章已經說過了,每次刷新js代碼都會完全變化,包括全局/局部變量名、函數排列順序等
設斷點會被干擾,且代碼無法重復執行對于調試意味著什么?
檢查關鍵函數是否被注入替換function __RW_checkNative(rh_p0, rh_p1) { // 函數名我手動改的 try { var rh_v2 = Function["prototype"]["toString"]["apply"](rh_p0); var rh_v3 = new RegExp("{s*[native code]s*}"); if (typeof rh_p0 !== "function" || !rh_v3["test"](rh_v2) || rh_p1 != undefined && rh_p0 !== rh_p1) __GL_undefined_$sy = true; } catch (_$r0) {} }
會用這個函數檢測eval, Function, setTimeout, setInterval幾個系統函數是不是被注入了
知道這塊邏輯,就可以用一些手段騙過去,不知道的話……
檢測當前窗口是否隱藏狀態document["addEventListener"]("visibilitychange", _$r0);
會監控當前窗口是否在最上方,如果多開瀏覽器并行爬取……
檢測Selenium, WebDriver, PhantomJS等var rm_v5 = "_Selenium_IDE_Recorder,_selenium,callSelenium" , rm_v6 = "__driver_evaluate,__webdriver_evaluate,__selenium_evaluate,__fxdriver_evaluate,__driver_unwrapped,__webdriver_unwrapped,__selenium_unwrapped,__fxdriver_unwrapped,__webdriver_script_func,__webdriver_script_fn" , rm_v7 = ["selenium", "webdriver", "driver"]; if (_$un(window, "callPhantom,_phantom")) { ... }
看到這里想必就知道會發生些什么了……
Hook住AJAXvar ec_v4 = window["XMLHttpRequest"]; if (ec_v4) { var ec_v5 = ec_v4["prototype"]; if (ec_v5) { __GL_f_open = ec_v5["open"]; __GL_f_send = ec_v5["send"]; ec_v5["open"] = function () { _$t5(); arguments[1] = _$pK(arguments[1]); return __GL_f_open["apply"](this, arguments); }; } else { ... } }
會自動在ajax請求后添加一個加密參數MmEwMD,參數值中可能包括鼠標軌跡等信息
檢查navigator是否是偽造的var hi_v14 = window["navigator"]; for (hi_v11 in hi_v14) { try { hi_v13 = hi_v14["hasOwnProperty"](hi_v11); } catch (_$r0) { hi_v13 = false; } }
如果你注入的navigator對象是用{...}創建的水貨版本,那就露餡了……
檢查瀏覽器特征這塊代碼很長很復雜,還沒分析完,現在能看出來的包括:
navigator.languages - 在headless chrome中是沒有這個字段的
navigator.plugins - 無頭和有頭的chrome返回的插件列表不一樣
有一大段代碼是在canvas上用webgl繪圖,沒搞過webgl,現在還不明白,但肯定也是檢查瀏覽器特征手段之一
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42882.html
摘要:前言對某網站加密混淆后的代碼也算分析了一段時間了,雖然還沒搞出來,但多少有些心得,這里記錄一下。因此,應該將局部變量也替換成唯一且更有意義的名字,比如函數名變量索引因此,正確的方法是基于編譯原理進行語法級別的替換。 showImg(https://segmentfault.com/img/remote/1460000018765904); 前言 對某網站加密混淆后的javascript...
摘要:前言啃了這么長時間,基本上已經把某數的套路摸了個八九不離十,不愧是中國反爬界的集大成者,感覺收獲滿滿,這里就簡單記錄一下分析成果。注意某數在不同的網站上有不同的版本,其流程也略有不同,這里的流程不一定適用于其它網站。 showImg(https://segmentfault.com/img/remote/1460000018765904); 前言 啃了這么長時間,基本上已經把某數的套路...
摘要:前言啃了這么長時間,基本上已經把某數的套路摸了個八九不離十,不愧是中國反爬界的集大成者,感覺收獲滿滿,這里就簡單記錄一下分析成果。注意某數在不同的網站上有不同的版本,其流程也略有不同,這里的流程不一定適用于其它網站。 showImg(https://segmentfault.com/img/remote/1460000018765904); 前言 啃了這么長時間,基本上已經把某數的套路...
摘要:協議由來已久,是公司推出的視頻播放協議,穩定性和安全性較更好,應用廣泛。但是加密算法過于簡單,通過解密,即可實現本地觀看。可以看到視頻采用了的加密算法。目前尚無解密方案出現,安全級別極高。 信息化時代,多媒體的應用日漸成為人們生活中不可或缺的部分,無論是獲取最新資訊還是教育學習,視頻都是直觀高效的媒介之一。 基于互聯網的快速傳播,眾多培訓機構也逐漸將線下原創版權課程遷移到在線平臺中,一...
閱讀 3265·2021-09-02 15:41
閱讀 2829·2021-09-02 09:48
閱讀 1368·2019-08-29 13:27
閱讀 1157·2019-08-26 13:37
閱讀 832·2019-08-26 11:56
閱讀 2479·2019-08-26 10:24
閱讀 1638·2019-08-23 18:07
閱讀 2615·2019-08-23 15:16