栗子2:
同样是 国家医疗保障
逆向请求加密的参数

这两个是要逆向的参数 signData encData
signData:
定位加密的入口位置:
第一种方式:全局搜索 signdata

就这四个位置,打上断点,刷新页面

这里断住了,这就是加密的位置。
第二种方式:hook json.stringify方法
请求参数加密 一般hook json.stringify 响应结果解密一般 hook json.parse
hook 的时机是 在该方法声明后,调用前
json是内置的函数,所以可以在页面最开始的时候就能注入
找到请求接口,打开启动器页面,找到最开始的调用文件

添加断点

刷新页面,在控制台注入hook代码

放开断点,进行调试,看到载荷参数出现了,

在调用堆栈,向上回溯,加密的位置已经知道了

分析加密代码:
在这里添加断点,点击翻页就会断住,这个函数的参数 t ,里面的逻辑只用到了 t.data 这个属性

在控制台输出一下 t.data,发现 其他的值其实是固定的,只有pageNum这个是翻页需要变的
把这个函数复制下来,也定义一个 e 对象接收这些值,作为传入参数

调用函数运行报错,m、p、v这三个函数直接扣下来

到了o.doSignature这个函数,向上找一下o,是来源于这个 r ,这种格式一般是webpack打包的

用webpack的方式解决:
1、找到加载函数
找到调用的模块,打上断点,

刷新页面,点击跳转就能找到加载函数了

把加载器复制下来,补上一个window环境,定义一个全局变量接受加载函数o,使能够在外部调用,加上一个日志输出,能方便补模块,(但是这个例子补的模块太多了,全复制算了)


找到这行,注释掉,或者直接把这里的代码都删掉,只是环境检测的作用,webpack框架就好了

这时候就可以调用模块了,把 o 改为 load("68b2").sm2 ,d是个定值,这里就解决了

到了 e 这个对象没定义

向上找一下e,这个 e 是作为参数传进来的,实际上也是一个调用模块

上面已经把webpack扣好了,修改一下就行了

调用运行函数,结果出来了

encData:
定位入口位置和上面的一样
分析加密代码
打上断点,这里直接是写死了 ”SM4“,所以直接扣框住的代码就行

分析一下传入的参数,传入的参数是对象 t ,参数 t 只用到了 t.data.data 和 t.data.appCode

控制台输出一下


把函数复制下来,还是用之前定义的对象 e ,但是注意要改一下调用方式

把 函数 A 、y、b 复制下来,u、c是定值,运行之后, s 和 e是有问题的

向上找一下s,是调用模块的,e是之前分析知道是作为参数传进来的,也是调用模块


之前已经做好了,直接调用就行

