什么是jsvmp
jsvmp就是將js源代碼首先編譯為自定義的字節(jié)碼,只有對應(yīng)的解釋器才能執(zhí)行這種字節(jié)碼,這是一種前端代碼虛擬化保護技術(shù)。
整體架構(gòu)流程是服務(wù)器端通過對JavaScript代碼詞法分析 -> 語法分析 -> 語法樹->生成AST->生成私有指令->生成對應(yīng)私有解釋器,將私有指令加密與私有解釋器發(fā)送給瀏覽器,就開始一邊解釋,一邊執(zhí)行。
這些都不重要,只要知道有這么個技術(shù)就行了。jsvmp有一個特性,加密結(jié)果是一個一個字符生成的,要想一個個生成肯定需要循環(huán),那無非就是for循環(huán)或者while循環(huán)以及switch case。這一點至關(guān)重要,算法的分析還原就依賴這個特性。
定位關(guān)鍵點
全局搜索關(guān)鍵字“X-s”,定位到main.***.js,這個js文件中會有多處生成x-s的地方,全部打上斷點,最終會定位到 c = (a || void 0 !== window._webmsxyw ? window._webmsxyw : sign)(u, i) || {};,只有這行代碼被調(diào)用并且生成了x-s,其它的幾處都是原來的老版本已經(jīng)廢棄了。
log插樁
在斷點處單步調(diào)試就會進入到j(luò)svmp,把這個js文件保存到本地并用v_jstools進行ast混淆解密,選擇僅變量壓縮,壓縮變量后替換原來的代碼。
還記得我前面說過的jsvmp的特性嗎?如果你還記得那將會為你節(jié)省大量時間,這個時候如果去盲目的動態(tài)調(diào)試你就會進入一個迷宮永遠走不出來,正確做法就是直接在js文件中尋找循環(huán)的位置。
144行到164行有兩個while循環(huán),在這兩個循環(huán)里面添加日志點,144-150這個while循環(huán)會無限執(zhí)行,32g內(nèi)存都能撐爆,暫時不管這個循環(huán),在161行位置插入日志"h:",JSON.stringify(h[0]),"C:",C,"H:",H
,運行結(jié)果如下圖。
分析日志可知,當(dāng)C==781的時候x-s已經(jīng)生成,但具體生成步驟日志里并沒有,那就在160行插入條件斷點C==780&&H[0]==31&&H[1]==3&&H[2]==83&&H[3]==1&&H[4]==0
,并且把所有進行過運算的方法里都插入日志點,比如185行"%","左:",r(A, B),"右:",r(E, Q)
,203行"|","左:",r(A, B),"右:",r(E, Q)
等,142行特別重要"h3:",JSON.stringify(h[0]),"A:",A,"B:",B
,這個日志點一定要打上。日志點打好之后先停用斷點,只保留160行的條件斷點,然后繼續(xù)執(zhí)行,再次斷在160行。
清空控制臺日志信息,啟用所有斷點(263行的斷點停用,這個方法就是拼接字符串),繼續(xù)執(zhí)行代碼,執(zhí)行完畢后將日志保存到本地。
日志分析
notepad打開日志,拉到最底下,復(fù)制X-s前面一小部分,全局搜索,全詞匹配,然后全部標(biāo)記。
仔細觀察下圖中標(biāo)紅的位置,會發(fā)現(xiàn)明顯規(guī)律,“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=”是固定的,這個時候就可以大膽猜測了,它可能是調(diào)用了字符串的charAt方法,傳入?yún)?shù)就是下方的數(shù)字,返回一個字符,然后依次將字符拼接。
控制臺驗證一下,果然如此。
接下來就得找出13、19、0、34這四個數(shù)字怎么來的,往上翻看日志,找到了可疑之處,這里出現(xiàn)了一些位移計算,也生成了上一步需要的數(shù)字。
控制臺驗證一下,經(jīng)過反復(fù)驗證得知,13 = 53 >> 2,19 =((53&3)<<4)|(48>>4),0 = ((48&15)<<2)|(34>>6),34 = 34&63,而且加粗的數(shù)字是固定的,那么下一步就是要確定53,48,34的生成邏輯。
接著往上翻看日志,又找到可疑之處,一個json字符串"{\"signSvn\":\"50\",\"signType\":\"x1\",\"appId\":\"xhs-pc-web\",\"signVersion\":\"1\",\"payload\":\"5c401130ca247f32ba75cbf05e0e58476fd112ed52f233f67fce4c61c5bc93dfc25b0c6065eda2f639a922d4481a611116e2e3bfb89e2da1dad61c5041d6ac2bdad61c5041d6ac2bba1c4fcc5520a3e3f9f6b953ff819f7c4d3964d610405efa8a7e6e067da7404c0381f161cf3a5952aefd4645c665dc827a83a6069b97009fd07c9b6d6913acbc9074093d7367e83ad4cdc39c2b950152b2ef9cd5fbe10084ffcb49de03a9400d0a36d7b01017de7dfffbe9b83b736a194ddc12db02f7193f\"}"
數(shù)字12、13、14有規(guī)律的增長,也生成了上一步需要的數(shù)字53,48,34,還有三字符’5’、‘0’,‘"’,這三個字符像是從json字符串里面取出來的,12、13、14分別是索引,然后調(diào)用’5’.charCodeAt(),‘0’.charCodeAt(),‘"’.charCodeAt()??刂婆_驗證一下猜想,果然如此。文章來源:http://www.zghlxwxcb.cn/news/detail-460504.html
代碼還原
經(jīng)過上面幾個步驟分析,大致生成邏輯已經(jīng)捋清楚,除了json字符串里面的payload還沒還原外,其它的步驟都已還原,并對比了瀏覽器和代碼生成的結(jié)果,是一致的,完整代碼如下,下一篇文章將分析payload的還原過程。文章來源地址http://www.zghlxwxcb.cn/news/detail-460504.html
var str1 = "{\"signSvn\":\"50\",\"signType\":\"x1\",\"appId\":\"xhs-pc-web\",\"signVersion\":\"1\",\"payload\":\"16e0c0c108d9481f25fa55e5d0b68ca2a3754a5a6fd39af8945de60083f572f85fbf196a7df36325df512bc23f13ef9616e2e3bfb89e2da1dad61c5041d6ac2bdad61c5041d6ac2bba1c4fcc5520a3e3f9f6b953ff819f7c4d3964d610405efa8a7e6e067da7404c0381f161cf3a5952aefd4645c665dc827a83a6069b97009fd07c9b6d6913acbc9074093d7367e83ad4cdc39c2b950152b2ef9cd5fbe10084ffcb49de03a9400d0a36d7b01017de7daaeec9560d5a42f0e8cf56bde5e4d9b8\"}";
var str2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var data = "XYW_";
var arr1 = []
for (var i = 0; i < str1.length; i++){
var code = str1[i].charCodeAt();
arr1.push(code)
}
var arr3 = [];
for(var i = 0; i< arr1.length; i += 3){
arr3.push(arr1.slice(i, i + 3));
}
for (var i = 0; i < arr3.length; i++){
var arr = arr3[i];
var arg1 = move_r(arr[0],2);
var arg2 = move_l(arr[0]&3,4) | move_r(arr[1],4);
var arg3 = move_l(arr[1]&15,2) | move_r(arr[2],6)
get_data([arg1,arg2,arg3,arr[2]&63])
}
function move_r(l,r){
return l >> r;
}
function move_l(l,r){
return l << r;
}
function get_data(arr){
for (var i = 0; i < arr.length; i++){
var code = arr[i];
var result = str2.charAt(code);
data += result;
}
}
console.log(data)
到了這里,關(guān)于jsvmp逆向?qū)崙?zhàn)x-s、x-t算法還原的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!