全国建筑市场监管公共服务平台逆向记录

打开 https://jzsc.mohurd.gov.cn/data/company

切换分页得到接口 https://jzsc.mohurd.gov.cn/APi/webApi/dataservice/query/comp/list?pg=1&pgsz=15&total=450

返回的响应式是加密的数据

尝试全局搜索aes.decrypt有结果看到d.a.aes.decrypt很像应该是我需要的,点进去。

打断点刷新页面,鼠标移到d.a上面可以看到明显的cryptojs库特征。

把function b(t)函数扣下来,发现需要f等字段。把函数上方的变量声明也扣下来。

还需要解决n的值,在n相关代码位置打断点刷新,上点击跟踪js跳转到定义处,实际得到function s(e)

function s(e) {
        if (a[e])
            return a[e].exports;
        var n = a[e] = {
            i: e,
            l: !1,
            exports: {}
        };
        return t[e].call(n.exports, n, n.exports, s),
        n.l = !0,
        n.exports
    }

Function s(e)所在的整个加载器function t()扣下来,模块先为空。

外部想要调用加载器的s(e),需要先导出,在加载器代码的结尾处赋给global: global.myn=n。

然后n(xxx)就都可以改成myn(xxx). n.n(xxx)也改为myn(xxx); 这个知识需要消化

本地js代码顶部导入cryptojs,将d.a替换为cryptojs。

运行会报错 throw new Error(‘Malformed UTF-8 data’); 对应代码是: a.toString(cryptojs.enc.Utf8);

经过测试发现是f的值不对,里面word第一个值和控制台打印出来不一样。 这块找不到线索。

好在每次生成的f值是固定的,那就把f固定,代码要这么写:

const words = [
    1148467306,
    964118391,
    624314466,
    2019968622
]
const sigBytes = 16
var f=cryptojs.lib.WordArray.create(words, sigBytes);

再次运行,成功。

这次需要总结这几个知识点:
1.webpack中n(u)结构,n是加载器,u是模块,加载器所在的整个function扣下来,模块置空,需要的时候补充
2.导出加载器函数。
第一种方式先定义一个变量,加载器结尾代码把需要的函数赋值给这个变量(可以是一个函数一个变量,或多个函数存到一个的数组变量)
第二种是加载器结尾代码,直接将函数赋值给global。例如: global.myn=n
3.手动转换wordarray需要这么写:

const words = [
1148467306,
964118391,
624314466,
2019968622
]
const sigBytes = 16
var f=cryptojs.lib.WordArray.create(words, sigBytes);

Leave a Comment