上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

哥哥 hello_world的wasm版本怎么hook呀

[复制链接]

该用户从未签到

2

主题

5

回帖

10

积分

助理工程师

积分
10
发表于 前天 14:07 | 显示全部楼层 | 阅读模式
悬赏10油猫币未解决
// ==UserScript==
// @name         localhost wasm
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  learn webpack wasm compiling from rust
// @author       Your Name
// @match        http://localhost/*
// @grant        GM_xmlhttpRequest
// @grant        unsafeWindow
// @require      http://localhost:8080/index.js
// @run-at       document-start
// ==/UserScript==

(function(){
    unsafeWindow.WebAssembly.instantiateStreaming_ = unsafeWindow.WebAssembly.instantiateStreaming;
    unsafeWindow.WebAssembly.instantiateStreaming = function(bufferSource, importObject){
        return unsafeWindow.WebAssembly.instantiateStreaming_(bufferSource, importObject).then(
            results => {
                // Modify the greet function once the WebAssembly instance is created
            const instance = results.instance;

            debugger;
            // Hook the greet function
            const originalGreet = instance.exports.greet;
            // debugger;
            instance.exports.greet = function(...args) {
                // args 是一个包含所有传入参数的数组
                console.log('Hooked greet function called with arguments:', args);

                // 调用原始 greet 函数,使用 apply 方法传递所有参数
                return originalGreet.apply(instance, args); // args 会自动展开为多个参数传递给原始函数
            };

            // Expose instance globally if needed
            unsafeWindow.greet = instance.exports.greet;

            console.log('WebAssembly instance created and greet hooked');
            return results; // Return the original results
        });
    } 

})();

