bilibili 登录密码逆向分析

哔哩哔哩在登录时,参数如下:

今天主要对password密文进行逆向剖析:

插桩

t 为输入的明文密码

i = e.sent,
a = i.JSEncrypt,
c = new a
c.setPublicKey(o.data.key) 

用于实现 RSA 加密,这段代码中主要是准备设置公钥以进行加密操作

console下key是多少呢

PublicKey和hash 

key (公钥)
'-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjb4V7EidX/ym28t2ybo0U6t0n\n6p4ej8VjqKHg100va6jkNbNTrLQqMCQCAYtXMXXp2Fwkk6WR+12N9zknLjf+C9sx\n/+l48mjUU8RqahiFD1XT/u2e0m2EN029OhCgkHx3Fc/KlFSIbak93EH/XlYis0w+\nXl69GV6klzgxW6d2xQIDAQAB\n-----END PUBLIC KEY-----\n'


hash (salt)
'1c5346622adfd989'

Encrypt

加密的参数:hash + t ;即hash拼接输入的密码

1c5346622adfd989111111

继续跟栈c.enrypt

  

webpack代码

(("undefined" !== typeof self ? self : this)["webpackJsonpminiLogin"] = ("undefined" !== typeof self ? self : this)["webpackJsonpminiLogin"] || []).push([[1], {
    ....代码
    "24e5":function(){
    }
}]);

webpackJsonpminiLogin这几个字就明显的告知这是一个webpack文件 ,webpack文件相当于来说就不要去扣算法了(对于强迫症的我的确很难受),那么对文件进行改造一下。

构建webpack

const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
window = dom.window;
self = window;
_global = this;
!function(s) {
    "use strict";
    var u = {}
    function l(e) {
        var a = u[e];
        if (void 0 !== a)
            return a.exports;
        var c = u[e] = {
            id: e,
            loaded: !1,
            exports: {}
        };
        // console.log(e);
        return s[e].call(c.exports, c, c.exports, l),
        c.loaded = !0,
        c.exports
    }
    _global = l;
}({
    "24e5":function(){
        ...完整代码
    }
})

copy下来,直接run!!不出意外的出现了意外,提示navigator is not defined,看来webpack文件获取了浏览器环境,对于大厂来说这很常见。

 

navigator = {
    "appCodeName": "Mozilla",
    "appName": "Netscape",
    "appVersion": "5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"
}

具体的navigator参数还需要自己去conole打印

再次运行:

 

看到没有报错了,已经解决了99%的问题,webpack环境就补完整了,接下来就需要模拟构造

猜想验证

s = new _global("24e5")["JSEncrypt"]['prototype']
s.setPublicKey(data.key)
password = "111111"
encrypt_str = data.hash + password
console.log(s.encrypt(encrypt_str))
PS:
new _global("24e5")["JSEncrypt"]['prototype']  === 原代码中的a
c =  new a在这里我用 s = new _global("24e5")["JSEncrypt"]['prototype']

算法结果

 

conole结果

 

具体为啥结果不一样呢。大概率是有时间戳参与了运算,搜索关键词date,好家伙33个搜索结果。

for example

this.localDateToUTC = function(t) {
    return utc = t.getTime() + 6e4 * t.getTimezoneOffset(),
    new Date(utc)
}

分析到此结束 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值