得到结果
js代码,模块太多了没写上,在网页打开复制就行
function m(e) {
var t = {}
, n = ["signData", "encData", "extra"];
for (var i in e)
e.hasOwnProperty(i) && !n.includes(i) && null != e[i] && (t[i] = e[i]);
return t
}
function p(e) {
var t = new Array
, n = 0;
for (var i in e)
t[n] = i,
n++;
var r = [].concat(t).sort()
, o = {};
for (var a in r)
o[r[a]] = e[r[a]];
return o
}
function v(e) {
var t = [];
for (var n in e)
if (e.hasOwnProperty(n) && (e[n] || "".concat(e[n])))
if ("data" === n) {
var i = Object.assign({}, e[n]);
for (var r in i) {
if ("number" != typeof i[r] && "boolean" != typeof i[r] || (i[r] = "" + i[r]),
Array.isArray(i[r]) && !i[r].length && delete i[r],
Array.isArray(i[r]) && i[r].length > 0)
for (var o = 0; o < i[r].length; o++)
i[r][o] = p(i[r][o]);
null != i[r] && i[r] || delete i[r]
}
var a = p(i);
t.push("".concat(n, "=").concat(JSON.stringify(a)))
} else
t.push("".concat(n, "=").concat(e[n]));
return t.push("key=".concat("NMVFVILMKT13GEMD3BKPKCTBOQBPZR2P")),
t.join("&")
}
window=global;
let load;
!function(e) {
function t(t) {
for (var n, i, o = t[0], a = t[1], s = 0, l = []; s < o.length; s++)
i = o[s],
Object.prototype.hasOwnProperty.call(r, i) && r[i] && l.push(r[i][0]),
r[i] = 0;
for (n in a)
Object.prototype.hasOwnProperty.call(a, n) && (e[n] = a[n]);
for (u && u(t); l.length; )
l.shift()()
}
var n = {}
, i = {
app: 0
}
, r = {
app: 0
};
function o(t) {
if (n[t])
return n[t].exports;
var i = n[t] = {
i: t,
l: !1,
exports: {}
};
console.log("t:::",t);
return e[t].call(i.exports, i, i.exports, o),
i.l = !0,
i.exports
}
load=o;
o.e = function(e) {
var t = [];
i[e] ? t.push(i[e]) : 0 !== i[e] && {
DetailModule: 1,
ServiceCatalog: 1,
ServiceSearchModule: 1,
"announcement-list": 1,
"download-page": 1,
home: 1,
personLogin: 1,
search: 1
}[e] && t.push(i[e] = new Promise((function(t, n) {
for (var r = "static/css/" + ({
DetailModule: "DetailModule",
ServiceCatalog: "ServiceCatalog",
ServiceSearchModule: "ServiceSearchModule",
"announcement-list": "announcement-list",
"download-page": "download-page",
home: "home",
personLogin: "personLogin",
redirect: "redirect",
search: "search",
pdfjsWorker: "pdfjsWorker"
}[e] || e) + "." + {
DetailModule: "5e631d12",
ServiceCatalog: "1d81de4e",
ServiceSearchModule: "128f361e",
"announcement-list": "ee54d713",
"download-page": "a9c8d3ee",
home: "677f5749",
personLogin: "acd0e1ca",
redirect: "31d6cfe0",
search: "3013d579",
pdfjsWorker: "31d6cfe0"
}[e] + ".css", a = o.p + r, s = document.getElementsByTagName("link"), l = 0; l < s.length; l++) {
var u = (h = s[l]).getAttribute("data-href") || h.getAttribute("href");
if ("stylesheet" === h.rel && (u === r || u === a))
return t()
}
var c = document.getElementsByTagName("style");
for (l = 0; l < c.length; l++) {
var h;
if ((u = (h = c[l]).getAttribute("data-href")) === r || u === a)
return t()
}
var d = document.createElement("link");
d.rel = "stylesheet",
d.type = "text/css",
d.onload = t,
d.onerror = function(t) {
var r = t && t.target && t.target.src || a
, o = new Error("Loading CSS chunk " + e + " failed.\n(" + r + ")");
o.code = "CSS_CHUNK_LOAD_FAILED",
o.request = r,
delete i[e],
d.parentNode.removeChild(d),
n(o)
}
,
d.href = a,
document.getElementsByTagName("head")[0].appendChild(d)
}
)).then((function() {
i[e] = 0
}
)));
var n = r[e];
if (0 !== n)
if (n)
t.push(n[2]);
else {
var a = new Promise((function(t, i) {
n = r[e] = [t, i]
}
));
t.push(n[2] = a);
var s, l = document.createElement("script");
l.charset = "utf-8",
l.timeout = 120,
o.nc && l.setAttribute("nonce", o.nc),
l.src = function(e) {
return o.p + "" + ({
DetailModule: "DetailModule",
ServiceCatalog: "ServiceCatalog",
ServiceSearchModule: "ServiceSearchModule",
"announcement-list": "announcement-list",
"download-page": "download-page",
home: "home",
personLogin: "personLogin",
redirect: "redirect",
search: "search",
pdfjsWorker: "pdfjsWorker"
}[e] || e) + ".1753261690554.js"
}(e);
var u = new Error;
s = function(t) {
l.onerror = l.onload = null,
clearTimeout(c);
var n = r[e];
if (0 !== n) {
if (n) {
var i = t && ("load" === t.type ? "missing" : t.type)
, o = t && t.target && t.target.src;
u.message = "Loading chunk " + e + " failed.\n(" + i + ": " + o + ")",
u.name = "ChunkLoadError",
u.type = i,
u.request = o,
n[1](u)
}
r[e] = void 0
}
}
;
var c = setTimeout((function() {
s({
type: "timeout",
target: l
})
}
), 12e4);
l.onerror = l.onload = s,
document.head.appendChild(l)
}
return Promise.all(t)
}
,
o.m = e,
o.c = n,
o.d = function(e, t, n) {
o.o(e, t) || Object.defineProperty(e, t, {
enumerable: !0,
get: n
})
}
,
o.r = function(e) {
"undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {
value: "Module"
}),
Object.defineProperty(e, "__esModule", {
value: !0
})
}
,
o.t = function(e, t) {
if (1 & t && (e = o(e)),
8 & t)
return e;
if (4 & t && "object" == typeof e && e && e.__esModule)
return e;
var n = Object.create(null);
if (o.r(n),
Object.defineProperty(n, "default", {
enumerable: !0,
value: e
}),
2 & t && "string" != typeof e)
for (var i in e)
o.d(n, i, function(t) {
return e[t]
}
.bind(null, i));
return n
}
,
o.n = function(e) {
var t = e && e.__esModule ? function() {
return e.default
}
: function() {
return e
}
;
return o.d(t, "a", t),
t
}
,
o.o = function(e, t) {
return Object.prototype.hasOwnProperty.call(e, t)
}
,
o.p = "",
o.oe = function(e) {
throw e
}
;
var a = window.webpackJsonp = window.webpackJsonp || []
, s = a.push.bind(a);
a.push = t,
a = a.slice();
for (var l = 0; l < a.length; l++)
t(a[l]);
var u = s;
// o(o.s = 0)
}({
//模块
})
function A(e) {
var t, n, i = new Array;
t = e.length;
for (var r = 0; r < t; r++)
(n = e.charCodeAt(r)) >= 65536 && n <= 1114111 ? (i.push(n >> 18 & 7 | 240),
i.push(n >> 12 & 63 | 128),
i.push(n >> 6 & 63 | 128),
i.push(63 & n | 128)) : n >= 2048 && n <= 65535 ? (i.push(n >> 12 & 15 | 224),
i.push(n >> 6 & 63 | 128),
i.push(63 & n | 128)) : n >= 128 && n <= 2047 ? (i.push(n >> 6 & 31 | 192),
i.push(63 & n | 128)) : i.push(255 & n);
return i
}
function y(e, t) {
return A(b(A(e.substr(0, 16)), A(t)).toUpperCase().substr(0, 16))
}
function b(t, n) {
var i = 16 - parseInt(n.length % 16);
n = n.concat(new Array(i).fill(i));
var r = load("68b2").sm4.encrypt(n, t);
return load("b639").Buffer.from(r).toString("hex")
}
e=
{
"data": {
"addr": "",
"regnCode": "440800",
"medinsName": "",
"medinsLvCode": "",
"medinsTypeCode": "",
"outMedOpenFlag": "",
"pageNum": 197,
"pageSize": 10,
"queryDataSource": "es"
},
"appCode": "T98HPCGN5ZVVQBS8LZQNOAEXVI9GYHKQ",
"version": "1.0.0",
"encType": "SM4",
"signType": "SM2",
"timestamp" : Math.ceil((new Date).getTime() / 1e3)
}
function get_signdata(e) {
var n = m(e)
, i = p(n);
i.data = p(i.data);
var r = v(i)
, a = load("68b2").sm2.doSignature(r, "009c4a35d9aca4c68f1a3fa89c93684347205a4d84dc260558a049869709ac0b42", {
hash: !0
});
e.signData=load("b639").Buffer.from(a, "hex").toString("base64");
return load("b639").Buffer.from(a, "hex").toString("base64")
}
function get_encData( e) {
for (var t = e.data && JSON.stringify(e.data), n = "", i = 0; i < t.length; i++) {
var r = t.charAt(i)
, o = t.charCodeAt(i);
n += o > 127 ? "\\u" + o.toString(16).padStart(4, "0") : r
}
var a = A(n);
e.appCode && e.appCode !== "T98HPCGN5ZVVQBS8LZQNOAEXVI9GYHKQ" && (u = e.appCode);
var s = y("T98HPCGN5ZVVQBS8LZQNOAEXVI9GYHKQ", "NMVFVILMKT13GEMD3BKPKCTBOQBPZR2P")
, l = b(s, a);
e.data=l.toUpperCase();
return l.toUpperCase()
}
// console.log(e)
// console.log(get_signdata(e))
// console.log(e)
console.log(get_encData(e))
2392

被折叠的 条评论
为什么被折叠?



