js逆向之另類思路扣程式碼
- 2020 年 2 月 25 日
- 筆記
經常js分析的人來說有些網站檢測瀏覽器指紋是很常見的事,但是我們一點一點分析是很費時間,費腦筋的。
我們扣程式碼的結果是我們要調用他的加密或解密或某個值的演算法,當我們把他的演算法扣下來執行,正常情況下是沒問題的,但是如果他計算了瀏覽器指紋,那基本上你除了完整的分析別無他法,今天我們來講一個hook劫持。當然我只講原理,具體你們自己研究琢磨。
首先介紹一下這個es6的特性:Proxy 對象用於定義基本操作的自定義行為(如屬性查找,賦值,枚舉,函數調用等)。
簡單來說就是我們可以完全代理某個對象,基於這個對象的所有操作都會被攔截下來,但是他的內部對象操作攔不下來,比如:
a={b:function(){return "123"}} a = new Proxy(a, { get: function(target, key, receiver) { console.log(target, key, receiver); return target[key]; }, set: function(target, key, value, receiver) { console.log(target, key, value, receiver); target[key] = value; } });

當我們調用a.b 就用過代理攔截下來,但是

當我們:a.b.c我們發現.c並沒有攔截到,那是因為.c是屬於b對象,並不能嵌套攔截,如果有需要我們可以嵌套:比如

a={b:{c:function(){return "123"}}} a = new Proxy(a, { get: function(target, key, receiver) { console.log(target, key, receiver); if(target[key] instanceof Object){ return new Proxy(target[key],{ get:function(a,b,c){ return a[b]; },set:function(a,b,c,d){ a[b] = c; } }) } return target[key]; }, set: function(target, key, value, receiver) { console.log(target, key, value, receiver); target[key] = value; } });
這樣的話就可以嵌套,看到這裡你們是不是明白了,
假如他有一段程式碼我們摳出來要看他是不是有指紋計算,我們可以這樣寫
window = {}; window = new Proxy(window, { get: function(target, key, receiver) { console.log(target, key, receiver); return target[key]; }, set: function(target, key, value, receiver) { console.log(target, key, value, receiver); target[key] = value; } }); navigator= {}; navigator= new Proxy(navigator, { get: function(target, key, receiver) { console.log(target, key, receiver); return target[key]; }, set: function(target, key, value, receiver) { console.log(target, key, value, receiver); target[key] = value; } });
我們偽造window對象然後它裡面只要是基於window的操作我們都會攔截下來,然後處理,看到這裡大家都明白了,但是我們開個腦洞基於這個proxy的更有趣的玩法,既然他能攔截所有操作,那我們就可以基於這個偽造一個真實的瀏覽器環境,不過實現起來工作量那就不小了,只能是缺啥補啥。


