网址:aHR0cHM6Ly9mdXd1Lm5oc2EuZ292LmNuLw==/(ㄒoㄒ)/~~哎呀这个老烦人了,我明明参数都解决了,就是不给通过,我寻思着算法应该没问题啊。等大佬来解惑。可以看到需要分析 x-tif-signature、signData、encData1.x-tif-signature的话直接就能搞定了。测试过了是原生的sha256.2.signData也在这个f函数内部被赋值,往下断点。这是未进入 t.data.signData 函数内部的t值{ "transformRequest": {}, "transformResponse": {}, "timeout": 30000, "xsrfCookieName": "XSRF-TOKEN", "xsrfHeaderName": "X-XSRF-TOKEN", "maxContentLength": -1,
有这么一种网站,访问请求会发送三次,第三次才能返回响应结果,并且前两次返回521状态码,那么这个网站就是采用了加速乐Cookie反爬。首先看第一次请求,响应的是一段js代码,这段js代码执行后是设置cookie的。然后是第二次请求,响应的也是段js,这段js是设置第二次的cookie的(__jsluid_s由第一次访问url后服务器那边返回设置的)。第二次的请求需要携带第一次请求返回js执行后设置的cookie。即__jsl_clearance_s为第一次返回内容js执行后的结果。第三次请求,变的只有__jsl_clearance_s,也就是第二次返回的js执行的一些操作导致cookie的更变。所以我们要逆向的目标就是第二次返回的js内容。把js复制下来然后贴到控制台代码段那里分析因为该代码更改的是cookie,所以我们提前控制台输入hook cookie代码,然后提前下断点。// hook cookie代码 (function () { 'use strict'; var org = document.cookie.__lookupSetter__('cookie')
补环境主要是补DOM和BOM,一些nodejs没有的属性啊之类。关于 Proxy 对象用来补环境是很方便的,例如监听了window对象,那么运行一些混淆的代码,就能判断该方法做了什么改变。当混淆的js想要获取window的某个属性,就可以通过拦截然后输出到控制台,然后我们可以补下来。 const proxy = new Proxy(obj, { get(target, prop) { console.log("方法:Get ||","对象", name, '属性', prop, '值:', target[prop]); return target[prop]; }, set(target, prop, value) { console.log("方法:Set ||","对象", name, '属性', prop, '修改值:',
这是原始请求包:这是处理的json,可以看到默认python处理的会添加空格,我们要保持和原始请求包一样。毕竟有的时候反爬虫可能会检测这些。
本次測試網址。如圖所示,本次分析K參數,先去啓動器找到發送的地方下斷點。發現k值已經生成,那麽就往前調,從堆棧那裏。定位到異步方法,跟進去這個m,進攔截器裏面找request下斷點。發現此時沒有k值生成,因爲t方法還沒有執行。控制臺輸入HOOK代碼,把 e.data hook住。Object.defineProperty(e, 'data', { set(){ debugger } })然後發現hook成功,繼續往上跟於是便找到了k的生成邏輯。跟y.a函數,進入内部把整個函數複製本地,然後運行,修修補補最終發現y.b,然後跟,就會發現是個aes128加密,即對稱加密算法。然後用gpt生成相同邏輯的加密代碼,運行。最終結果對比:aes的參數在login頁面有。const crypto = require('crypto'); /** * AES-128-CBC 解密函数 (对应原 h 函数) * @param {string} e - 要解密的hex字符串 * @param {string} n - 密钥(utf8字符串) * @param {s
地址請求頭的X-sign需要逆向,斷點后找到 r["x-sign"] = s(e, t)e和t參數直接從瀏覽器複製,進入s函數發現返回md5加密值,分析是否為標準md5,上面的if條件為true,所以else語句不用複製到本地。最終測試結果:var crypto = require('crypto'); function md5(password) { var md5 = crypto.createHash('md5'); return md5.update(password).digest('hex'); } function r(e, t) { if (!e.headers || !e.headers["x-platform"]) return t.cid; var n = t.headerEncryptKeys.find(function (t) { return t.name == e.headers["x-platform"] }); return n
跟進去這個u,再跟P發現這個是返回好幾層的函數,例如下面這種找到最外層代碼發現是自執行函數,將其複製到本地運行發現G未定義,把G也複製過去。最終代碼window = global e = window var G = "undefined" !== typeof e ? e : "undefined" !== typeof window ? window : "undefined" !== typeof self ? self : void 0 , Y = function(e) { return e && "undefined" != typeof Symbol && e.constructor === Symbol ? "symbol" : typeof e }; (function() { var e = function(e, t,
測試網址:https://www.megabit.vip/在請求頭中有個Sign參數需要逆向分析,搜索關鍵詞定位。定位到這裏分析,三元表達式,即 true ? 條件成功的分支:條件失敗的分支。這裏最終走的是Object(y.a)((new Date).getTime())const l = (null === (t = e.url) || void 0 === t ? void 0 : t.includes("/pro/u/withdraw/create")) ? C((new Date).getTime()) : Object(y.a)((new Date).getTime())跳轉過去找把這些有用到的複製到本地,這個是webpack形式,那麽就先在n那裏斷點后刷新頁面然後跳進函數把加載器摳出來這個就是加載器,然後本地寫一個自執行函數把加載器放進去,外部生成一個變量用於接收自執行函數内部的加載器函。通過打印輸出分析加載進去的模塊,然後通過瀏覽器扣就好了,用到哪個就將其放到模塊列表即可。 var uu !function (e) { function f(f
這裏headers頭部有個參數需要分析,然後去搜索定位:a.default來自t函數,t又是r的構造函數,複製這個r,把new a.default改成 new r到本地完整逆向代碼:// 导入 Node.js 内置的 crypto 模块 const crypto = require('crypto'); /** * 使用 MD5 对字符串进行哈希加密,返回十六进制字符串。 * @param {string} inputString - 要加密的字符串。 * @returns {string} MD5 哈希的十六进制表示。 */ function md5Encrypt(inputString) { // 1. 创建一个 MD5 哈希对象 const hash = crypto.createHash('md5'); // 2. 更新哈希对象的数据 // inputString 必须是字符串或 Buffer。如果 inputString 是字符串,默认使用 UTF-8 编码。 hash.update(inputString); /
登錄包裏面發現這個pin疑似密碼加密。從啓動器跟蹤發現是rsa加密(我輸入的賬號密碼是相同的)。ok又水一帖~
經過測試,在Post請求包裏面 user 和 hash 需要逆向。以及在headers頭部需要逆向 EUIhash參數:那麽開始分析咯,通過搜索關鍵詞找到這個位置斷點:這段意思是v函數傳入原始密碼后加密最終全部大寫作爲加密後的值。hash: v()(i.password).toUpperCase()進入v函數發現 return n && n.asBytes ? r : n && n.asString ? i.bytesToString(r) : t.bytesToHex(r)最終走的是 t.bytesToHex(r) ,然後e是傳入的密碼,那麽可以先進行測試,我傳入1,最終加密生成c4ca開頭,熟悉的朋友可能想到了,這就是標准的md5加密,沒錯就是這樣。user參數:往上翻就找到了這個位置,看樣子是aes加密。跟進去,EUI也在這裏,總之最後交給gpt來分析與生成代碼。最後是成品:const crypto = require('crypto'); const NodeRSA = require('node-rsa'); function U(Username) { t = {
還是一樣,找m參數的加密算法。m = n[e(528)](btoa, p_s)進入方法 n[e(528)],發現返回值是 return e(t),而e是傳入的 btoa ,t為 p_s ,那麽m算法可以簡化為:m = btoa(p_s)然後找btoa方法,如下複製分析,不停的補就行了。最後可以生成的加密值,但是提示:那麽繼續分析這段js,可以猜想我們的環境出錯了,導致代碼走向錯誤分支。(以下是網頁的這段為true) try { "WhHMm" === i[t(198)] || n.g && c[t(246)](f[t(245)](i.pHtmC(2 & o, 3) | i.evetF(a, 4))) } catch (e) { c[t(246)](f[t(245)](i[t(229)](i.cVCcp(3 & o, 4), a >> 4))) }修改我們的代碼為,去掉這個try,把錯誤分支刪
正常下斷點,發現是個wasm加密,那麽我們可以直接下載這個wasm文件然後調用相關的加密函數。WebAssembly,简称Wasm,是一个低级编程语言。WebAssembly是可移植性的抽象语法树,被设计来提供比JavaScript更快速的编译及执行。WebAssembly将让开发者能运用自己熟悉的编程语言编译,再藉虚拟机引擎在浏览器内执行。它有一种紧凑的二进制格式,使其能够以接近原生性能的速度运行,并且为诸如 C++ 和 Rust 等拥有低级的内存模型语言提供了一个编译目标,以便它们能够在网络上运行。(注意,WebAssembly 有一个在将来支持使用了垃圾回收内存模型的语言的高级目标。)如果是用requests請求這個,記得用wb模式,也就是二進制來寫入。以下代碼可以調用wasm的加密函數 wasmInstance.exports.函數名const fs = require('fs'); async function runWasm() { try { const wasmCode = fs.readFileSync('15.wasm'); // 替换为你的wasm文
這個主要是涉及Cookie加密,通過瀏覽器搜索不到相關的set-cookie字段,後面用抓包就能看到了。請求這個數據必須要包含 yuanrenxue_cookie 這個加密cookie值。主要是第一次請求了頁面返回了個js,這個js執行的cookie添加操作。那麽我的思路是這樣的(python實現):1.通過請求這個url,獲取js的内容2.將這個js作爲一個參數,與 execjs 相結合,也就是在js中定義一個函數,接收js代碼,然後通過eval來執行,那麽就能正常解析出這個cookie值了。3.進行數據請求。import re import execjs import requests sessionid = '你的id' # 获取部分js代码 def get_js(): cookies = { 'sessionid': sessionid } res = requests.get('https://match.yuanrenxue.cn/match/13',cookies=cookies).text jscode = str(re
游戲裏面的類似於血量、陽光都會存放到臨時地址裏面,只有根據基址的偏移才能省事,要不然哦,就會每次進游戲搜尋一次,老煩人了。開始教學:1.首先通過CE搜索到要尋找基址的數值,例如陽光數量2.右鍵生成映射集,作爲參考映射,記得先提前保存這個臨時地址,然後 右鍵選擇 是誰訪問了這個地址,看偏移是f83.退出游戲重新找到陽光地址,然後第二次生成映射集,和第一次的映射集文件不要重名覆蓋。4.然後在這個陽光地址右鍵指針掃描,把偏移啊還有那個第一次保存的陽光地址填入,然後生成的文件,去裏面找基址這是我找到的陽光和元寶的基址參考鏈接