為什麼說是好笑,看到最後就明白了。
打xhr斷點並發起請求:
檢視呼叫棧,發現了發起request的位置:
向上檢視**,發現了這個東西:
知道ajax請求裡的signature引數和rs引數是從**來的。看一下這部分**,可以知道構造url時的u,d,t來自**
u,d,t三個引數裡,u和d很容易理解,主要是t引數如何獲取,所以在這裡重新開始打斷點。s其實是乙個函式,[u, d, l, window.couid, e, c, h["type" + e]].sort().join("")是將u,d等引數的列表變為乙個字串,作為s函式的引數。繼續單步除錯進入s函式:
這裡的t就是前面說的字串。繼續除錯,一頓除錯後,找到最重要的乙個函式doprocessblock,然後基本就能知道如何獲取加密後signature引數的值了。
獲取乙個時間引數u:
獲取引數d:import time
u = int(time.time()*1000)
下面的**是還原:[u, d, l, window.couid, e, c, h["type" + e]].sort().join(""),最後得到乙個字元def get_d():
un = '''
function(t)
return n;}'''
t = 16
return js2py.eval_js(un)(t)
除了u和d引數,其餘引數實際為固定的引數,需要自行逆向獲取。這個old就是前面提到的那一長串字串tlis = [u, d, l, couid, e, c, h]
lis = [str(i) for i in lis]
lis.sort()
old = ''.join(lis)
整個加密過程就是對幾個陣列的操作,首先是得到乙個8位初始陣列:
通過old字串得到16位的陣列1:def get_words():
un = '''
function f1()
function r(e)
for (var n = 2,
i = 0; i < 64;) t(n) && (i < 8 && (f[i] = r(math.pow(n, .5))), s[i] = r(math.pow(n, 1 / 3)), i++),
n++}jisuan();
return f;
} '''
return js2py.eval_js(un)()
通過陣列1得到32位的陣列2:def get_new_words(t):
un = '''
function(e) '''
r = js2py.eval_js(un)(t)
return r
使用最開始的8位陣列和32位陣列經過doprocessblock函式得到新的8位陣列,然後使用新的8位陣列和32位陣列又得到乙個新的8位陣列,doprocessblock函式如下:def dofinalize(new_words):
un = '''
function(t)
'''result1 = js2py.eval_js(un)(new_words)
return result1
**裡的s其實就是get_words函式裡那個s,修改get_words函式中js**的返回值即可。def doprocessblock(e, t, words):
un = '''
function(e, t, words, s)
var v = n & i ^ n & a ^ i & a,
g = (n << 30 | n >>> 2) ^ (n << 19 | n >>> 13) ^ (n << 10 | n >>> 22),
_ = d + ((f << 26 | f >>> 6) ^ (f << 21 | f >>> 11) ^ (f << 7 | f >>> 25)) + (f & h ^ ~f & u) + s[l] + c[l];
d = u,
u = h,
h = f,
f = o + _ | 0,
o = a,
a = i,
i = n,
n = _ + (g + v) | 0
}r[0] = r[0] + n | 0,
r[1] = r[1] + i | 0,
r[2] = r[2] + a | 0,
r[3] = r[3] + o | 0,
r[4] = r[4] + f | 0,
r[5] = r[5] + h | 0,
r[6] = r[6] + u | 0,
r[7] = r[7] + d | 0
return r;
}'''
s = get_s()
result = js2py.eval_js(un)(e, t, words, s)
return result
使用得到新的8位陣列,就能獲取最後的signature引數的值了:
以上,就是整個逆向過程。def get_str(l, count):
un = '''
function(words, sigbytes)
return n.join("")
}'''
count = 32
return js2py.eval_js(un)(l, count)
最後說一下為什麼好笑,因為對js還是了解的不深,所以經過了漫長的除錯才獲取到最後的signature引數。但實際上對js足夠了解的人,或者js逆向經驗老到的人,看到signature引數的值基本就能猜到,signature引數是經過sha256加密後得到。。。。。。
費勁巴累的,最後把人家加密**摳出來才解決問題。。。。。。
記一次安卓逆向過程 思路篇
fiddler4設定 抓包。發現請求存在簽名值,響應內容加密過。直接用apktools逆向得到dex,使用jd gui檢視 請求的簽名演算法不可讀,直接看smail檔案。引數存在對應暫存器中。從上下文找到對應引數順序。摸清請求的構成。相應內容,繼續研究原始碼,發現呼叫so庫進行處理。初步打算將so檔...
記一次oracle 優化過程
可能很多大牛都知道這個方法,但我是頭回遇到,因為專案原因,要寫很多查詢sql,對速度有要求,所以很注重sql語句的優化。像使用left join 速度會快一些等等一些算是比較常見的方法吧。近兩天做自測時發現了乙個問題,同樣一條語句,加了乙個條件竟然速度慢了那麼多,本身是乙個求彙總的sql語句,查全部...
記一次SAP缺料過程
委外訂單乙個子件需求 100個 發料100個,委外庫存100個 刪除委外子件,不能消耗 委外 商家一直是100個。因為廠內和委外是乙個mrp範圍。因此沒有購買需求 導致 廠內缺料,商家也沒庫存 原因分析 為什麼刪除子件,是換料了 商家沒有退回,還是真的誤操刪了,需要了解實際情況 分析2 3月份發現這...