逆向22-阿儿法编程
本次是对登陆的一个逆向
1. 分析

2. 定位

搜索s: 找到12个,然后断点,在点登陆,会定住

分析上面的代码可知:s是调用了Sha1.hash(r)
首先看看谁调用

由于上面的图片,可以得到
n--->"/WebApi/Users/Login" # 固定值
w--->"username=xxxx&password=11111" # 姓名密码拼接
x--->"DUE$DEHFYE(YRUEHD*&" # 固定值
3. 调度器分析
k = (0, c.default)(n + "?" + w + x);
c.default(n + "?" + w + x)
// 其实就得找到 c 是谁,,,再调用c.default


就看到了-----> 调度器

然后就是扣js了
第一步:先将调度器所在的文件的所有的代码copy走
// loader.js
!function (e) {
function t(t) {
for (var r, i, l = t[0], s = t[1], u = t[2], f = 0, p = []; f < l.length; f++)
i = l[f],
Object.prototype.hasOwnProperty.call(o, i) && o[i] && p.push(o[i][0]),
o[i] = 0;
for (r in s)
Object.prototype.hasOwnProperty.call(s, r) && (e[r] = s[r]);
for (c && c(t); p.length;)
p.shift()();
return a.push.apply(a, u || []),
n()
}
...... //大约几万行
第二步
//env.js
window = global;
第三步
// rukou.js
require("./22env.js")
require("./22loader.js")
console.log(window.loader)
会运行出下面的就说明OK了
[Function: i] {
e: [Function (anonymous)],
m: [
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], <1 empty item>,
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
<1 empty item>, [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)], [Function (anonymous)], [Function (anonymous)],
<1 empty item>, [Function (anonymous)], [Function (anonymous)],
[Function (anonymous)],
... 866 more items
],
c: {},
d: [Function (anonymous)],
r: [Function (anonymous)],
t: [Function (anonymous)],
n: [Function (anonymous)],
o: [Function (anonymous)],
p: 'https://cdn.gitblock.cn/static/',
oe: [Function (anonymous)]
}
那么接下来就是我们使用webpack的时候了
4. 使用webpack

// rukou.js 到目前所有的代码
require("./22env.js")
require("./22loader.js")
// console.log(window.loader)
function p(e) {
return e && e.__esModule ? e : {
default: e
}
}
c = p(window.loader(141))
sign = c.default("/WebApi/Users/Login?username=sss&password=111DUE$DEHFYE(YRUEHD*&")
console.log(sign)
运行报错

全部拿走,放在env.js

// env.js所有的代码
window = global;
// 因为我们拿到是Sha1.hash,Sha1.f等,,我们需要声明一个对象
Sha1 = {}
Sha1.hash = function(n, t) {
var w = Object.assign({
msgFormat: "string",
outFormat: "hex"
}, t), b, i, f, u, e, r, p, k, h, d;
switch (w.msgFormat) {
default:
case "string":
n = Sha1.utf8Encode(n);
break;
case "hex-bytes":
n = Sha1.hexBytesToString(n)
}
b = [1518500249, 1859775393, 2400959708, 3395469782];
i = [1732584193, 4023233417, 2562383102, 271733878, 3285377520];
n += String.fromCharCode(128);
var g = n.length / 4 + 2
, o = Math.ceil(g / 16)
, s = new Array(o);
for (u = 0; u < o; u++)
for (s[u] = new Array(16),
f = 0; f < 16; f++)
s[u][f] = n.charCodeAt(u * 64 + f * 4) << 24 | n.charCodeAt(u * 64 + f * 4 + 1) << 16 | n.charCodeAt(u * 64 + f * 4 + 2) << 8 | n.charCodeAt(u * 64 + f * 4 + 3);
for (s[o - 1][14] = (n.length - 1) * 8 / Math.pow(2, 32),
s[o - 1][14] = Math.floor(s[o - 1][14]),
s[o - 1][15] = (n.length - 1) * 8 & 4294967295,
u = 0; u < o; u++) {
for (e = new Array(80),
r = 0; r < 16; r++)
e[r] = s[u][r];
for (r = 16; r < 80; r++)
e[r] = Sha1.ROTL(e[r - 3] ^ e[r - 8] ^ e[r - 14] ^ e[r - 16], 1);
var c = i[0]
, l = i[1]
, a = i[2]
, v = i[3]
, y = i[4];
for (r = 0; r < 80; r++)
p = Math.floor(r / 20),
k = Sha1.ROTL(c, 5) + Sha1.f(p, l, a, v) + y + b[p] + e[r] >>> 0,
y = v,
v = a,
a = Sha1.ROTL(l, 30) >>> 0,
l = c,
c = k;
i[0] = i[0] + c >>> 0;
i[1] = i[1] + l >>> 0;
i[2] = i[2] + a >>> 0;
i[3] = i[3] + v >>> 0;
i[4] = i[4] + y >>> 0
}
for (h = 0; h < i.length; h++)
i[h] = ("00000000" + i[h].toString(16)).slice(-8);
return d = w.outFormat == "hex-w" ? " " : "",
i.join(d)
}
Sha1.f = function(n, t, i, r) {
switch (n) {
case 0:
return t & i ^ ~t & r;
case 1:
return t ^ i ^ r;
case 2:
return t & i ^ t & r ^ i & r;
case 3:
return t ^ i ^ r
}
}
Sha1.ROTL = function(n, t) {
return n << t | n >>> 32 - t
}
Sha1.utf8Encode = function(n) {
return unescape(encodeURIComponent(n))
}
Sha1.hexBytesToString = function(n) {
var i, t;
for (n = n.replace(" ", ""),
i = "",
t = 0; t < n.length; t += 2)
i += String.fromCharCode(parseInt(n.slice(t, t + 2), 16));
return i
}
运行rukou.js

对rukou.js修改
require("./22env.js")
require("./22loader.js")
// console.log(window.loader)
function p(e) {
return e && e.__esModule ? e : {
default: e
}
}
// 自建一个函数
function get_sign(user, pwd){
c = p(window.loader(141))
s = `/WebApi/Users/Login?username=${user}&password=${pwd}DUE$DEHFYE(YRUEHD*&`
sign = c.default(s)
return sign
}
python总代码
import requests
headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Origin': 'https://aerfaying.com',
'Pragma': 'no-cache',
'Referer': 'https://aerfaying.com/',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"macOS"',
}
data = {
'username': 'asdas',
'password': '123456',
# 't': '1731741580325',
# 's': '23ba09f69549a1be5d050675762e90367eda328e',
}
import execjs
t_sign_dict = execjs.compile(open("rukou.js").read()).call("get_sign", data['username'], data['password'])
data.update(t_sign_dict)
response = requests.post('https://aerfaying.com/WebApi/Users/Login', headers=headers, data=data)
print(response.text)

浙公网安备 33010602011771号