首页
社区
课程
招聘
自己摸索并记录的webpack逆向案例
发表于: 1天前 311

自己摸索并记录的webpack逆向案例

1天前
311

地址:

d5d2aa1e5acf92ac6fadf6a2ba68734dcf2dfb581261dac8fc67a4a3390c06e9

接口:

2d74917137a05047e8d6ce026c01d8f6affef71f566f9898943237104f4ceb8c

以fetch(node.js)格式复制请求,对比后发现参数变化

工具网站(在线代码对比):0b2K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6@1k6i4S2@1k6r3W2X3k6W2)9J5k6h3!0B7k6h3&6S2K9g2)9J5k6h3y4G2L8g2)9J5c8R3`.`.

这里面有2个,都打上断点,其中有一个函数是没有用到的

function f(t)对外暴露的是函数a

从调用堆栈往上追一下,看看是谁在调用

这样就定位到我们的请求头构建函数了,而且把传入的参数e也定位到了,从控制台打印一下e,复制下来,这是前面各种环境检测后的初始值,后面加密运算用的输入参数,右键复制object,在js代码中定义一个参数e备用

再回到我们当前断点的堆栈上,找到所属的函数模块key

现在只需要用加载器函数,调用这个就可以了

上面的代码就把请求头中的参数都做完加密了,检查后,发现还缺少一个参数x-tingyun,重新搜索定位一下,并打个断点

从代码对比上看,这里就n发生了变化,n的生成函数就在前面,调用了G函数,悬浮一下就能直接抓到

复制下来,这样所有的请求参数就都获取到了

响应出来的json都是密文,而且可以看到和请求参数值很像。有经验的可以想到里面会有拦截器,我没有按照这个方法去找,还是从堆栈里面找到的

request后就这三个调用,挨个找一下并打断点,很容易定位到解密函数

打上后耐心点逐步调试,看到这个e.data的时候,打个断点,然后打印看一下e,里面有解密好的数据,在e.data.data.list里面

现在就成功定位到了解密函数,然后看一下传入的是什么参数,就能够执行了

很容易找到,解密函数就是加密函数中的b函数,e.data往上找找看,是请求后的返回值

同样的方法调用解密函数

js代码的框架

能够正常获取,注释掉一部分加密参数也可以获取到,比想象中简单一些

let window = globalThis;
!function (e) {
     //  其他代码……
    function o(t) {
        if (n[t])
            return n[t].exports;
        var i = n[t] = {
            i: t,
            l: !1,
            exports: {}
        };
        //console.log(t);  // 查看调用路径
        return e[t].call(i.exports, i, i.exports, o),
            i.l = !0,
            i.exports
    }
    window.o = o;
    //  其他代码……
    // o(o.s = 0) // 找到并注释掉这个初始调用
}({
    key : function(){}
})
let e = {}; // 右键复制的object
window.data = window.o("7d92").a(e);
let window = globalThis;
!function (e) {
     //  其他代码……
    function o(t) {
        if (n[t])
            return n[t].exports;
        var i = n[t] = {
            i: t,
            l: !1,
            exports: {}
        };
        //console.log(t);  // 查看调用路径
        return e[t].call(i.exports, i, i.exports, o),
            i.l = !0,
            i.exports
    }
    window.o = o;
    //  其他代码……
    // o(o.s = 0) // 找到并注释掉这个初始调用
}({
    key : function(){}
})
let e = {}; // 右键复制的object
window.data = window.o("7d92").a(e);
return e.data.data.appCode && (e.data.data = Object(c.b)("SM4", e.data)),
return e.data.data.appCode && (e.data.data = Object(c.b)("SM4", e.data)),
// 往上找能找到这个拦截器
o.a.interceptors.response.use((function(e) {}
// 往上找能找到这个拦截器
o.a.interceptors.response.use((function(e) {}
let findate = window.o("7d92").b("SM4", await response.json())
console.log(JSON.stringify(findate.list));
let findate = window.o("7d92").b("SM4", await response.json())
console.log(JSON.stringify(findate.list));
import subprocess
import json
import os
def execute_js(js_input, js_path):
    js_input_json = json.dumps(js_input, ensure_ascii=False)
    try:
        process = subprocess.Popen(
            ["node", js_path],
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True,
            encoding="utf-8",
            cwd=os.path.dirname(os.path.abspath(__file__)),
        )
        stdout, stderr = process.communicate(input=js_input_json)
        if process.returncode != 0:
            error_info = json.loads(stderr) if stderr else {"message": "未知错误"}
            raise Exception(
                f"JS执行失败:{error_info['message']}(详情:{error_info.get('stack', '')})"
            )
        result = json.loads(stdout)
        return result
    except json.JSONDecodeError as e:
        raise Exception(f"结果解析失败:{e}(输出:{stdout},错误:{stderr})")
    except Exception as e:
        raise Exception(f"执行异常:{e}")
 
if __name__ == "__main__":
    for i in range(1, 2):
        js_input, js_path = {"pageNum": i}, "../JavaScript/main.js"
        result = execute_js(js_input, js_path)
        print(f"JS执行结果page {i}:", result)
import subprocess
import json
import os

[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!

最后于 1天前 被blackfoxdu编辑 ,原因: 格式调整
收藏
免费 3
支持
分享
最新回复 (1)
雪    币: 104
活跃值: (7516)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
tql
18小时前
0
游客
登录 | 注册 方可回帖
返回