com.whl.quickjs.wrapper.QuickJSException: not a function
FongMi opened this issue · comments
順便請教,我在測試 bytecode 發生這樣的錯誤 是不是因為qjsc的版本跟你的庫不相容
這是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
順便請教,我在測試 bytecode 發生這樣的錯誤 是不是因為qjsc的版本跟你的庫不相容
這是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 代码,一种是字节码
了解,我再試試看了,感謝大神。
順便請教,我在測試 bytecode 發生這樣的錯誤 是不是因為qjsc的版本跟你的庫不相容
這是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 會出現其他錯誤
所以只好放棄了。