【JS 逆向百例】某易支付密碼 MD5+AES 加密分析


關注微信公眾號:K哥爬蟲,持續分享爬蟲進階、JS/安卓逆向等技術干貨!

聲明

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

逆向目標

  • 目標:某易支付密碼加密
  • 主頁:aHR0cHM6Ly9lcGF5LjE2My5jb20vaDVDYXNoaWVyL2JlZm9yZS12YWxpZGF0aW9u
  • 接口:aHR0cHM6Ly9lcGF5LjE2My5jb20vY2FzaGllci9tL3NlY3VyaXR5L3ZlcmlmeVBheUl0ZW1z
  • 逆向參數:Form Data:"shortPayPassword":"ZY4iJQkXwvhMwlw2hvpZQ9T%2Fc1S7wRfcfQrpe6bmnlA3hy5PJTJqeYY%2Bj372D70i"

逆向過程

本期逆向素材來源於K哥爬蟲交流群里某位群友的求助:

01.png

抓包分析

粉絲發來的鏈接是某寶閣平台,一個游戲角色的購買鏈接,購買方式是某易支付,逆向的對象是購買時加密后的支付密碼,需要注意的是要將界面調成手機模式,點擊支付,來到輸入密碼頁面,隨便輸入一個 6 位密碼,點擊確定,抓包到支付密碼是加密后的,如下圖所示:

02.png

03.png

參數逆向

直接搜索關鍵字 shortPayPassword,可以在 common.e94aeed9.js 里找到加密函數,如下圖所示:

04.png

重點就是這句 Object(n.b)(Object(c.MD5)(this.input).toString(), e),依次在 console 打印一下各個部分,觀察其含義。

  • (this.input).toString():明文密碼;
  • e:一串字符串,前后找不到其生成的地方,可以直接搜索一下這個字符串,發現是通過一個接口返回的 peEnSeed 值;
  • Object(c.MD5):一個方法,看名字就知道是 MD5,將密碼傳進去得到的結果確實是 MD5;
  • Object(n.b):是一個 s 方法,需要進一步跟進分析。

05.png

06.png

總的來說就是密碼的 MD5 值和 e 的值,一起傳入到 s 方法里,繼續往后跟,看看 s 函數,如下圖所示:

07.png

很明顯的 AES 加密了,密碼的 MD5 值是待加密對象,peEnSeed 是 key,iv 偏移量是 0123456789012345,最后的加密結果還經過了一次 URL 編碼,可以直接引入 crypto-js 加密包,傳入對應的值即可,代碼如下所示:

// 引用 crypto-js 加密模塊
var CryptoJS = require('crypto-js')

function getEncryptedPassword(password, peEnSeed) {
    var pwd = CryptoJS.enc.Utf8.parse(CryptoJS.MD5(password));
    var key = CryptoJS.enc.Utf8.parse(peEnSeed);
    var iv = CryptoJS.enc.Utf8.parse("0123456789012345");
    var encrypted = CryptoJS.AES.encrypt(pwd, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });

    return pwd ? key ? encodeURIComponent(encrypted.toString()) : pwd : ""
}

// 測試樣例
var password = "123456"
var peEnSeed = "2F63CCD861E4397F1C2181006904BAB2"
console.log(getEncryptedPassword(password, peEnSeed))

// ZY4iJQkXwvhMwlw2hvpZQ9T%2Fc1S7wRfcfQrpe6bmnlA3hy5PJTJqeYY%2Bj372D70i


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM