合肥网站制作建设,《c程序设计》精品课程网站建设,设计网站平台,中国500强企业有哪些本文仅供技术交流和技术学习 不做其他用途 接着上一篇继续讲#xff1a;
上篇地址#xff1a; JS逆向之wasm逆向(二进制) 网址#xff1a; aHR0cHM6Ly93d3cuN3E2Y3lqLmNvbTo5MDAxL3JlZ2lzdGVyNDY5Njg/aV9jb2RlPTQ0Mjc5OTU1
这个网站我们后面可以继续讲他的debugger 和滑块…本文仅供技术交流和技术学习 不做其他用途 接着上一篇继续讲
上篇地址 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 se.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 f0;
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 fr.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 这些都值得去练习和玩玩的
感谢大家观看 拜拜 欢迎大家关注我的公众号 后面会持续输出更多的好文章