JS逆向之wasm逆向(二)

本文仅供技术交流和技术学习 不做其他用途
接着上一篇继续讲:

上篇地址:
JS逆向之wasm逆向(二进制)
网址:
aHR0cHM6Ly93d3cuN3E2Y3lqLmNvbTo5MDAxL3JlZ2lzdGVyNDY5Njg/aV9jb2RlPTQ0Mjc5OTU1

这个网站我们后面可以继续讲他的debugger 和滑块和登录加密
上一篇我们把定位和原理讲得差不多了 现在讲这个我们怎么去调用他;
请添加图片描述
两种方法调用:
我们这里只讲一种 node调用 因为c调用的话估计很多人听不懂了 比较麻烦。
node里面有WebAssembly这个api 比较坑就是必须版本16以上的node才能调用的
cmd查看node的版本 自己查看一下版本

node --version

请添加图片描述在这里插入
后面我们来分析代码

    function() {
        var e, c, t, f, n = {};
        var d = {
            38464: function() {
                return {
                    "./wasm_api_sign_bg.js": {
                        __wbg_now_513c8208bd94c09b: function() {
                            return void 0 === e && (e = a.c[88867].exports),
                            e.ei()
                        },
                        __wbg_random_9f33d5bdc74069f8: function() {
                            return void 0 === c && (c = a.c[88867].exports),
                            c.Aw()
                        },
                        __wbg_floor_a68aa7c1b572044e: function(e) {
                            return void 0 === t && (t = a.c[88867].exports),
                            t.OS(e)
                        },
                        __wbindgen_throw: function(e, c) {
                            return void 0 === f && (f = a.c[88867].exports),
                            f.Or(e, c)
                        }
                    }
                }
            }
        }
          , r = {
            2284: [38464]
        };
        a.w = {},
        a.f.wasm = function(e, c) {
            (r[e] || []).forEach((function(t, f) {
                var r = n[t];
                if (r)
                    c.push(r);
                else {
                    var b, o = d[t](), i = fetch(a.p + "static/wasm/" + {
                        2284: {
                            38464: "63d1a0a2a2e13f93b6f2"
                        }
                    }[e][t] + ".wasm");
                    if (o && "function" === typeof o.then && "function" === typeof WebAssembly.compileStreaming)
                        b = Promise.all([WebAssembly.compileStreaming(i), o]).then((function(e) {
                            return WebAssembly.instantiate(e[0], e[1])
                        }
                        ));
                    else if ("function" === typeof WebAssembly.instantiateStreaming)
                        b = WebAssembly.instantiateStreaming(i, o);
                    else {
                        b = i.then((function(e) {
                            return e.arrayBuffer()
                        }
                        )).then((function(e) {
                            return WebAssembly.instantiate(e, o)
                        }
                        ))
                    }
                    c.push(n[t] = b.then((function(e) {
                        return a.w[t] = (e.instance || e).exports
                    }
                    )))
                }
            }
            ))
        }
    }()

他用fetch去加载了wasm的代码 (相对网络请求去获取二进制文件)

下面是我们改写的代码

var o = function () {
    return {
        "./wasm_api_sign_bg.js": {
            __wbg_now_513c8208bd94c09b: function () {
                return  Date.now()
            },
            __wbg_random_9f33d5bdc74069f8: function () {
                return Math.random()
            },
            __wbg_floor_a68aa7c1b572044e: function (e) {
                return Math.floor(e)
            },
            __wbindgen_throw: function (e, c) {
                return void 0 === f && (f = a.c[88867].exports),
                    f.Or(e, c)
            }
        }
    }
};
let i = fetch("https://www.7q6cyj.com:9001/_next/static/wasm/63d1a0a2a2e13f93b6f2.wasm");let b = WebAssembly.instantiateStreaming(i, o())
b.then(function(e) {
 let s=e.instance.exports;
 console.log(s)
}
)
​
​
​
​
​

写完之后执行就拿到了sign方法 和其他几个我们需要执行的方法 o方法非常的简单 我这里怎么还原的 你们随便调试一下就知道了
请添加图片描述
WebAssembly.instantiateStreaming这个方法的讲解可以去官网看一下https://developer.mozilla.org/zh-CN/docs/WebAssembly/JavaScript_interface/instantiateStreaming_static

这里下面就继续跟着我们咋天调试的步伐继续还原 还原b方法 b方法里面取值的一些方法就不一一调试了 里面的方法非常的简单
请添加图片描述

