HarlonWang / quickjs-wrapper

QuickJS wrapper for Android/JVM

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

com.whl.quickjs.wrapper.QuickJSException: not a function

FongMi opened this issue · comments

commented

最新測試版發現的問題
image

commented

順便請教,我在測試 bytecode 發生這樣的錯誤
是不是因為qjsc的版本跟你的庫不相容
image

這是bytecode範例
要去掉 //bb
然後用 base64 解密剩餘字串
然後用 context.execute 發生的

lbgs_open.zip

最新測試版發現的問題 image

这个是我这边的一个 bug 导致的,已经修复了,我晚点会发个版本,明天你可以用 0.22.1-beta 这个版本验证下

順便請教,我在測試 bytecode 發生這樣的錯誤 是不是因為qjsc的版本跟你的庫不相容 image

這是bytecode範例 要去掉 //bb 然後用 base64 解密剩餘字串 然後用 context.execute 發生的

lbgs_open.zip

这个还不太清楚,你是怎么编译成字节码的,是通过我提供的 compile 方法编译的吗?或者可以给个原始的 js 文件,我这边编译下试试看

commented

順便請教,我在測試 bytecode 發生這樣的錯誤 是不是因為qjsc的版本跟你的庫不相容 image
這是bytecode範例 要去掉 //bb 然後用 base64 解密剩餘字串 然後用 context.execute 發生的
lbgs_open.zip

这个还不太清楚,你是怎么编译成字节码的,是通过我提供的 compile 方法编译的吗?或者可以给个原始的 js 文件,我这边编译下试试看

這個貓影視有發一個工具,不過封裝起來了
https://github.com/catvod/CatVodOpen/tree/main/open/qjsc

原始檔案
https://github.com/catvod/CatVodOpen/blob/main/open/kunyu77_open.js

bytecode 後檔案
https://github.com/catvod/CatVodOpen/blob/main/open/qjsc/bytecode/kunyu77_open.js

ps:他們 bytecode 後有再轉成 //bb+base64(bytecode) 格式

他們發布的版本在這,看看是否可以用 IDA Pro 查看他們的 so quickjs 版本
https://github.com/catvod/CatVodOpen/releases/tag/1.0.8

另外我有個疑問
如果要載入這種已編譯好的
透過 QuickJSContext.execute(bytecode) 怎麼提前設定他的 moduleName

commented

最新測試版發現的問題 image

这个是我这边的一个 bug 导致的,已经修复了,我晚点会发个版本,明天你可以用 0.22.1-beta 这个版本验证下

測試沒問題了,感謝。
距離QQ解封還有16天。

順便請教,我在測試 bytecode 發生這樣的錯誤 是不是因為qjsc的版本跟你的庫不相容 image
這是bytecode範例 要去掉 //bb 然後用 base64 解密剩餘字串 然後用 context.execute 發生的
lbgs_open.zip

这个还不太清楚,你是怎么编译成字节码的,是通过我提供的 compile 方法编译的吗?或者可以给个原始的 js 文件,我这边编译下试试看

這個貓影視有發一個工具,不過封裝起來了 https://github.com/catvod/CatVodOpen/tree/main/open/qjsc

原始檔案 https://github.com/catvod/CatVodOpen/blob/main/open/kunyu77_open.js

bytecode 後檔案 https://github.com/catvod/CatVodOpen/blob/main/open/qjsc/bytecode/kunyu77_open.js

ps:他們 bytecode 後有再轉成 //bb+base64(bytecode) 格式

他們發布的版本在這,看看是否可以用 IDA Pro 查看他們的 so quickjs 版本 https://github.com/catvod/CatVodOpen/releases/tag/1.0.8

另外我有個疑問 如果要載入這種已編譯好的 透過 QuickJSContext.execute(bytecode) 怎麼提前設定他的 moduleName

  • 字节码需要通过我提供的方法来编译的,你这个应该是用的 quickjs 自带的 qjsc 的方式编译的,我是 fork 的 quickjs 仓库,里面是有一些新的改动,所以可能会有一些兼容性问题。你可以用原始档案通过我提供的 compile 或者 compileModule 方式来编译后执行下看下,使用方式可以参考单元测试里的示例代码:wrapper-android/src/androidTest/java/com/whl/quickjs/wrapper/QuickJSCompileTest.java

  • 关于你的疑问,moduleName 是在执行的时候,通过类似 ModuleLoader 去加载的,并不是提前设定的。一般是先编译好,在 ModuleLoader 里通过 moduleName 去加载对应的 module 代码

如果是 compileModule 的话,可以参考这个测试方法,可以单独编译 Module 代码:

    @Test
    public void testCompileModuleWithMockModuleLoader() {
        thrown.expect(QuickJSException.class);
        thrown.expectMessage("Could not find export 'a' in module 'a.js'");

        QuickJSContext context = QuickJSContext.create();
        context.setModuleLoader(new QuickJSContext.DefaultModuleLoader() {
            @Override
            public String getModuleStringCode(String moduleName) {
                return "";
            }
        });
        // 在 ModuleLoader 中返回空字符串,可以实现仅编译当前模块字节码,而不用编译它所依赖的模块
        byte[] bytes = context.compileModule("import { a } from 'a.js';");
        context.execute(bytes);
        context.destroy();
    }

实际执行的时候,还是需要通过 setModuleLoader 去加载对应 Module 代码的,一般可以提前编译成字节码,加载支持两种方式,一种是 String 代码,一种是字节码

commented

了解,我再試試看了,感謝大神。

commented

順便請教,我在測試 bytecode 發生這樣的錯誤 是不是因為qjsc的版本跟你的庫不相容 image
這是bytecode範例 要去掉 //bb 然後用 base64 解密剩餘字串 然後用 context.execute 發生的
lbgs_open.zip

这个还不太清楚,你是怎么编译成字节码的,是通过我提供的 compile 方法编译的吗?或者可以给个原始的 js 文件,我这边编译下试试看

這個貓影視有發一個工具,不過封裝起來了 https://github.com/catvod/CatVodOpen/tree/main/open/qjsc
原始檔案 https://github.com/catvod/CatVodOpen/blob/main/open/kunyu77_open.js
bytecode 後檔案 https://github.com/catvod/CatVodOpen/blob/main/open/qjsc/bytecode/kunyu77_open.js
ps:他們 bytecode 後有再轉成 //bb+base64(bytecode) 格式
他們發布的版本在這,看看是否可以用 IDA Pro 查看他們的 so quickjs 版本 https://github.com/catvod/CatVodOpen/releases/tag/1.0.8
另外我有個疑問 如果要載入這種已編譯好的 透過 QuickJSContext.execute(bytecode) 怎麼提前設定他的 moduleName

  • 字节码需要通过我提供的方法来编译的,你这个应该是用的 quickjs 自带的 qjsc 的方式编译的,我是 fork 的 quickjs 仓库,里面是有一些新的改动,所以可能会有一些兼容性问题。你可以用原始档案通过我提供的 compile 或者 compileModule 方式来编译后执行下看下,使用方式可以参考单元测试里的示例代码:wrapper-android/src/androidTest/java/com/whl/quickjs/wrapper/QuickJSCompileTest.java
  • 关于你的疑问,moduleName 是在执行的时候,通过类似 ModuleLoader 去加载的,并不是提前设定的。一般是先编译好,在 ModuleLoader 里通过 moduleName 去加载对应的 module 代码

是的,確實不兼容,嘗試將他們的頭CATOP移除並注入第一個 byte 0x02 會出現其他錯誤
image

所以只好放棄了。