日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

【JS 逆向百例】元素ID定位加密位置,某麻将数据逆向

發布時間:2023/12/10 javascript 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【JS 逆向百例】元素ID定位加密位置,某麻将数据逆向 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 聲明
    • 逆向目標
    • 逆向過程
      • 抓包分析
      • 加密逆向
    • 完整代碼
      • 關鍵 JS 加密代碼架構
      • Python 代碼


聲明

本文章中所有內容僅供學習交流,抓包內容、敏感網址、數據接口均已做脫敏處理,嚴禁用于商業用途和非法用途,否則由此產生的一切后果均與作者無關,若有侵權,請聯系我立即刪除!

逆向目標

  • 目標:某在線麻將游戲的網頁數據
  • 主頁:aHR0cHM6Ly90ZW5ob3UubmV0LzIvP3E9MzM2bTIzN3AyNDc5czE2N3ozcw==

逆向過程

抓包分析

本次要逆向的對象于以往不同,不是某個接口的參數,而是網頁中的數據,一般網頁中的數據都可以在源碼中看到,或者通過某個接口傳過來,而本次的目標數據是通過 JS 加密得到的,先來抓包看看基本情況:

F12 檢查,可以看到我們要的數據在 textarea 標簽里面,看起來沒什么毛病,那么直接使用 Xpath 提取試試看:

import requests from lxml import etreeurl = '脫敏處理,完整代碼關注 GitHub:https://github.com/kgepachong/crawler' headers = {'sec-ch-ua': '"Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36' }response = requests.get(url=url, headers=headers) tree = etree.HTML(response.text) data = tree.xpath('//textarea/text()') print(data)

可以看到實際上提取到的數據是為空的,我們查看網頁源代碼,直接搜索 textarea,同樣也是沒有的,試試直接搜索數據也是沒有的:

加密逆向

既然這種數據不存在于網頁源碼中,也不是通過其他接口返回的,那么最有可能就是通過 JS 加密后直接插入到網頁源碼中的,那么這里應該如何定位加密的位置呢?對比一下插入數據后的網頁源碼和未插入數據的網頁源碼,可以看到藍色框里的代碼都是通過 JS 插入的,而且這個 1008.js 多半就是加密的 JS 文件:

這里我們想到一個 JavaScript 語法,如需從 JavaScript 訪問某個 HTML 元素,可以使用 document.getElementById(id) 方法,這個 id 就是某個 HTML 元素的屬性,然后使用 innerHTML 來獲取或插入元素內容,可以看菜鳥教程的一個例子:

通過這種語法,結合前面源碼中的幾個標簽,我們就可以猜測,某個 JS 里面可能會存在這樣的語句:document.getElementById("tehai").innerHTML、document.getElementById("tips").innerHTML、document.getElementById("m2").innerHTML,直接全局搜索其中任意一個語句,就可以在 1008.js 里面找到對應的結果,當然直接搜索這個標簽的 id 也是可以找到結果的,埋下斷點進行調試:

可以發現第 913 行 document.getElementById("m2").innerHTML = d + "<br>" 是向 m2 標簽里面插入值 d 和換行符,一步一步往上看,可以發現 d 包含了很多 html 的東西,而上面的 g 只有文本,剛好是目標數據,那么我們最終返回直接 return 這個 g 就好了。

繼續往上跟蹤 g 的值的來源,會發現步驟比較復雜,那么我們直接將這部分函數(fa 函數)整個復制下來運行調試(大約第 794 行至第 914 行), 本地進行調試會提示 ga 和 O 未定義,我們在其定義的語句的下一行埋下斷點進行調試,可以看到 ga 的值其實是固定的 q,O 就是 URL 后面 q 的值,如:336m237p2479s167z3s

將這兩個變量進行定義后,接著本地調試,又會提示 aa、ca 等函數未定義,依賴的函數比較多,那么這種情況下就沒必要去挨個扣,直接將 fa 以前的所有函數都 copy 下來進行調試即可,這樣就直接解決了所有依賴。

完整代碼

GitHub 關注 K 哥爬蟲,持續分享爬蟲相關代碼!歡迎 star !https://github.com/kgepachong/

以下只演示部分關鍵代碼,完整代碼倉庫地址:https://github.com/kgepachong/crawler/

關鍵 JS 加密代碼架構