var o = function () {
    return {
        "./wasm_api_sign_bg.js": {
            __wbg_now_513c8208bd94c09b: function () {
                return Date.now()
            },
            __wbg_random_9f33d5bdc74069f8: function () {
                return Math.random()
            },
            __wbg_floor_a68aa7c1b572044e: function (e) {
                return Math.floor(e)
            },
            __wbindgen_throw: function (e, c) {
                return void 0 === f && (f = a.c[88867].exports),
                    f.Or(e, c)
            }
        }
    }
};
let i = fetch("https://www.7q6cyj.com:9001/_next/static/wasm/63d1a0a2a2e13f93b6f2.wasm");
let f=0;
function a(n, e, t,rs) {
    let r = n.length
        , o = e(r);
    const u = c(rs);
    let i = 0;
    for (; i < r; i++) {
        const e = n.charCodeAt(i);
        if (e > 127)
            break;
        u[o + i] = e
    }
    if (i !== r) {
        0 !== i && (n = n.slice(i)),
            o = t(o, r, r = i + 3 * n.length);
        const e = c().subarray(o + i, o + r);
        i += _(n, e).written
    }
    return f = i,
        o
​
}
function w(r) {
    let l = new Int32Array(r.memory.buffer);
    return l;
}
function c(r) {
    return new Uint8Array(r.memory.buffer);
}
let u = new ("undefined" === typeof TextDecoder ? (0,
    n.require)("util").TextDecoder : TextDecoder)("utf-8", {
        ignoreBOM: !0,
        fatal: !0
    });
function is(n, e, r) {
    return u.decode(c(r).subarray(n, n + e));
}
let b = WebAssembly.instantiateStreaming(i, o())
b.then(function (e) {
    let r = e.instance.exports;
    const u = r.__wbindgen_add_to_stack_pointer(-16)
        , c = a("/act/api", r.__wbindgen_malloc, r.__wbindgen_realloc,r)
        , d = f
        , _ = a("prod", r.__wbindgen_malloc, r.__wbindgen_realloc,r)
        , l = f
    r.sign(u, c, d, _, l);
    var t = w(r)[u / 4 + 0]
        , o = w(r)[u / 4 + 1];
    console.log(is(t, o, r))
}
)
​
​
​
​
​

执行结果输出
请添加图片描述

感兴趣的朋友去可以看看这个网站 里面有滑块 debugger 还有wasm 这些都值得去练习和玩玩的

感谢大家观看 拜拜
欢迎大家关注我的公众号 后面会持续输出更多的好文章

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/181438.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

放弃无谓的「技术氛围」幻想,准备战斗

大型科技公司每年都招聘大量研发人才&#xff0c;这给了很多人一种错觉&#xff0c;认为是「技术」导致了这些公司的成功&#xff0c;其实他们的成功是技术推动的市场战略的成功&#xff0c;是市场需要某项服务&#xff0c;才需要研发人员夜以继日的埋头苦干。资本绝不会做亏本…

前端设计问题:iframe

居中问题&#xff1a; 尝试了一般的居中方法&#xff0c;无效果 display: flex;justify-content: center;align-items: center;放到导航栏下面不居中 放到页面底部还是不居中 Code <iframe id"demo_sanshui" src"demo_sanshui.html" width"120%…

浅析基于智能音视频技术的城市重要场馆智能监控系统设计

了解旭帆科技的朋友都知道&#xff0c;旭帆科技一直都乐于和大家分享各类场景的视频解决方案&#xff0c;今天小编就基于智能音视频技术的城市重要场馆智能监控系统设计和大家探讨一下。 基于智能音视频技术的城市重要场馆智能监控系统设计&#xff0c;主要包含以下要素&#x…

java项目之消防物资存储系统(ssm+vue)

项目简介 消防物资存储系统实现了以下功能&#xff1a; 管理员功能: 管理员登陆后&#xff0c;主要模块包括首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;仓库管理&#xff0c;物资入库管理&#xff0c;物资出库管理&#xff0c;仓库管理&#xff0c;物资详情管…

【C语言:深入理解指针二】

文章目录 1. 二级指针2. 指针数组3. 字符指针变量4. 数组指针变量5. 二维数组传参的本质6. 函数指针变量7. 函数指针数组8. 转移表9. 回调函数10. qsort函数的使用与模拟实现 1. 二级指针 我们知道&#xff0c;指针变量也是变量&#xff0c;它也有自己的地址&#xff0c;使用什…

微信小程序中使用腾讯地图bindmarkertap=“onMarkerTap“事件无法获取数据的id解决方法

问题描述 由于id是字符串类型&#xff0c;导致获取不到id 点击tap后&#xff0c;获取不到我们数据中的id 解决方法 只需要把id转成Number类型即可 点击tap后&#xff0c;即可获取到我们数据中对应的id

什么是复费率电表?

随着科技的不断进步和人们对能源管理的日益重视&#xff0c;复费率电表逐渐成为我国电力系统中不可或缺的一员。复费率电表是一种能够实现电能计量、峰谷电价划分以及负荷控制等多功能的智能电表&#xff0c;它采用先进的通信技术和计算机算法&#xff0c;对用户的用电行为进行…

JOSEF约瑟 过电流继电器 JL15-300/11 触点形式一开一闭 板前接线

