記一次好笑的逆向過程

2021-10-14 17:25:30 字數 3454 閱讀 2039

為什麼說是好笑,看到最後就明白了。

打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:

import time

u = int(time.time()*1000)

獲取引數d:

def get_d():

un = '''

function(t)

return n;}'''

t = 16

return js2py.eval_js(un)(t)

下面的**是還原:[u, d, l, window.couid, e, c, h["type" + e]].sort().join(""),最後得到乙個字元

lis = [u, d, l, couid, e, c, h]

lis = [str(i) for i in lis]

lis.sort()

old = ''.join(lis)

除了u和d引數,其餘引數實際為固定的引數,需要自行逆向獲取。這個old就是前面提到的那一長串字串t

整個加密過程就是對幾個陣列的操作,首先是得到乙個8位初始陣列:

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)()

通過old字串得到16位的陣列1:

def get_new_words(t):

un = '''

function(e) '''

r = js2py.eval_js(un)(t)

return r

通過陣列1得到32位的陣列2:

def dofinalize(new_words):

un = '''

function(t)

'''result1 = js2py.eval_js(un)(new_words)

return result1

使用最開始的8位陣列和32位陣列經過doprocessblock函式得到新的8位陣列,然後使用新的8位陣列和32位陣列又得到乙個新的8位陣列,doprocessblock函式如下:

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

**裡的s其實就是get_words函式裡那個s,修改get_words函式中js**的返回值即可。

使用得到新的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月份發現這...