// Copyrights C-EGG inc.var u = function () {}();function w() {}w.prototype = {};function x(b, a, g, d) {}// 此處省略 N 個函數function M(b) {}function N(b, a) {}function ea(b) {}function fa(O) {function b(a, b) {var c, d = 0;for (c = 0; c < a.length; ++c) d += 4 - b[a[c]];return d}// var a = ga, g = O, d;var a = 'q', g = O, d;d = "<hr size=1 color=#CCCCCC >";switch (a.substr(0, 1)) {case "q":d += '標準形(七対國士を含む)の計算結果 / <a href="?p' + a.substr(1) + "=" + g + '">一般形</a><br>';break;case "p":d += '一般形(七対國士を含まない)の計算結果 / <a href="?q' + a.substr(1) + "=" + g + '">標準形</a><br>'}for (var c = "d" == a.substr(1, 1), a = a.substr(0, 1), g = g.replace(/(\d)(\d{0,8})(\d{0,8})(\d{0,8})(\d{0,8})(\d{0,8})(\d{0,8})(\d{8})(m|p|s|z)/g, "$1$9$2$9$3$9$4$9$5$9$6$9$7$9$8$9").replace(/(\d?)(\d?)(\d?)(\d?)(\d?)(\d?)(\d)(\d)(m|p|s|z)/g, "$1$9$2$9$3$9$4$9$5$9$6$9$7$9$8$9").replace(/(m|p|s|z)(m|p|s|z)+/g, "$1").replace(/^[^\d]/, ""), g = g.substr(0, 28), f = aa(g), r = -1; r = Math.floor(136 * Math.random()), f[r];) ;var m = Math.floor(g.length / 2) % 3;2 == m || c || (f[r] = 1, g += H(r));var f = ca(f),n = "",e = G(f, 34),n = n + N(e, 28 == g.length),n = n + ("(" + Math.floor(g.length / 2) + "枚)");-1 == e[0] && (n += ' / <a href="?" >新しい手牌を作成</a>');var n = n + "<br/>",q = "q" == a ? e[0] : e[1],k,p,l = Array(35);if (0 == q && 1 == m && c) k = 34,l[k] = K(f),l[k].length && (l[k] = {i: k,n: b(l[k], f),c: l[k]});else if (0 >= q) for (k = 0; 34 > k; ++k) f[k] && (f[k]--, l[k] = K(f), f[k]++, l[k].length && (l[k] = {i: k,n: b(l[k], f),c: l[k]}));else if (2 == m || 1 == m && !c) for (k = 0; 34 > k; ++k) {if (f[k]) {f[k]--;l[k] = [];for (p = 0; 34 > p; ++p) k == p || 4 <= f[p] || (f[p]++, F(f, "p" == a) == q - 1 && l[k].push(p), f[p]--);f[k]++;l[k].length && (l[k] = {i: k,n: b(l[k], f),c: l[k]})}} else {k = 34;l[k] = [];for (p = 0; 34 > p; ++p) 4 <= f[p] || (f[p]++, F(f, "p" == a) == q - 1 && l[k].push(p), f[p]--);l[k].length && (l[k] = {i: k,n: b(l[k], f),c: l[k]})}var t = [];for (k = 0; k < g.length; k += 2) {p = g.substr(k, 2);var v = ba(p),h = J(g.replace(p, "").replace(/(\d)(m|p|s|z)/g, "$2$1$1,").replace(/00/g, "50").split(",").sort().join("").replace(/(m|p|s|z)\d(\d)/g, "$2$1")),R = q + 1,I = l[v];I && I.n && (R = -1 == q ? 0 : q, void 0 == I.q && t.push(I), I.q = h);2 == m && (h += H(r));n += (2 == m || 2 != m && !c ? da : L)(p, 2 == k % 3 && k == g.length - 2 ? " hspace=3 " : "", a, h, v, R)}l[34] && l[34].n && (l[34].q = J(g), t.push(l[34]), n += '<br><br><a href="?' + a + "=" + l[34].q + '">次のツモをランダムに追加</a>');t.sort(function (a, b) {return b.n - a.n});// g = "" + (document.f.q.value + "\n");g = "" + (O + "\n");d += "<table cellpadding=2 cellspacing=0 >";q = 0 >= q ? "待ち" : "摸";for (k = 0; k < t.length; ++k) {v = t[k].i;d += "<tr id=mda" + v + " ><td>";34 > v && (d += "打</td><td>" + ('<img src="https://cdn.tenhou.net/2/a/' + H(4 * v + 1) + '.gif" class=D />') + "</td><td>", g += "打" + H(4 * v + 1) + " ");d += q + "[</td><td>";g += q + "[";l = t[k].c;c = t[k].q;for (p = 0; p < l.length; ++p) r = H(4 * l[p] + 1),d += '<a href="?' + a + "=" + (c + r) + '" class=D οnmοuseοver="daFocus(this,' + v + ');" οnmοuseοut="daUnfocus();"><img src="https://cdn.tenhou.net/2/a/' + r + '.gif" border=0 /></a>',g += H(4 * l[p] + 1);d += "</td><td>" + t[k].n + "枚</td><td>]</td></tr>";g += " " + t[k].n + "枚]\n"}d = d + "</table><br><hr><br>" + ('<textarea rows=10 style="width:100%;font-size:75%;">' + g + "</textarea>");-1 == e[0] && (d = d + "<hr size=1 color=#CCCCCC >" + ea(f));// document.getElementById("tehai").innerHTML = n;// document.getElementById("tips").innerHTML = "";// document.getElementById("m2").innerHTML = d + "<br>"return g }// 測試樣例 // console.log(fa('336m237p2479s167z3s'))

Python 代碼

#!/usr/bin/env python3 # -*- coding: utf-8 -*-import execjsurl = '脫敏處理,完整代碼關注 GitHub:https://github.com/kgepachong/crawler'def main():q = url.split('=')[1]with open('decrypt.js', 'r', encoding='utf-8') as f:decrypt_js = f.read()data = execjs.compile(decrypt_js).call('fa', q)print(data)if __name__ == '__main__':main()

總結

以上是生活随笔為你收集整理的【JS 逆向百例】元素ID定位加密位置,某麻将数据逆向的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。