系列型号 JL15-1.5/11电流继电器JL15-2.5/11电流继电器 JL15-5/11电流继电器JL15-10/11电流继电器 JL15-15/11电流继电器JL15-20/11电流继电器 JL15-30/11电流继电器JL15-40/11电流继电器 JL15-60/11电流继电器JL15-80/11电流继电器 JL15-100/11电流继电器JL15-150/11电流继电…

前端已死?看看我的秋招上岸历程

背景 求职方向&#xff1a;web前端 技术栈&#xff1a;vue2、springboot&#xff08;学校开过课&#xff0c;简单的学习过&#xff09; 实习经历&#xff1a;两段&#xff0c;但都是实训类的&#xff0c;说白了就是类似培训&#xff0c;每次面试官问起时我也会坦诚交代&…

SAP GOS与DMS简介

通常在项目实施过程中很多业务数据需要管理对应的系统外的附件&#xff0c; 制造业的BOM需要对应图纸&#xff0c;采购订单需要对应线下的采购合同&#xff0c;物料需要对应相应的参数文件等等&#xff0c;很多产品都会遇到业务数据和系统外相关资料的关联&#xff0c;有PDF的文…

浅析智慧社区建设趋势及AI大数据监管平台方案设计

一、背景与需求 伴随着社会与经济的发展&#xff0c;人们对生活质量的要求越来越高&#xff0c;与此同时&#xff0c;新兴技术的进步也促进了智慧社区市场的逐步成熟。智慧社区是社区管理的一种新理念&#xff0c;是新形势下城市与社会管理的一种创新模式。 在上海、杭州、深…

selenium下拉框的操作这样做,阿里p10都直呼牛逼

下拉框处理 web页面上经常会有下拉框&#xff0c;对下拉框的处理比较简单&#xff0c;一般分为两种情况&#xff1a; 一、下拉框通过元素定位识别 driver.find_element(By.XPATH,//option[value"peach"]).click() 二、创建一个select的对象&#xff0c;然后通过相…

java--继承快速入门

1.什么是继承 java中提供了一个关键字extends&#xff0c;用这个关键字&#xff0c;可以让一个类和另一个类建立其父子关系。 2.继承的特点 子类能继承父类的非私有成员(成员变量&#xff0c;成员方法)。 3.继承后对象的创建 子类的对象是由子类、父类共同完成的。 4.继承的…

自然资源土地管理法律法规知识竞赛这么办才高端

近些年&#xff0c;全国各地自然资源厅举办了土地管理法律法规知识竞赛&#xff0c;从我公司承办的这些赛事来看&#xff0c;传统的必答题、抢答题、风险题的方式已无法激起现场比赛气氛&#xff0c;需要更加复杂有趣的环节设置及高端竞赛软件及其配套设备加持才可以让知识竞赛…

盒马鲜生集成指南:无代码连接加强电商平台、CRM和客服系统的API应用

简化账号集成流程 为了在盒马鲜生平台上实现账号的集成&#xff0c;企业仅需两个关键信息&#xff1a;统一门店ID和Secret。统一门店ID的获取可以通过与餐道相关人员的沟通来开通&#xff0c;并在餐道管理后台获取。而Secret则需要联系集简云的客户成功获取。得到这两项信息后…

leetcode 343.整数拆分(动态规划)

OJ链接 &#xff1a;leetcode 343.整数拆分 代码&#xff1a; class Solution {public int integerBreak(int n) {int[] dp new int[n1];//每个n&#xff0c;拆分多个整数乘积的最大值dp [0] 0;dp [1] 1; for(int i 2 ; i<n; i){for(int j 0 ; j < i; j){dp[i] Ma…

windows版本的grafana如何离线安装插件

本文以安装clickhouse的插件为例&#xff0c;记录下如何离线安装插件 1 下载插件 ClickHouse plugin for Grafana | Grafana Labs 2 找到grafana的配置文件 打开编辑&#xff0c;搜索plugin关键字&#xff0c;修改plugin的加载目录 目录不存在&#xff0c;手动创建&#xff0…

本地websocket服务端暴露至公网访问【cpolar内网穿透】

本地websocket服务端暴露至公网访问【cpolar内网穿透】 文章目录 本地websocket服务端暴露至公网访问【cpolar内网穿透】1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功…

Go iota简介

当声明枚举类型或定义一组相关常量时&#xff0c;Go语言中的iota关键字可以帮助我们简化代码并自动生成递增的值。本文档将详细介绍iota的用法和行为。 iota关键字 iota是Go语言中的一个预定义标识符&#xff0c;它用于创建自增的无类型整数常量。iota的行为类似于一个计数器…

2023APMCM亚太杯数学建模选题建议及初步思路

大家好呀&#xff0c;亚太杯数学建模开始了&#xff0c;来说一下初步的选题建议吧&#xff1a; 首先定下主基调&#xff0c;本次亚太杯推荐选择B题。 C题如果想做好&#xff0c;搜集数据难度并不低&#xff0c;并且模型比较简单&#xff0c;此外目前选择的人数过多&#xff0c…