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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

个人总结 – JS逆向解析[通俗易懂]

發(fā)布時(shí)間:2023/12/19 综合教程 27 生活家
生活随笔 收集整理的這篇文章主要介紹了 个人总结 – JS逆向解析[通俗易懂] 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目前加密的方式總結(jié)有下面幾點(diǎn):

  1. 對(duì)稱加密(加密解密密鑰相同):DES、DES3、AES

  2. 非對(duì)稱加密(分公鑰私鑰):RSA

  3. 信息摘要算法/簽名算法:MD5、HMAC、SHA

  4. 前端實(shí)際使用中MD5、AES、RSA,自定義加密函數(shù)使用頻率是最高的

  5. 幾種加密方式配合次序:采用非對(duì)稱加密算法管理對(duì)稱算法的密鑰,然后用對(duì)稱加密算法加密數(shù)據(jù),用簽名算法生成非對(duì)稱加密的摘要

  6. DES、DES3、AES、RSA、MD5、SHA、HMAC傳入的消息或者密鑰都是bytes數(shù)據(jù)類型,不是bytes數(shù)據(jù)類型的需要先轉(zhuǎn)換;密鑰一般是8的倍數(shù)

  7. Python實(shí)現(xiàn)RSA中,在rsa庫中帶有生成簽名和校對(duì)簽名的方法

  8. 安全性:DES<DES3=AES<RSA,至于MD5、SHA、HMAC不好說了

搜其他關(guān)鍵詞如RSA、encrypt,尤其是encrypt

其中this.exponent是RSA加密偏移量 ,數(shù)值一般在HTML文件里面,全局搜索,其value值就是

密鑰的值一般在網(wǎng)頁源碼的一個(gè)元素值。全局搜索,其value值就是,或者是js中找到


AES:案例ewt360.com

AES是典型的對(duì)稱加密,密鑰就在前端源碼里,相對(duì)于非對(duì)稱的RSA安全性很低

var com_str = {
         _KEY: "20171109124536982017110912453698",//32位
         _IV: "2017110912453698",//16位
         *str:需要加密的字符串
         Encrypt: function (str) {
             var key = CryptoJS.enc.Utf8.parse(this._KEY);
             var iv = CryptoJS.enc.Utf8.parse(this._IV);
             var encrypted = '';
             var srcs = CryptoJS.enc.Utf8.parse(str);
             encrypted = CryptoJS.AES.encrypt(srcs, key, {
                 iv: iv,
                 mode: CryptoJS.mode.CBC,
                 padding: CryptoJS.pad.Pkcs7
             });
             return encrypted.ciphertext.toString();
         },
     }

此處還調(diào)用了CryptoJS,它是加密的核心類,但發(fā)現(xiàn)沒有,其實(shí)是藏在另外一個(gè)js文件中,找到并復(fù)制出來,將兩個(gè)js合并即可


自定義加密:空中網(wǎng)

這個(gè)網(wǎng)站是以get方式登陸的,由一個(gè)eval加密的js

function encrypt ()
this.encrypt(pwd, this.j_data["dc"])

加密原理:在打開網(wǎng)站的時(shí)候服務(wù)器會(huì)返回一串字符串,用于加密,加密的js是通過eval方式處理的

js混淆:就是把其中的變量、方法位置順序打亂,但是又用一些無關(guān)的變量或者方法來保證執(zhí)行順序

解決方法:復(fù)制完整的混淆代碼去js混淆還原網(wǎng)站還原。

注意:很多時(shí)候,js代碼的生成函數(shù)都進(jìn)行了偽裝,核心的東西只有一句,但有一堆混淆視聽的js,只需要找到核心代碼,進(jìn)行解析就行


eval加密:

eval()方法:js中的eval()方法就是一個(gè)js語言的執(zhí)行器,它能把其中的參數(shù)按照J(rèn)avaScript語法進(jìn)行解析并執(zhí)行,簡單來說就是把原本的js代碼變成了eval的參數(shù),變成參數(shù)后代碼就成了字符串,其中的一些字符就會(huì)被按照特定格式“編碼” 。

例如下:

