js逆向技巧
一、總結
一句話總結:
1、搜索;2、debug;3、查看請求調用的堆棧;4、執行堆內存中的函數;5、修改堆棧中的參數值;6、寫js代碼;7、打印windows對象的值;8、勾子
1. 搜索:全局搜索、代碼內搜索
2. debug:常規debug、XHR debug、行為debug
3. 查看請求調用的堆棧
4. 執行堆內存中的函數
5. 修改堆棧中的參數值
6. 寫js代碼
7. 打印windows對象的值
8. 勾子:cookie鈎子、請求鈎子、header鈎子
二、js逆向技巧
博客對應課程的視頻位置:
當我們抓取網頁端數據時,經常被加密參數、加密數據所困擾,如何快速定位這些加解密函數,尤為重要。本片文章是我逆向js時一些技巧的總結,如有遺漏,歡迎補充。
所需環境:Chrome瀏覽器
1. 搜索
1.1 全局搜索
適用於根據關鍵詞快速定位關鍵文件及代碼
當前頁面右鍵->檢查,彈出檢查工具
搜索支持 關鍵詞、正則表達式
1.2 代碼內搜索
適用於根據關鍵詞快速定位關鍵代碼
點擊代碼,然后按ctrl+f 或 command+f 調出搜索框。搜索支持 關鍵詞、css表達式、xpath
2. debug
2.1 常規debug
適用於分析關鍵函數代碼邏輯
a、埋下斷點
b、調試
如圖所示,我標記了1到6,下面分別介紹其含義
1.執行到下一個端點
2.執行下一步,不會進入所調用的函數內部
3.進入所調用的函數內部
4.跳出函數內部
5.一步步執行代碼,遇到有函數調用,則進入函數
6.Call Stack 為代碼調用的堆棧信息,代碼執行順序為由下至上,這對於着關鍵函數前后調用關系很有幫助
2.2 XHR debug
匹配url中關鍵詞,匹配到則跳轉到參數生成處,適用於url中的加密參數全局搜索搜不到,可采用這種方式攔截
2.3 行為debug
適用於點擊按鈕時,分析代碼執行邏輯
如圖所示,可快速定位點擊探索按鈕后,所執行的js。
3 查看請求調用的堆棧
可以在 Network 選項卡下,該請求的 Initiator 列里看到它的調用棧,調用順序由上而下:
4. 執行堆內存中的函數
當debug到某一個函數時,我們想主動調用,比如傳遞下自定義的參數,這時可以在檢查工具里的console里調用
此處要注意,只有debug打這個函數時,控制台里才可以調用。如果想保留這個函數,可使用this.xxx=xxx 的方式。之后調用時無需debug到xxx函數,直接使用this.xxx 即可。
5. 修改堆棧中的參數值
6. 寫js代碼
7. 打印windows對象的值
在console中輸入如下代碼,如只打印_$開頭的變量值
for (var p in window) { if (p.substr(0, 2) !== "_$") continue; console.log(p + " >>> " + eval(p)) }
8. 勾子
以chrome插件的方式,在匹配到關鍵詞處插入斷點
8.1 cookie鈎子
用於定位cookie中關鍵參數生成位置
var code = function(){ var org = document.cookie.__lookupSetter__('cookie'); document.__defineSetter__("cookie",function(cookie){ if(cookie.indexOf('TSdc75a61a')>-1){ debugger; } org = cookie; }); document.__defineGetter__("cookie",function(){return org;}); } var script = document.createElement('script'); script.textContent = '(' + code + ')()'; (document.head||document.documentElement).appendChild(script); script.parentNode.removeChild(script);
當cookie中匹配到了 TSdc75a61a
, 則插入斷點。
8.2 請求鈎子
用於定位請求中關鍵參數生成位置
var code = function(){ var open = window.XMLHttpRequest.prototype.open; window.XMLHttpRequest.prototype.open = function (method, url, async){ if (url.indexOf("MmEwMD")>-1){ debugger; } return open.apply(this, arguments); }; } var script = document.createElement('script'); script.textContent = '(' + code + ')()'; (document.head||document.documentElement).appendChild(script); script.parentNode.removeChild(script);
當請求的url里包含MmEwMD
時,則插入斷點
8.3 header鈎子
用於定位header中關鍵參數生成位置
var code = function(){ var org = window.XMLHttpRequest.prototype.setRequestHeader; window.XMLHttpRequest.prototype.setRequestHeader = function(key,value){ if(key=='Authorization'){ debugger; } return org.apply(this,arguments); } } var script = document.createElement('script'); script.textContent = '(' + code + ')()'; (document.head||document.documentElement).appendChild(script); script.parentNode.removeChild(script);
當header中包含Authorization
時,則插入斷點
8.4 manifest.json
插件的配置文件
{ "name": "Injection", "version": "2.0", "description": "RequestHeader鈎子", "manifest_version": 2, "content_scripts": [ { "matches": [ "<all_urls>" ], "js": [ "inject.js" ], "all_frames": true, "permissions": [ "tabs" ], "run_at": "document_start" } ] }
使用方法
a、如圖所示,創建一個文件夾,文件夾中創建一個鈎子函數文件inject.js 及 插件的配置文件 mainfest.json 即可

b、打開chrome 的擴展程序, 加載已解壓的擴展程序,選擇步驟1創建的文件夾即可

c、切換回原網頁,刷新頁面,若鈎子函數關鍵詞匹配到了,則觸發debug

以上為我做js逆向分析時用到的手段,如有不足之處或更多技巧,歡迎指教補充。