这里greet明明被调用了,但是hook不到,是因为greet是只读不可修改属性的原因吗,要怎么用proxy或者defineproporty来修改属性然后hook到greet函数呀(比如修改参数显示"哥哥牛逼")

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5999

    回帖

    6784

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6784

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 昨天 05:19 | 显示全部楼层
    哥哥最好顺便给个测试页面的demo
    不然不好看问题
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

    该用户从未签到

    2

    主题

    5

    回帖

    10

    积分

    助理工程师

    积分
    10
    发表于 昨天 07:24 | 显示全部楼层

    李恒道 发表于 2024-12-3 05:19

    哥哥最好顺便给个测试页面的demo
    不然不好看问题

    哥哥我是本地跑的这个rust wasm 实例( example下的hello_world)https://github.com/rustwasm/wasm-bindgen/tree/main/examples

    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5999

    回帖

    6784

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6784

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 昨天 08:19 | 显示全部楼层
    rogerxavier 发表于 2024-12-3 07:24
    [md]哥哥我是本地跑的这个rust wasm 实例( example下的hello_world)https://github.com/rustwasm/wasm-bi ...

    哥哥方便的话可以发个打包版的吗
    我这里跑都跑不起来...
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

    该用户从未签到

    2

    主题

    5

    回帖

    10

    积分

    助理工程师

    积分
    10
    发表于 7 小时前 | 显示全部楼层
    https://rustwasm.github.io/wasm-bindgen/exbuild/hello_world/ 哥哥可以使用官方的示例试试
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5999

    回帖

    6784

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6784

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 7 小时前 | 显示全部楼层

    rogerxavier 发表于 2024-12-4 08:44

    https://rustwasm.github.io/wasm-bindgen/exbuild/hello_world/ 哥哥可以使用官方的示例试试

    可以不可以复写成功可以直接下个debugger做测试
    哥哥的代码里只有instance是可以被复写的
    顺着这层直接assgin一下返回应该是可以的

        unsafeWindow.WebAssembly.instantiateStreaming = function(bufferSource, importObject){
            return unsafeWindow.WebAssembly.instantiateStreaming_(bufferSource, importObject).then(
                results => {
                    // Modify the greet function once the WebAssembly instance is created
                    const instance = results.instance;
    
                    const handler = {
                        get: function (obj, prop) {
                            console.log('get attr',prop)
                            return obj[prop];
                        },
                    };
                    results.instance=new Proxy(instance, handler);
    
                    console.log('WebAssembly instance created and greet hooked');
                    return results; // Return the original results
                });
        }

    因为控制台测试的,后续代码就懒得写了,哥哥判断export然后assign直接复写应该就ok了
    图片.png

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

    该用户从未签到

    2

    主题

    5

    回帖

    10

    积分

    助理工程师

    积分
    10
    发表于 3 小时前 | 显示全部楼层
    1. (function(){
    2.     unsafeWindow.WebAssembly.instantiateStreaming_ = unsafeWindow.WebAssembly.instantiateStreaming;
    3.     unsafeWindow.WebAssembly.instantiateStreaming = function(bufferSource, importObject){
    4.         return unsafeWindow.WebAssembly.instantiateStreaming_(bufferSource, importObject).then(
    5.             results => {
    6.                 // 获取 WebAssembly 实例
    7.                 const instance = results.instance;

    8.                 const handler = {
    9.                     get: function (obj, prop) {
    10.                         // 检查是访问 exports 对象,还是更具体的函数
    11.                         console.log('get attr', prop);

    12.                         // 如果访问的是 'exports',进一步检查
    13.                         if (prop === 'exports') {
    14.                             return new Proxy(obj[prop], {
    15.                                 get: function (exportsObj, exportProp) {
    16.                                     // 只处理对 'greet' 函数的访问
    17.                                     if (exportProp === 'greet') {
    18.                                         console.log('hook到greet');
    19.                                         const originalGreet = exportsObj[exportProp];
    20.                                         return function(...args) {
    21.                                             console.log('调用greet函数', args);
    22.                                             return originalGreet(...args);
    23.                                         };
    24.                                     }
    25.                                     return exportsObj[exportProp];
    26.                                 }
    27.                             });
    28.                         }

    29.                         // 返回其他属性
    30.                         return obj[prop];
    31.                     },
    32.                 };

    33.                 // 使用 Proxy 拦截 instance,捕获对属性(包括 exports)和 greet 的访问
    34.                 results.instance = new Proxy(instance, handler);

    35.                 console.log('WebAssembly instance created and greet hooked');
    36.                 return results; // 返回原始结果
    37.             });
    38.     }
    39. })();
    复制代码

    哥哥这里我判断export然后hook到greet函数后试图打印参数并修改它添加log,但是最后报错了
    1. 'get' on proxy: property 'greet' is a read-only and non-configurable data property on the proxy target but the proxy did not return its actual value (expected 'function 64() { [native code] }' but got 'function(...args) { console.log('调用greet函数', args)...<omitted>... }')TypeError: 'get' on proxy: property 'greet' is a read-only and non-configurable data property on the proxy target but the proxy did not return its actual value (expected 'function 64() { [native code] }' but got 'function(...args) {
    复制代码
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5999

    回帖

    6784

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6784

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2 小时前 | 显示全部楼层

    rogerxavier 发表于 2024-12-4 13:01

    哥哥这里我判断export然后hook到greet函数后试图打印参数并修改它添加log,但是最后报错了
    ...

    // ==UserScript==
    // @name         localhost wasm
    // @namespace    http://tampermonkey.net/
    // @version      0.1
    // @description  learn webpack wasm compiling from rust
    // @author       Your Name
    // @match        https://rustwasm.github.io/wasm-bindgen/exbuild/hello_world/
    // @grant        GM_xmlhttpRequest
    // @grant        unsafeWindow
    // @run-at       document-start
    // ==/UserScript==
    
    (function(){
        debugger;
        unsafeWindow.WebAssembly.instantiateStreaming_ = unsafeWindow.WebAssembly.instantiateStreaming;
        unsafeWindow.WebAssembly.instantiateStreaming = function(bufferSource, importObject){
            return unsafeWindow.WebAssembly.instantiateStreaming_(bufferSource, importObject).then(
                results => {
                    // Modify the greet function once the WebAssembly instance is created
                    const instance = results.instance;
    
                    const handler = {
                        get: function (obj, prop) {
                            if(prop==='exports'){
                                const assign={...obj[prop]}
                                assign.greet=function (...args){
                                    return obj[prop].greet(...args)
                                }
                                return assign
                            }
                            console.log('get attr',prop)
                            return obj[prop];
                        },
                    };
                    results.instance=new Proxy(instance, handler);
    
                    console.log('WebAssembly instance created and greet hooked');
                    return results; // Return the original results
                });
        }
    
    })();
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

    该用户从未签到

    2

    主题

    5

    回帖

    10

    积分

    助理工程师

    积分
    10
    发表于 1 小时前 | 显示全部楼层
    ggnb,ggnb,ggnb
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表