eval(function(p,a,c,k,e,d){e=function(c)
{return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?
String.fromCharCode(c+29):c.toString(36))};
if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return 
d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new 
RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('5 4="粘貼要加密/解密的3代碼到這里";2(0==0){  
1(4);}',62,6,'1|alert|if|javascript|showmsg|var'.split('|'),0,{}))

解決方法:將代碼字符串放入javascript Eval官網(wǎng)解密

再看eval解密后的js文件尾部,有下面一個(gè)函數(shù)

function encryptString(str, e, m) {
    var key = RSAUtils.getKeyPair(e, '', m);
    return RSAUtils.encryptedString(key, str)
}

發(fā)現(xiàn)是RSA加密方式,那現(xiàn)在從RSA加密逆向搜索encryptString關(guān)鍵詞 ,找到下面

var timesign = (new Date).getTime() + timespan;
     $("#p1User").val(encryptString(timesign + encodeURIComponent($("#passwordUser").val()), $("#rsaExponent").val(), $("#rsaModulus").val()));
     $("#password_value").val($("#passwordUser").val());
     $("#btnSubmitUser").val("登錄中...");
     $("#usernameUser").addClass("fontcolor_cccUser").attr("readonly", "readonly");
     $("#passwordUser").val("").addClass("fontcolor_cccUser").attr("readonly", "readonly");

篩選核心代碼

encryptString(timesign + encodeURIComponent($("#passwordUser").val()),$("#rsaExponent").val(), $("#rsaModulus").val());

(“#passwordUser”).val(),rsaExponent”).val(), $(“#rsaModulus”).val()

這三個(gè)參數(shù)分別是從頁面獲取id,去html搜索這三個(gè)關(guān)鍵詞

rsaExponent 看到value為01001,故此RSA加密偏移量為01001

rsaModulus 也是看到value為一群亂碼,它是RSA密鑰


用戶認(rèn)證的話會(huì)涉及到cookie

解決方法:查看cookie數(shù)據(jù),找到經(jīng)過例如:fingerprint進(jìn)行URL解碼,對(duì)比請(qǐng)求參數(shù)fingerprint修改


那么,逆向解密解決思路呢?

逆向解密解決思路:

(1)是根據(jù)加密參數(shù),如“x-uab”關(guān)鍵字在所有關(guān)鍵中查找

  1. 打開chrome瀏覽器 按F12

  2. 找到點(diǎn)擊source中 按ctrl + shift + F快捷鍵 ,輸入x-uab找到j(luò)s代碼

  3. 接下來,打個(gè)斷點(diǎn)調(diào)試一下:在數(shù)字那里點(diǎn)一下,數(shù)字位置出現(xiàn)藍(lán)點(diǎn),表示添加斷點(diǎn)成功

  4. 然后刷新獲取店鋪列表的頁面,程序會(huì)在斷點(diǎn)處停下,在控制臺(tái)調(diào)試o.getUA()函數(shù),看一下輸出

  5. 繼續(xù)向下查看這個(gè)關(guān)鍵詞參數(shù) js 生成函數(shù)的引用,一步步往回推,找到最原始的 js 生成方法

  6. 找到以后,把這個(gè)function 方法全部代碼取出來,另存為一個(gè)js文件。

(2)怎么用python執(zhí)行js腳本?

方法一:

? 自己搞懂生成的過程,是md5還是AES加密,找到key值,時(shí)間戳其余參數(shù)啥的也可以生成,做過后臺(tái)開發(fā)的會(huì)比較清楚其生成原理,因?yàn)樾枰獙?duì)接前后端接口

方法二:execjs

因?yàn)樵谏厦鎻?fù)制出來的腳本中,只單單定義了一個(gè)方法,并沒有調(diào)用這個(gè)方法,所以,要在js文件的末尾添加一些代碼來調(diào)用

function getParam() {
 var a;
 var param = e(2,a);
 return param
};

然后,開始擼Python代碼吧

原理:將execjs的引擎換成PhantomJS這個(gè)無頭瀏覽器,換句話說就是用PhantomJS來執(zhí)行js腳本,PhantomJS是一個(gè)瀏覽器,自然就會(huì)創(chuàng)建window對(duì)象。

import execjs
  
import os
os.environ["EXECJS_RUNTIME"] = "PhantomJS"
node = execjs.get()
file = 'eleme.js'
ctx = node.compile(open(file).read())
js_encode = 'getParam()'
params = ctx.eval(js_encode)
print(params)

不用PhantomJS方法

import execjs
  
node = execjs.get()
file = 'eleme.js'
ctx = node.compile(open(file).read())
js_encode = 'getParam()'
params = ctx.eval(js_encode)
print(params)

可能會(huì)報(bào)錯(cuò):execjs._exceptions.ProgramError: TypeError: 'window' 未定義
原因:window對(duì)象估計(jì)是瀏覽器打開是創(chuàng)建的,蘊(yùn)含瀏覽器的信息,所以用Python來執(zhí)行這段代碼時(shí),沒有這個(gè)對(duì)象

方法三:

思路和方案二類似,不過更加粗暴一些。因?yàn)闆]在瀏覽器執(zhí)行,那就模擬瀏覽器來執(zhí)行。

在執(zhí)行之前,同樣要修改js腳本,在js文件末尾調(diào)用e方法,添加如下代碼,例:

var a;
var param = e(2,a);
return param;

注意:調(diào)用方法不要放在任何函數(shù)里面,我之前就是因?yàn)閷⑦@段代碼放在函數(shù)里頭強(qiáng)制執(zhí)行,導(dǎo)致的結(jié)果就是在瀏覽器里可以獲取加密字符串,但是在Python中獲取到的卻是None

模擬瀏覽器用的selenium和chrome的webDriver,代碼如下:

from selenium import webdriver
  
browser = webdriver.Chrome(executable_path='chromedriver.exe')
with open('eleme.js', 'r') as f:
     js = f.read()
print(browser.execute_script(js))

最終獲得加密之后的字符串

最后,有必要說一下,如果需要獲取大量的x-uab,采用方案三效率會(huì)高一下,因?yàn)椴捎梅桨付脑挘梢宰源蜷_一個(gè)瀏覽器(都調(diào)用一個(gè)webdriver對(duì)象),然后快速執(zhí)行js,返回加密字符串。


文章有點(diǎn)亂,是之前自己做過的一些筆記,主要用來記錄自己的一些理解

總結(jié)

以上是生活随笔為你收集整理的个人总结 &#8211; JS逆向解析[通俗易懂]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。