From 015554ca37292fc0c3e47a05890b029d2e2a5c84 Mon Sep 17 00:00:00 2001 From: haonan Date: Mon, 19 Oct 2026 10:22:36 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=89=A9=E5=B1=95=20PVM2=20=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E6=96=B9=E6=B3=95=E5=85=BC=E5=AE=B9=E5=B9=B6=E5=8F=91?= =?UTF-8?q?=E5=B8=83=201.8.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/release-notes/versions/1.8.5.md | 12 + Cargo.lock | 8 +- apps/shield-cli/Cargo.toml | 2 +- apps/shield-gui/package-lock.json | 4 +- apps/shield-gui/package.json | 2 +- apps/shield-gui/src-tauri/Cargo.toml | 2 +- apps/shield-gui/src-tauri/tauri.conf.json | 2 +- apps/shield-gui/src/hooks/use-about-page.ts | 2 +- crates/shield-core/Cargo.toml | 2 +- crates/shield-core/src/protection_report.rs | 14 +- docs/usage.md | 8 +- shield-stub/compat/api19-rust/Cargo.lock | 2 +- shield-stub/compat/api19-rust/Cargo.toml | 2 +- shield-stub/src/main/rust/Cargo.toml | 2 +- tests/README.md | 8 +- .../protector/packer/Pvm2ProtectionCheck.java | 157 +++-- tests/native/pvm2_runtime_check.cpp | 6 +- tests/scripts/check-pvm2-art.py | 180 +++++- .../native/src/main/cpp/vm/pvm2_format.cpp | 2 +- .../native/src/main/cpp/vm/pvm2_format.h | 1 + .../native/src/main/cpp/vm/pvm2_interp.cpp | 58 +- .../yqsh/protector/packer/AutoVmpPolicy.java | 12 +- .../com/yqsh/protector/packer/PackerMain.java | 9 +- .../yqsh/protector/packer/Pvm2Compiler.java | 38 +- .../yqsh/protector/packer/Pvm2Opcodes.java | 2 +- .../com/yqsh/protector/packer/Pvm2Safety.java | 562 +++--------------- tools/xop-pvm2-packer.jar | Bin 8316378 -> 8310391 bytes 27 files changed, 479 insertions(+), 620 deletions(-) create mode 100644 .github/release-notes/versions/1.8.5.md diff --git a/.github/release-notes/versions/1.8.5.md b/.github/release-notes/versions/1.8.5.md new file mode 100644 index 0000000..1220e52 --- /dev/null +++ b/.github/release-notes/versions/1.8.5.md @@ -0,0 +1,12 @@ +### PVM2 组件方法兼容修复 + +- 修复 Activity、Application、Service 等组件中的普通方法因包含字段、调用、数组元素或同步块而被叶子白名单整批排除的问题,统一进入共用编译器逐指令校验。 +- 修复分支和异常处理区中的可空接收者被静态拒绝的问题;方法长度上限从 512 扩大到 4096 个 DEX 代码单元,同时严格检查展开后的代码长度、寄存器、跳转和异常表边界。 +- 修复字符串常量的内嵌空字符、补充平面字符和驻留身份;修复祖先类引用、派生对象及接口默认实现中的父类调用分派。 +- PVM2 镜像升级至 v9,打包器、运行时和覆盖报告同步适配。初始化器、生成桥、特殊对象契约及其他未支持方法仍明确保留;零转换及必保方法未覆盖仍失败,不把跳过项计为已保护。 + +### 验证与使用说明 + +- 自建 Java/D8 样本中 46 个方法通过转换和最终产物验证;在 Android 9、15、16 模拟器及 Android 15 真机上完成 20 次启动、10,500 项执行断言,覆盖 16 KB 内存页、无资源表和原生接口默认方法。 +- 本地实际 APK 的限定选择范围为 21 个方法,18 个普通方法转换成功,3 个初始化器保留;完成五种安装/启动场景及生命周期、通知服务检查。该结果不代表全部业务流程或全部方法分支已验证。 +- 升级后需重新加固,使用配套打包器与运行时;已有 APK 不会自动获得修复。PVM2 需要 JDK 17 或更高版本,具体覆盖范围以本次产物逐方法报告为准,分享前请手动脱敏。 diff --git a/Cargo.lock b/Cargo.lock index ee885cc..2b87896 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2201,7 +2201,7 @@ dependencies = [ [[package]] name = "mocika-shield" -version = "1.8.4" +version = "1.8.5" dependencies = [ "dunce", "reqwest 0.12.28", @@ -2229,7 +2229,7 @@ dependencies = [ [[package]] name = "mocikashield" -version = "1.8.4" +version = "1.8.5" dependencies = [ "cc", "chacha20poly1305", @@ -3635,7 +3635,7 @@ dependencies = [ [[package]] name = "shield-cli" -version = "1.8.4" +version = "1.8.5" dependencies = [ "anyhow", "clap", @@ -3653,7 +3653,7 @@ dependencies = [ [[package]] name = "shield-core" -version = "1.8.4" +version = "1.8.5" dependencies = [ "anyhow", "chacha20poly1305", diff --git a/apps/shield-cli/Cargo.toml b/apps/shield-cli/Cargo.toml index 30e9d9b..395267d 100644 --- a/apps/shield-cli/Cargo.toml +++ b/apps/shield-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shield-cli" -version = "1.8.4" +version = "1.8.5" edition = "2021" authors = ["MocikaDev"] license = "MIT OR Apache-2.0" diff --git a/apps/shield-gui/package-lock.json b/apps/shield-gui/package-lock.json index cd45ed1..41514ea 100644 --- a/apps/shield-gui/package-lock.json +++ b/apps/shield-gui/package-lock.json @@ -1,12 +1,12 @@ { "name": "mocika-shield-gui", - "version": "1.8.4", + "version": "1.8.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mocika-shield-gui", - "version": "1.8.4", + "version": "1.8.5", "license": "MIT OR Apache-2.0", "dependencies": { "@radix-ui/react-dialog": "^1.1.19", diff --git a/apps/shield-gui/package.json b/apps/shield-gui/package.json index 2027415..0cb70a8 100644 --- a/apps/shield-gui/package.json +++ b/apps/shield-gui/package.json @@ -1,6 +1,6 @@ { "name": "mocika-shield-gui", - "version": "1.8.4", + "version": "1.8.5", "license": "MIT OR Apache-2.0", "private": true, "type": "module", diff --git a/apps/shield-gui/src-tauri/Cargo.toml b/apps/shield-gui/src-tauri/Cargo.toml index 012ff08..2d9eba3 100644 --- a/apps/shield-gui/src-tauri/Cargo.toml +++ b/apps/shield-gui/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mocika-shield" -version = "1.8.4" +version = "1.8.5" edition = "2021" license = "MIT OR Apache-2.0" publish = false diff --git a/apps/shield-gui/src-tauri/tauri.conf.json b/apps/shield-gui/src-tauri/tauri.conf.json index 82d7902..b6b93ee 100644 --- a/apps/shield-gui/src-tauri/tauri.conf.json +++ b/apps/shield-gui/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "Shellsmith", - "version": "1.8.4", + "version": "1.8.5", "identifier": "dev.mocika.shield-gui", "build": { "beforeDevCommand": "npm run dev -- --host 127.0.0.1", diff --git a/apps/shield-gui/src/hooks/use-about-page.ts b/apps/shield-gui/src/hooks/use-about-page.ts index 35e0beb..58c4502 100644 --- a/apps/shield-gui/src/hooks/use-about-page.ts +++ b/apps/shield-gui/src/hooks/use-about-page.ts @@ -9,7 +9,7 @@ type AppInfo = { }; const defaultAppInfo: AppInfo = { - version: "1.8.4", + version: "1.8.5", git_hash: "dev", build_date: "unknown", }; diff --git a/crates/shield-core/Cargo.toml b/crates/shield-core/Cargo.toml index cbe45ad..a37d1df 100644 --- a/crates/shield-core/Cargo.toml +++ b/crates/shield-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shield-core" -version = "1.8.4" +version = "1.8.5" edition = "2021" authors = ["MocikaDev"] license = "MIT OR Apache-2.0" diff --git a/crates/shield-core/src/protection_report.rs b/crates/shield-core/src/protection_report.rs index 4b7d437..b5766a2 100644 --- a/crates/shield-core/src/protection_report.rs +++ b/crates/shield-core/src/protection_report.rs @@ -167,7 +167,7 @@ impl Pvm2Failure { ensure!( report.schema_version == 2 && report.code_version == 4 - && matches!(report.image_version, 7 | 8), + && matches!(report.image_version, 7..=9), "方法失败报告协议无效" ); let mut classes = BTreeSet::new(); @@ -453,7 +453,7 @@ impl MethodReport { ensure!( self.schema_version == 2 && self.code_version == 4 - && matches!(self.image_version, 7 | 8), + && matches!(self.image_version, 7..=9), "方法报告协议版本不受支持" ); ensure!( @@ -795,6 +795,12 @@ mod tests { "reason": reason, "artifact_verified": false, "plaintext_policy": null })).unwrap()); } + for image in [7, 8, 9, 10] { + detail.image_version = image; + detail.write(&path).unwrap(); + assert_eq!(Pvm2Failure::zero_methods(&path).is_ok(), image <= 9); + } + detail.image_version = 9; detail.write(&path).unwrap(); let failure = Pvm2Failure::zero_methods(&path).unwrap(); assert_eq!(failure.summary.selected_classes, 1); @@ -995,14 +1001,14 @@ mod tests { ); } } - for image in [7, 8] { + for image in [7, 8, 9] { let mut candidate: MethodReport = serde_json::from_value(data.clone()).unwrap(); candidate.image_version = image; assert!(candidate .validate(dir.path(), &code, &modules, &BTreeSet::new(), 1, &inputs) .is_ok()); } - for (schema, image) in [(1, 7), (2, 6), (2, 9)] { + for (schema, image) in [(1, 7), (2, 6), (2, 10)] { let mut candidate: MethodReport = serde_json::from_value(data.clone()).unwrap(); candidate.schema_version = schema; candidate.image_version = image; diff --git a/docs/usage.md b/docs/usage.md index d2031ea..6780c56 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -543,11 +543,13 @@ shield protect --input input.apk --output protected.apk \ 启用 PVM2 的成功输出旁会生成 `protected.apk.protection.json` 或 `protected.aab.protection.json`。统计分别展示转换成功率、选中方法覆盖率、原始指令字节覆盖率和必保方法覆盖率;未声明必保方法时该指标为 `null`,不记为 100%。这些百分比仅针对选择范围,不代表整个应用。报告包含逐方法原因、最终索引与产物摘要,不包含密钥或明文镜像,也不进入安装包。 -选择范围在兼容性过滤**之前**统计。UI/导航、数据/资源辅助和媒体命名不再直接排除整类:没有对象状态访问、外部调用或同步的独立方法,可以继续进入 PVM2 指令与产物检查。支持基本类型计算,以及对象/数组参数未使用、引用透传、空值分支和引用身份比较;引用参数不会再仅因其类型被排除,但数组元素和字段访问仍不在这一兼容放行范围内。私有、静态和实例方法适用相同的方法体检查;继承父类或实现接口本身不再排除普通实例方法。跳板保留原声明、访问标志、参数与接收者,虚方法分派仍由 ART 完成;`hashCode/finalize` 等特殊对象契约仍保守保留。分支、循环和数值运算仍须通过现有编译器检查,不能只凭命名认定可转换。 +选择范围在兼容性过滤**之前**统计。UI、导航和 Android 组件中的普通方法不再因包含字段、方法调用、数组元素或同步块而被叶子方法白名单整批排除;它们与普通业务类共用编译器,逐指令校验后再决定是否转换。跳板保留原声明、访问标志、参数与接收者,虚方法分派仍由 ART 完成。父类调用保留声明类的直接父类信息,接口默认实现单独按原接口调用,不能由接收者的动态类型推断。 -独立方法中的异常处理不再仅因存在异常表而被排除。捕获、异常透传、重新抛出和不访问外部状态的清理逻辑继续经过异常表映射、控制流及指令检查;`throw null` 产生可被捕获的 `NullPointerException`。这不意味着任意 `try/catch/finally` 都受支持:异常区中的外部调用、字段、数组元素或同步仍受上述限制。 +这一路径支持经回归验证的字段读写、对象创建、静态/虚拟/接口/直接/父类调用、数组元素、空值调用、异常捕获与 finally、同步块。空值本身不再作为静态拒绝条件,运行时在原调用位置抛出并派发 `NullPointerException`。方法仍受支持指令、32 个寄存器(含编译临时寄存器)、4096 个 DEX 代码单元、编译后代码 65535 字节、分支偏移和异常表映射等边界约束;不是任意方法都能转换。标准 UTF-8 字符串保留内嵌空字符、补充平面字符及驻留身份;孤立 UTF-16 代理项明确拒绝,不能静默替换。 -构造器、静态初始化器、生成桥接/合成方法和仍涉及框架状态的候选保持原兼容边界;放行继承类的独立方法不等于放行包含 `invoke-super` 等外部调用的方法体。跳过项仍计入覆盖率分母,并保留 `ui_runtime_glue`、`compiler_generated_bridge`、`data_resource_runtime_glue` 或 `playback_compatibility` 等实际分类。精确必保清单同样受方法兼容检查约束,必保项被排除时任务失败,不会自动降级。所有候选都不可转换时仍返回 `PVM2_ZERO_METHODS`,不会把零转换记为成功。这些规则不代表已识别应用全部关键业务;完整覆盖率需用配套的新打包器和运行时重新生成。 +数据、资源和媒体框架的专用兼容规则仍仅放行不访问外部状态、不调用其他方法的独立叶子方法。构造器、静态初始化器、生成桥接/合成方法、组件中的声明同步方法及 `hashCode/finalize` 等特殊对象契约仍保留。同步块已支持不代表所有声明同步方法都已开放。跳过项始终计入覆盖率分母,并保留实际分类。 + +精确必保清单同样受方法兼容检查约束,必保项被排除时任务失败,不会自动降级。所有候选都不可转换时仍返回 `PVM2_ZERO_METHODS`。本轮镜像协议为 v9,需要使用配套打包器和运行时重新加固;旧运行时拒绝新镜像,新运行时继续读取旧协议。覆盖报告只证明选择范围内的产物转换,不代表全部关键业务或全部运行路径已验收。 兼容排除的本地原因带有首个阻断条件,例如 `ui_runtime_glue:virtual_contract`;脱敏摘要分别统计特殊对象方法或虚方法契约未验证、同步方法及叶子方法白名单之外的指令,并兼容旧打包器返回的异常区排除原因。它们表示准入限制,不能据此认定方法一定是生命周期回调。旧报告没有细分信息时仍按原分类展示,不能反推具体方法体。基础预检通过也不代表 PVM2 方法覆盖已经通过。 diff --git a/shield-stub/compat/api19-rust/Cargo.lock b/shield-stub/compat/api19-rust/Cargo.lock index 5247f87..d23f88d 100644 --- a/shield-stub/compat/api19-rust/Cargo.lock +++ b/shield-stub/compat/api19-rust/Cargo.lock @@ -242,7 +242,7 @@ checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "mocikashield-api19" -version = "1.8.4" +version = "1.8.5" dependencies = [ "cc", "chacha20poly1305", diff --git a/shield-stub/compat/api19-rust/Cargo.toml b/shield-stub/compat/api19-rust/Cargo.toml index bdf2769..adf04c9 100644 --- a/shield-stub/compat/api19-rust/Cargo.toml +++ b/shield-stub/compat/api19-rust/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mocikashield-api19" -version = "1.8.4" +version = "1.8.5" edition = "2021" license = "MIT OR Apache-2.0" build = "../../src/main/rust/build.rs" diff --git a/shield-stub/src/main/rust/Cargo.toml b/shield-stub/src/main/rust/Cargo.toml index d70838a..e6bf3c2 100644 --- a/shield-stub/src/main/rust/Cargo.toml +++ b/shield-stub/src/main/rust/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mocikashield" -version = "1.8.4" +version = "1.8.5" edition = "2021" license = "MIT OR Apache-2.0" diff --git a/tests/README.md b/tests/README.md index 411575d..805599b 100644 --- a/tests/README.md +++ b/tests/README.md @@ -45,11 +45,13 @@ Windows classpath 分隔符改为 `;`。输出目录必须不存在。检查恢 ## PVM2 必保方法清理与 v8 声明参数 -`make test-pvm2` 验证 schema 2 报告及认证策略,`make test-pvm2-runtime` 用实际 Java 编译器/加密器生成三种 ISA 的普通、必保和异常镜像,再由生产 C++ 在宿主 JVM 中执行。断言覆盖普通缓存保留、必保方法正常/异常退出清理、递归与跨线程最后引用释放、8 线程竞争,以及旧 v6 解析和未知/截断策略拒绝。可用 `PVM2_SANITIZER=thread python3 tests/scripts/check-pvm2-runtime.py` 检查竞争;默认使用 ASan/UBSan。宿主结果不代替 Android 设备或性能验收。 +`make test-pvm2` 验证 schema 2 报告及认证策略,`make test-pvm2-runtime` 用实际 Java 编译器/加密器生成三种 ISA 的普通、必保和异常镜像,再由生产 C++ 在宿主 JVM 中执行。断言覆盖普通缓存保留、必保方法正常及异常返回后的清理、递归和并发、认证失败不使用明文及阻断时的清理。 -同一检查包含有限的结构变换试验:六种整数比较、条件反转加跳转、三种 ISA,在生产解释器中执行 900 次边界对照;恢复检查对 180 个随机镜像再次规范化比较关系。该规则仍可跨构建复用,因此没有将这种简单变换启用为生产抗还原策略。接收者准入另覆盖等值边、未知值、字段/数组访问的正常边、对象与结果共用寄存器、绕过访问的分支汇合、宽值双寄存器覆盖、lit8 高位目标和异常入口覆盖 `this` 的正反例。写寄存器范围复用已锁定 dexlib2 的指令元数据。 新增异常边只传播实际可抛异常指令执行前的状态,汇合所有前驱;`instanceof` 成功边可传播源对象非空,任何源/结果写入及不一致汇合都会使关系失效。生产 JNI 对照另覆盖两种语义、三种 ISA 的 900 次类型检查和 catch 路径。 +可空接收者不再因分支或异常区被静态拒绝。生产 JNI 对照覆盖两种接收者语义、三种 ISA 的 900 次正常与异常路径;结构检查仍拒绝损坏指令、非指令边界的跳转、错误载荷、越界调用寄存器及异常处理表。代码长度检查覆盖 4096/4097 个代码单元边界、数组载荷展开超过 65535 字节的拒绝,以及不丢失字符的 UTF-8 编码边界。 -v8 在寄存器映射后追加参数数量及规范化类型表,并与镜像一起认证。对象包装类按声明保留为引用,`long`/`double` 仅在声明为基本类型时占两格。检查覆盖五类包装引用、null、混合宽参数、错误数量/类型拒绝,以及 v6/v7 解析兼容。新产物必须重建标准资源和 Packer;旧资源在打包前被版本校验拒绝。 +v8 追加经认证的参数类型表,包装对象按声明保留引用。v9 的 `invoke-super` 方法引用记录 `直接父类|原引用类型->方法签名`,类调用从声明父类分派,接口调用保留原接口;旧运行时因协议版本不匹配拒绝新镜像。新运行时仍能解析 v6/v7/v8,未知未来版本必须拒绝。必须一起重建打包器和标准壳资源。 + +`ANDROID_SDK_ROOT=/path/to/sdk python3 tests/scripts/check-pvm2-art.py --output target/pvm2-art --serial 明确设备序列号` 生成自有 Java/D8 整包,实际验证未加固基线、加固首次启动、再次启动、覆盖安装及装回基线。默认 46 个方法通过最终产物验证,每次执行 525 项断言,覆盖字段/数组/对象状态、调用、空值和异常、锁竞争、较大方法、字符串空字符/补充平面字符/驻留身份,以及祖先引用和派生接收者下的父类调用。`--min-api 26` 额外保留原生接口默认方法,默认 23 验证 D8 脱糖;`--without-resource-table` 验证无资源表。省略 `--serial` 只构建检查,不能当作执行通过。同一设备重复安装必须复用输出目录内的测试证书。 加载器复制优化的检查为 `shield-stub` 的 `testReleaseUnitTest` 与 `cargo test --manifest-path shield-stub/src/main/rust/Cargo.toml bin_loader`:前者检查完整 ZIP 字节及伪造长度拒绝,后者检查借用密文原地址、v5/v6 全部截断位置和原认证往返。`MOCIKA_RUNTIME_PROFILE=1` 的诊断构建可输出冷解密和缓存命中阶段的 Java/Native 堆分配观测;发布性能对照使用未启用诊断的资源,堆分配数也不等于 PSS 或泄漏结论。 diff --git a/tests/java/com/yqsh/protector/packer/Pvm2ProtectionCheck.java b/tests/java/com/yqsh/protector/packer/Pvm2ProtectionCheck.java index c333ac7..e34f9d6 100644 --- a/tests/java/com/yqsh/protector/packer/Pvm2ProtectionCheck.java +++ b/tests/java/com/yqsh/protector/packer/Pvm2ProtectionCheck.java @@ -19,87 +19,8 @@ public final class Pvm2ProtectionCheck { private static final String KEY = "000102030405060708090a0b0c0d0e0f"; public static void main(String[] args) throws Exception { - // if-ne 的相等落空边、if-eq 的相等跳转边均可继承 this 的非空事实。 - short[] equalFallthrough = {0x1033, 5, 0x106e, 0, 1, 0x000e}; - assert Pvm2Safety.check(equalFallthrough, 2, 2, false, false) == null; - assert Pvm2Safety.check(new short[]{0x1032, 3, 0x000e, 0x106e, 0, 1, 0x000e}, 2, 2, false, false) == null; - short[] unequalFallthrough = equalFallthrough.clone(); unequalFallthrough[0] = 0x1032; - assert Pvm2Safety.check(unequalFallthrough, 2, 2, false, false) != null; - assert Pvm2Safety.check(equalFallthrough, 2, 2, true, false) != null; - assert Pvm2Safety.check(new short[]{0x1033, 6, 0x0112, 0x106e, 0, 1, 0x000e}, 2, 2, false, false) != null; - // 首次调用可能抛 NPE,但正常边之后的控制流可以复用同一接收者。 - short[] repeated = {0x106e, 0, 1, 0x0038, 5, 0x106e, 0, 1, 0x000e}; - assert Pvm2Safety.check(repeated, 2, 2, true, false) == null; - assert Pvm2Safety.check(repeated, 2, 2, true, true) != null; - // 字段/数组正常边可证明对象非空,但读取结果、写入值和异常边不能继承该事实。 - for (short[] access : List.of(new short[]{0x1021}, new short[]{0x1052, 0}, - new short[]{0x1054, 0}, new short[]{0x1059, 0}, - new short[]{0x0044, 0x0201}, new short[]{0x004b, 0x0201})) { - short[] flow = Arrays.copyOf(access, access.length + 6); - short[] tail = {0x0238, 5, 0x106e, 0, 1, 0x000e}; - System.arraycopy(tail, 0, flow, access.length, tail.length); - assert Pvm2Safety.check(flow, 3, 3, true, false) == null; - flow[access.length + 4] = 0; // v0 的字段值/数组元素仍可能为空。 - assert Pvm2Safety.check(flow, 3, 3, true, false) != null; - } - assert Pvm2Safety.check(new short[]{0x1154, 0, 0x0238, 5, 0x106e, 0, 1, 0x000e}, 3, 3, true, false) != null; - assert Pvm2Safety.check(new short[]{0x0146, 0x0201, 0x0238, 5, 0x106e, 0, 1, 0x000e}, 3, 3, true, false) != null; - // 一条路径绕过解引用时,汇合点仍按未知处理。 - assert Pvm2Safety.check(new short[]{0x0238, 4, 0x1052, 0, 0x106e, 0, 1, 0x000e}, 3, 3, true, false) != null; - // wide 写入必须清掉第二格,不能继续相信原来的非空值。 - for (short[] write : List.of(new short[]{0x0004}, new short[]{0x0005, 0}, - new short[]{0x0006, 0, 0}, new short[]{0x000b}, new short[]{0x0016, 0}, - new short[]{0x0017, 0, 0}, new short[]{0x0018, 0, 0, 0, 0}, new short[]{0x0019, 0}, - new short[]{0x0045, 0}, new short[]{0x0053, 0}, new short[]{0x0061, 0}, - new short[]{0x007d}, new short[]{0x0081}, new short[]{0x0083}, new short[]{0x0086}, - new short[]{0x009b, 0}, new short[]{0x00ab, 0}, new short[]{0x00bb}, new short[]{0x00cb})) { - short[] flow = new short[write.length + 8]; - flow[0] = 0x011a; - System.arraycopy(write, 0, flow, 2, write.length); - short[] tail = {0x0238, 5, 0x106e, 0, 1, 0x000e}; - System.arraycopy(tail, 0, flow, 2 + write.length, tail.length); - assert Pvm2Safety.check(flow, 3, 0, true, false) != null; - } - // lit8 的目标 v16 不能被错误解码为 v0;对象自移动和 check-cast 保留事实。 - assert Pvm2Safety.check(new short[]{0x101a, 0, 0x10d8, 0, 0x0038, 5, 0x0174, 0, 16, 0x000e}, 17, 0, true, false) != null; - assert Pvm2Safety.check(new short[]{0x011a, 0, 0x1107, 0x011f, 0, 0x0038, 5, 0x106e, 0, 1, 0x000e}, 2, 0, true, false) == null; - // this 寄存器在 try 前被覆盖后,catch 不能重新把它当成入口时的非空 this。 - var tryConstructor = com.android.dex.Code.Try.class.getDeclaredConstructor(int.class, int.class, int.class); - tryConstructor.setAccessible(true); - var caught = new com.android.dex.Code(2, 2, 1, 0, - new short[]{0x1007, 0x001f, 0, 0x000e, 0x010d, 0x106e, 0, 0, 0x000e}, - new com.android.dex.Code.Try[]{tryConstructor.newInstance(1, 2, 0)}, - new com.android.dex.Code.CatchHandler[]{new com.android.dex.Code.CatchHandler(new int[0], new int[0], 4, 0)}); - assert Pvm2Safety.check(caught, false) != null; - // 未改写的 this 可以沿真实抛异常边进入 catch;只有正常边建立的事实不可沿异常边传播。 - for (boolean preserved : new boolean[]{true, false}) { - short[] instructions = {preserved ? (short)0x0000 : (short)0x1007, - 0x001f, 0, 0x000e, 0x010d, 0x106e, 0, 0, 0x000e}; - var precise = new com.android.dex.Code(2, 2, 1, 0, instructions, - new com.android.dex.Code.Try[]{tryConstructor.newInstance(1, 2, 0)}, caught.getCatchHandlers()); - assert (Pvm2Safety.check(precise, false) == null) == preserved; - } - // 两条抛异常路径汇合,任一边覆盖 this 都必须拒绝;不抛异常的覆盖不污染 catch。 - for (boolean secondThrow : new boolean[]{false, true}) { - short[] instructions = {0x001f, 0, 0x1007, secondThrow ? (short)0x001f : (short)0x0000, - 0, 0x000e, 0x010d, 0x106e, 0, 0, 0x000e}; - var merged = new com.android.dex.Code(2, 2, 1, 0, instructions, - new com.android.dex.Code.Try[]{tryConstructor.newInstance(0, 5, 0)}, - new com.android.dex.Code.CatchHandler[]{new com.android.dex.Code.CatchHandler(new int[0], new int[0], 6, 0)}); - assert (Pvm2Safety.check(merged, false) == null) == !secondThrow; - } - // instanceof 的真假边、覆盖及汇合:仅为真且关系仍有效时可证明接收者。 - assert Pvm2Safety.check(new short[]{0x1020, 0, 0x0038, 5, 0x106e, 0, 1, 0x000e}, 2, 1, true, false) == null; - assert Pvm2Safety.check(new short[]{0x1020, 0, 0x0039, 3, 0x000e, 0x106e, 0, 1, 0x000e}, 2, 1, true, false) == null; - assert Pvm2Safety.check(new short[]{0x1020, 0, 0x0039, 5, 0x106e, 0, 1, 0x000e}, 2, 1, true, false) != null; - for (short write : new short[]{0x0112, 0x0012, 0x0016}) { - short[] overwritten = write == 0x0016 - ? new short[]{0x1020, 0, write, 0, 0x0038, 5, 0x106e, 0, 1, 0x000e} - : new short[]{0x1020, 0, write, 0x0038, 5, 0x106e, 0, 1, 0x000e}; - assert Pvm2Safety.check(overwritten, 2, 1, true, false) != null; - } - assert Pvm2Safety.check(new short[]{0x0238, 4, 0x1020, 0, 0x0038, 5, 0x106e, 0, 1, 0x000e}, 3, 2, true, false) != null; Path root = Path.of(args[0]); + checkInstructionBoundaries(root); checkEmptyResourceTable(root); checkZeroMethodReports(root); checkMethodCompatibility(root); @@ -358,6 +279,76 @@ private static void writeClasses(Path path, List classes) thr try { pool.writeTo(store); } finally { store.close(); } } + private static void checkInstructionBoundaries(Path root) throws Exception { + // 分支后的可空调用是合法程序;空值及 catch/finally 的结果由 ART 整包回归验证。 + for (short[] instructions : List.of(new short[]{0x1033, 5, 0x106e, 0, 1, 0x000e}, + new short[]{0x1032, 5, 0x106e, 0, 1, 0x000e}, + new short[]{0x0238, 4, 0x1052, 0, 0x106e, 0, 1, 0x000e})) { + var code = new com.android.dex.Code(3, 2, 1, 0, instructions, + new com.android.dex.Code.Try[0], new com.android.dex.Code.CatchHandler[0]); + assert Pvm2Safety.check(code) == null; + } + for (short[] malformed : List.of(new short[]{0x106e}, // 截断指令 + new short[]{0x0228, 0x106e, 0, 1, 0x000e}, // 跳入指令中间 + new short[]{0x1028}, // 跳出方法 + new short[]{0x006e, 0, 0, 0x000e}, // 实例调用缺接收者 + new short[]{0x606e, 0, 0, 0x000e}, // 35c 超过五格 + new short[]{0x106e, 0, 3, 0x000e}, // 接收者越界 + new short[]{0x2074, 0, 2, 0x000e}, // range 尾寄存器越界 + new short[]{0x002b, 4, 0, 0, 0x0100, 1, 0, 0, 1, 0})) { // case 跳入指令中间 + var code = new com.android.dex.Code(3, 2, 1, 0, malformed, + new com.android.dex.Code.Try[0], new com.android.dex.Code.CatchHandler[0]); + assert Pvm2Safety.check(code) != null : Arrays.toString(malformed); + } + var constructor = com.android.dex.Code.Try.class.getDeclaredConstructor(int.class, int.class, int.class); + constructor.setAccessible(true); + for (int start : new int[]{0, 1}) for (int handler : new int[]{1, 4}) { + var code = new com.android.dex.Code(2, 2, 1, 0, + new short[]{0x106e, 0, 1, 0x000e, 0x000d, 0x000e}, + new com.android.dex.Code.Try[]{constructor.newInstance(start, 3 - start, 0)}, + new com.android.dex.Code.CatchHandler[]{new com.android.dex.Code.CatchHandler(new int[0], new int[0], handler, 0)}); + assert (Pvm2Safety.check(code) == null) == (start == 0 && handler == 4); + } + // 字符串可包含空字符和代理对,但不能在 UTF-8 编码时静默替换孤立代理项。 + for (String text : List.of("中文\u0000\ud83d\ude00", new String(new char[]{0xd800}), "a".repeat(65536))) { + var method = new ImmutableMethod(OWNER, "text", List.of(), "Ljava/lang/String;", 9, Set.of(), Set.of(), + new ImmutableMethodImplementation(1, List.of( + new ImmutableInstruction21c(Opcode.CONST_STRING, 0, new ImmutableStringReference(text)), + new ImmutableInstruction11x(Opcode.RETURN_OBJECT, 0)), List.of(), List.of())); + Path path = root.resolve("string-boundary.dex"); + writeClasses(path, List.of(calculationOwner(OWNER, "Ljava/lang/Object;", List.of(), List.of(method)))); + var dex = new com.android.dex.Dex(Files.readAllBytes(path)); + var cls = dex.classDefs().iterator().next(); + var code = dex.readCode(dex.readClassData(cls).getDirectMethods()[0]); + var result = Pvm2Compiler.tryCompile(dex, code, "Ljava/lang/String;", true); + if (text.length() == 1) assert result.failReason.equals("unpaired UTF-16 surrogate"); + else if (text.length() > 65535) assert result.failReason.equals("string too long"); + else assert result.isOk() : result.failReason; + } + var superCall = new com.android.dex.Code(2, 2, 2, 0, + new short[]{0x206f, 0, 0x0010, 0x000a, 0x000f}, + new com.android.dex.Code.Try[0], new com.android.dex.Code.CatchHandler[0]); + assert Pvm2Compiler.tryCompile(null, superCall, "I", false, null, false, new String[]{"I"}) + .failReason.equals("invoke-super requires declaring class context"); + // 数组载荷展开不能溢出镜像的 u16 代码长度字段。 + short[] expanded = new short[4010]; + expanded[0] = 0x0026; expanded[1] = 6; expanded[3] = 0x000e; + expanded[6] = 0x0300; expanded[7] = 1; expanded[8] = 8000; + var expandedCode = new com.android.dex.Code(1, 1, 0, 0, expanded, + new com.android.dex.Code.Try[0], new com.android.dex.Code.CatchHandler[0]); + assert Pvm2Compiler.tryCompile(null, expandedCode, "V", true, null, false, new String[]{"[B"}) + .failReason.equals("compiled code too large"); + // 长度上限在编译前生效,零寄存器静态 void 合法。 + for (int size : new int[]{1, 4096, 4097}) { + short[] units = new short[size]; units[size - 1] = 0x000e; + var code = new com.android.dex.Code(0, 0, 0, 0, units, + new com.android.dex.Code.Try[0], new com.android.dex.Code.CatchHandler[0]); + var result = Pvm2Compiler.tryCompile(null, code, "V", true); + assert result.isOk() == (size <= 4096) : result.failReason; + if (size > 4096) assert result.failReason.equals("too large"); + } + } + private static void checkMethodCompatibility(Path root) throws Exception { for (String reason : List.of("ui_runtime_glue", "data_resource_runtime_glue", "compiler_generated_bridge", "playback_compatibility")) { assert Pvm2Admission.classify(reason) == Pvm2Admission.SkipReason.compatibility; @@ -407,7 +398,7 @@ private static void checkMethodCompatibility(Path root) throws Exception { var obfuscated = calculation("Lfixture/a;", "callback", 1); assert AutoVmpPolicy.exclusionReason(calculationOwner("Lfixture/a;", "Landroid/app/Activity;", List.of(), List.of()), obfuscated) == null; assert AutoVmpPolicy.exclusionReason(calculationOwner("Lfixture/a;", "Ljava/lang/Object;", List.of("Landroid/view/View$OnClickListener;"), List.of()), obfuscated) == null; - // 字段/数组元素访问、调用和锁仍不能借叶子方法规则放行。 + // 组件转交共用编译器逐指令验证;数据与媒体框架仍保留专用兼容边界。 var field = new ImmutableFieldReference(type, "state", "I"); var call = new ImmutableMethodReference(type, "external", List.of(), "I"); for (var instruction : List.of(new ImmutableInstruction21c(Opcode.SGET, 0, field), new ImmutableInstruction22c(Opcode.IGET, 0, 1, field), @@ -418,7 +409,9 @@ private static void checkMethodCompatibility(Path root) throws Exception { new ImmutableInstruction21c(Opcode.NEW_INSTANCE, 0, new ImmutableTypeReference(type)))) { var method = new ImmutableMethod(type, "stateful", List.of(), "I", 9, Set.of(), Set.of(), new ImmutableMethodImplementation(3, List.of(instruction, new ImmutableInstruction11x(Opcode.RETURN, 0)), List.of(), List.of())); - assert AutoVmpPolicy.exclusionReason(plain, method).equals("ui_runtime_glue:non_leaf_instruction") : instruction.getOpcode(); + assert AutoVmpPolicy.exclusionReason(plain, method) == null : instruction.getOpcode(); + for (String owner : List.of("Lfixture/data/Rules;", "Lfixture/audio/Rules;")) + assert AutoVmpPolicy.exclusionReason(calculationOwner(owner, "Ljava/lang/Object;", List.of(), List.of()), method) != null; } Path work = Files.createDirectory(root.resolve("method-compatibility")); diff --git a/tests/native/pvm2_runtime_check.cpp b/tests/native/pvm2_runtime_check.cpp index 01bd454..e8e68ab 100644 --- a/tests/native/pvm2_runtime_check.cpp +++ b/tests/native/pvm2_runtime_check.cpp @@ -98,7 +98,7 @@ int main(int argc, char** argv) { if (i >= 98) { std::ifstream input(std::string(argv[1]) + "/image" + std::to_string(i - 98) + ".bin", std::ios::binary); bytes.assign(std::istreambuf_iterator(input), {}); - assert(bytes.size() > 18 && bytes[4] == PVM2_VERSION_V8 && bytes[15] == (i - 98) % 3 && bytes[18] == (i >= 101 ? 1 : 0)); + assert(bytes.size() > 18 && bytes[4] == PVM2_VERSION_V9 && bytes[15] == (i - 98) % 3 && bytes[18] == (i >= 101 ? 1 : 0)); } if (i == 97) { bytes[16] = 1; } // 认证成功、字符串池截断 auto enc = record(bytes, key, i); @@ -437,6 +437,8 @@ int main(int argc, char** argv) { std::vector policy_image(std::istreambuf_iterator(policy_input), {}); assert(parse_pvm2(policy_image.data(), policy_image.size(), &parsed) && parsed.clear_after_use); auto legacy = policy_image; + legacy[4] = 8; + assert(parse_pvm2(legacy.data(), legacy.size(), &parsed) && parsed.clear_after_use); // 此样本参数为空,类型表在虚拟指令前只有一个 count 字节。 size_t args_offset = legacy.size() - (size_t(legacy[12]) | (size_t(legacy[13]) << 8)) - 1; legacy.erase(legacy.begin() + args_offset); @@ -448,7 +450,7 @@ int main(int argc, char** argv) { auto broken = policy_image; if (fault == 0) broken[18] = 2; if (fault == 1) broken.resize(18); - if (fault == 2) broken[4] = 9; + if (fault == 2) broken[4] = PVM2_VERSION_V9 + 1; assert(!parse_pvm2(broken.data(), broken.size(), &parsed)); assert(!parsed.valid && !parsed.clear_after_use && parsed.code.capacity() == 0); } diff --git a/tests/scripts/check-pvm2-art.py b/tests/scripts/check-pvm2-art.py index baf16c8..483cd06 100644 --- a/tests/scripts/check-pvm2-art.py +++ b/tests/scripts/check-pvm2-art.py @@ -27,7 +27,10 @@ int compute(int value); default int defaultValue(int value) { return value * 3; } } - public static class Base { public int compute(int value) { return -1; } } + public static class Base { + public int compute(int value) { return -1; } + public int sum(int a, int b, int c, int d, int e, int f) { return -2; } + } public static class RulesView extends Base implements Contract { @Override public int compute(int value) { return value + 7; } public long compute(long value) { return value ^ 0x123456789abcdefL; } @@ -97,10 +100,79 @@ } } public double floating(double value) { return value * 1.5d + 2.0d; } + private Object state; + private int count; + private long wide; + private double decimal; + private float fraction; + private boolean enabled; + private byte small; + private short medium; + private char character; + private static Object shared; + public Object fields(Object value) { + state = value; shared = value; count++; wide = -1234567890123L; + decimal = -3.25d; fraction = 1.5f; enabled = true; small = -7; medium = -1234; character = '\ufffe'; + if (wide != -1234567890123L || decimal != -3.25d || fraction != 1.5f || !enabled + || small != -7 || medium != -1234 || character != '\ufffe' || shared != value) + throw new AssertionError("字段损坏"); + return state; + } + public String text() { return "中文\u0000\ud83d\ude00"; } + public Object construct(Object value) { return new Holder(value).get(); } + public int calls(Contract other, int value) { + return other.compute(value) + privateValue(value) + staticValue(value) + Math.abs(value); + } + public String nullable(Object value, boolean clear) { + if (clear) value = null; + try { return value.toString(); } catch (NullPointerException error) { return "null"; } + } + public int invokeCatch(Holder value) { + try { return value.fail(); } catch (IllegalArgumentException error) { return 91; } + catch (NullPointerException error) { return 92; } finally { count++; } + } + public Object lockedBlock(Object lock, Object value, boolean fail) { + synchronized (lock) { + state = value; count++; + if (fail) throw new IllegalStateException("测试异常"); + return state; + } + } + public Object[] arrays(Object value) { + Object[] result = new Object[]{value, this, null}; + int[] numbers = new int[]{1, 2, 3}; + numbers[1] += numbers[0]; + result[2] = Integer.valueOf(numbers[1]); + return result; + } + public Object framework(android.content.Context context) { + android.widget.TextView view = new android.widget.TextView(context); + view.setText(text()); view.setTag(this); + return view; + } + public long invokeWide(Holder value, long a, double b, float c) { return value.wide(a, b, c); } + public int recursive(int value) { return value <= 0 ? 1 : value * recursive(value - 1); } + public int interfaceDefault(Contract value) { return value.defaultValue(11); } + public int defaultSuper(int value) { return Contract.super.defaultValue(value); } + @Override public int sum(int a, int b, int c, int d, int e, int f) { return a+b+c+d+e+f; } + /* LARGE_METHOD */ + + } + public static class Holder { + final Object value; + Holder(Object value) { this.value = value; } + Object get() { return value; } + int fail() { throw new IllegalArgumentException("测试异常"); } + long wide(long a, double b, float c) { return a + (long)b + (long)c; } } public static class ChildView extends RulesView { @Override public int compute(int value) { return value + 17; } @Override public Object self() { return this; } + public int parentCompute(int value) { return super.compute(value); } + public int parentMany(int a, int b, int c, int d, int e, int f) { return super.sum(a,b,c,d,e,f); } + } + public static class GrandChild extends ChildView { + @Override public int compute(int value) { return value + 100; } } public static class RejectedView extends Base { private int counter; @@ -178,9 +250,52 @@ } for (double value : new double[]{-Double.MAX_VALUE, -0.0d, 0.0d, Double.NaN, Double.POSITIVE_INFINITY, 3.25d}) check(Double.doubleToLongBits(parent.floating(value)) == Double.doubleToLongBits(value * 1.5d + 2.0d), "浮点特殊值"); + + for (Object input : new Object[]{null, first, array, parent}) { + check(parent.fields(input) == input && parent.construct(input) == input, "对象状态与构造"); + Object[] values = parent.arrays(input); + check(values[0] == input && values[1] == parent && values[2].equals(3), "对象和整数数组"); + check(parent.nullable(input, true).equals("null"), "分支空接收者捕获"); + } + check(parent.text() == "中文\u0000\ud83d\ude00", "字符串编码与驻留身份"); + check(parent.text().length() == 5 && parent.text().charAt(2) == 0, "字符串空字符和代理对"); + check(parent.calls(child, 7) == (24 + (7 ^ 0x5a) - 4 + 7), "接口私有静态嵌套调用"); + check(parent.nullable("value", false).equals("value") && parent.nullable(null, false).equals("null"), "调用异常语义"); + check(parent.invokeCatch(new Holder(first)) == 91 && parent.invokeCatch(null) == 92, "调用异常传播及清理"); + check(parent.invokeWide(new Holder(first), Long.MIN_VALUE, 12.75d, -2.5f) == Long.MIN_VALUE + 10, "宽参数调用"); + check(parent.recursive(6) == 720 && parent.interfaceDefault(child) == 33, "递归与默认接口调用"); + check(child.parentCompute(5) == 12, "父类非虚分派"); + for (int value : ints) { + int expected = value; + for (int i = 0; i < 160; i++) expected = (expected * 31) ^ i; + check(parent.large(value) == expected, "超过旧代码长度上限的方法"); + } + Object lock = new Object(); + check(parent.lockedBlock(lock, first, false) == first, "锁内对象状态"); + try { parent.lockedBlock(lock, other, true); throw new AssertionError("异常丢失"); } + catch (IllegalStateException expected) { check(parent.fields(first) == first, "锁异常传播"); } + Thread contender = new Thread(() -> { synchronized (lock) { } }); + contender.start(); contender.join(2000); check(!contender.isAlive(), "异常退出释放锁"); + try { parent.lockedBlock(null, first, false); throw new AssertionError("空锁未抛出"); } + catch (NullPointerException expected) { check(true, "空锁异常"); } + java.lang.reflect.Field counter = RulesView.class.getDeclaredField("count"); + counter.setAccessible(true); + int before = counter.getInt(parent); + Thread[] workers = new Thread[4]; + for (int i = 0; i < workers.length; i++) { + workers[i] = new Thread(() -> { for (int j = 0; j < 200; j++) parent.lockedBlock(lock, first, false); }); + workers[i].start(); + } + for (Thread worker : workers) { worker.join(5000); check(!worker.isAlive(), "竞争线程完成"); } + check(counter.getInt(parent) == before + 800, "跨线程同步块状态一致"); + android.widget.TextView widget = (android.widget.TextView)parent.framework(this); + check(widget.getTag() == parent && widget.getText().toString().equals(parent.text()), "真实框架对象调用"); RejectedView rejected = new RejectedView(); check(rejected.stateful() == 1 && rejected.stateful() == 2 && rejected.callOther(-3) == 3, "状态和调用保留"); check(rejected.superCompute(5) == -1 && rejected.locked() == 5 && rejected.hashCode() == 13, "super 同步与对象契约保留"); + check(new GrandChild().parentCompute(5) == 12, "祖先引用按声明父类分派"); + check(new GrandChild().parentMany(1,2,3,4,5,6) == 21, "range 父类调用"); + check(parent.defaultSuper(7) == 21, "接口默认父实现"); Log.e("Pvm2Regression", "PVM2_REGRESSION_OK token=" + getIntent().getStringExtra("run_token") + " checks=" + checks + " pages=" + android.system.Os.sysconf(android.system.OsConstants._SC_PAGESIZE)); } catch (Throwable error) { throw new AssertionError("PVM2 回归失败 checks=" + checks, error); } @@ -188,9 +303,12 @@ } ''' +SOURCE = SOURCE.replace('/* LARGE_METHOD */', 'public int large(int value) {\n' + '\n'.join('value = (value * 31) ^ ' + str(i) + ';' for i in range(160)) + '\nreturn value; }') + parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('--serial', action='append', default=[], help='明确指定本轮有权测试的设备,可重复传入;省略只构建和检查覆盖') parser.add_argument('--output', type=Path, default=ROOT / 'target/pvm2-art-checks') +parser.add_argument('--min-api', type=int, choices=[23, 26], default=23, help='23 验证 D8 脱糖,26 验证原生接口默认方法') parser.add_argument('--without-resource-table', action='store_true', help='生成完全不带 resources.arsc 的 APK,默认保留合法空表') args = parser.parse_args() work = args.output.resolve() @@ -220,7 +338,51 @@ def run(command): run([bt / 'aapt2', 'link', '-o', work / 'base.apk', '--manifest', work / 'AndroidManifest.xml', '-I', android]) run(['javac', '--release', '8', '-cp', android, '-d', work / 'classes', work / 'CompatibilityActivity.java']) run(['jar', 'cf', work / 'classes.jar', '-C', work / 'classes', '.']) -run([bt / 'd8', '--release', '--lib', android, '--min-api', '23', '--output', work / 'dex', work / 'classes.jar']) +run([bt / 'd8', '--release', '--lib', android, '--min-api', str(args.min_api), '--output', work / 'dex', work / 'classes.jar']) +# 将合法 super 引用规范到祖先,覆盖混淆器可能产生的引用;基线也使用同一 DEX。 +(work / 'RewriteSuper.java').write_text(r'''import java.nio.file.*; +import java.util.*; +import com.android.tools.smali.dexlib2.*; +import com.android.tools.smali.dexlib2.dexbacked.*; +import com.android.tools.smali.dexlib2.iface.*; +import com.android.tools.smali.dexlib2.iface.instruction.*; +import com.android.tools.smali.dexlib2.iface.instruction.formats.*; +import com.android.tools.smali.dexlib2.immutable.instruction.*; +import com.android.tools.smali.dexlib2.immutable.reference.*; +import com.android.tools.smali.dexlib2.rewriter.*; +import com.android.tools.smali.dexlib2.writer.pool.*; +import com.android.tools.smali.dexlib2.writer.io.*; +public class RewriteSuper { + public static void main(String[] args) throws Exception { + var dex = new DexBackedDexFile(Opcodes.getDefault(), Files.readAllBytes(Path.of(args[0]))); + int[] changed = {0, 0}; + var rewriter = new DexRewriter(new RewriterModule() { + public Rewriter getInstructionRewriter(Rewriters rewriters) { + return instruction -> { + if (instruction.getOpcode() == Opcode.INVOKE_SUPER || instruction.getOpcode() == Opcode.INVOKE_SUPER_RANGE) { + var method = (com.android.tools.smali.dexlib2.iface.reference.MethodReference)((ReferenceInstruction)instruction).getReference(); + if (method.getDefiningClass().endsWith("$RulesView;")) { + var ref = new ImmutableMethodReference(method.getDefiningClass().replace("$RulesView;", "$Base;"), method.getName(), method.getParameterTypes(), method.getReturnType()); + if (instruction instanceof Instruction35c i) { + changed[0]++; + return new ImmutableInstruction35c(i.getOpcode(), i.getRegisterCount(), i.getRegisterC(), i.getRegisterD(), i.getRegisterE(), i.getRegisterF(), i.getRegisterG(), ref); + } + var i = (Instruction3rc)instruction; changed[1]++; + return new ImmutableInstruction3rc(i.getOpcode(), i.getStartRegister(), i.getRegisterCount(), ref); + } + } + return instruction; + }; + } + }); + var pool = new DexPool(Opcodes.getDefault()); + for (var cls : rewriter.getDexFileRewriter().rewrite(dex).getClasses()) pool.internClass(cls); + assert changed[0] > 0 && changed[1] > 0 : Arrays.toString(changed); + var output = new FileDataStore(Path.of(args[0]).toFile()); try { pool.writeTo(output); } finally { output.close(); } + } +}''') +run(['javac', '--release', '17', '-cp', ROOT / 'tools/xop-pvm2-packer.jar', '-d', work, work / 'RewriteSuper.java']) +run(['java', '-ea', '-cp', str(work) + os.pathsep + str(ROOT / 'tools/xop-pvm2-packer.jar'), 'RewriteSuper', work / 'dex/classes.dex']) with zipfile.ZipFile(work / 'base.apk') as base, zipfile.ZipFile(work / 'input-unsigned.apk', 'w') as archive: for entry in base.infolist(): if not args.without_resource_table or entry.filename != 'resources.arsc': @@ -243,6 +405,7 @@ def sign(source, destination): sign('protected.apk', 'protected-signed.apk') report = json.loads((work / 'protected-signed.apk.protection.json').read_text()) assert report['output_sha256'] == hashlib.sha256((work / 'protected-signed.apk').read_bytes()).hexdigest() +assert any(row['descriptor'].endswith('->large(I)I') and row['input_instruction_bytes'] > 1024 and row['artifact_verified'] for row in report['methods']) counts = Counter() for row in report['methods']: if '-><' in row['descriptor']: @@ -250,20 +413,19 @@ def sign(source, destination): elif row['descriptor'].endswith('$RulesView;->defaultValue(I)I'): # D8 为默认接口方法生成转发桥;它应留在 ART,运行时仍须验证接口调用结果。 assert not row['artifact_verified'] and row['reason'] == 'compiler_generated_bridge', row - elif '$RejectedView;' in row['descriptor']: + elif '$RejectedView;' in row['descriptor'] and row['descriptor'].split('->')[1].split('(')[0] not in ['stateful', 'callOther', 'superCompute']: assert not row['artifact_verified'], row - expected = {'stateful': 'ui_runtime_glue:non_leaf_instruction', 'callOther': 'ui_runtime_glue:non_leaf_instruction', - 'superCompute': 'ui_runtime_glue:non_leaf_instruction', 'locked': 'ui_runtime_glue:synchronization', + expected = {'locked': 'ui_runtime_glue:synchronization', 'hashCode': 'ui_runtime_glue:virtual_contract', 'nativeCall': 'no_code'} name = row['descriptor'].split('->')[1].split('(')[0] assert row['reason'] == expected[name], row else: assert row['artifact_verified'], row counts['verified' if row['artifact_verified'] else row['reason']] += 1 -assert counts['verified'] == 26 and len(report['methods']) == 36, counts -print('Java/D8 整包:26 个方法验证通过,3 个初始化方法、1 个 D8 桥接方法和 6 个明确不支持的方法保留。', flush=True) +assert counts['verified'] == 46 and len(report['methods']) == (53 if args.min_api == 23 else 52), counts +print('Java/D8 整包:46 个方法验证通过,初始化、桥接、同步声明和特殊对象契约保留。', flush=True) results = {'coverage': dict(counts), 'apk_sha256': report['output_sha256'], - 'resource_table': 'absent' if args.without_resource_table else 'empty', + 'resource_table': 'absent' if args.without_resource_table else 'empty', 'min_api': args.min_api, 'source_sha256': hashlib.sha256(SOURCE.encode()).hexdigest(), 'devices': []} (work / 'result.json').write_text(json.dumps(results, ensure_ascii=False, indent=2) + '\n') for serial in args.serial: @@ -291,7 +453,7 @@ def sign(source, destination): match = re.search(re.escape(marker) + r'(\d+) pages=(\d+)', logs) assert match and 'FATAL EXCEPTION' not in logs, str(path) checks = int(match.group(1)) - assert checks == 482, checks + assert checks == 525, checks device['page_size'] = int(match.group(2)) assert run(adb + ['shell', 'pidof', package]).strip(), str(path) device['scenarios'].append({'name': scenario, 'checks': checks}) diff --git a/third_party/xopprotector/native/src/main/cpp/vm/pvm2_format.cpp b/third_party/xopprotector/native/src/main/cpp/vm/pvm2_format.cpp index c534959..b0a4f74 100644 --- a/third_party/xopprotector/native/src/main/cpp/vm/pvm2_format.cpp +++ b/third_party/xopprotector/native/src/main/cpp/vm/pvm2_format.cpp @@ -118,7 +118,7 @@ bool parse_pvm2(const uint8_t* data, size_t size, Pvm2Image* out) { if (out->version != PVM2_VERSION_V1 && out->version != PVM2_VERSION_V2 && out->version != PVM2_VERSION_V3 && out->version != PVM2_VERSION_V4 && out->version != PVM2_VERSION_V5 && out->version != PVM2_VERSION_V6 - && out->version != PVM2_VERSION_V7 && out->version != PVM2_VERSION_V8) { + && out->version != PVM2_VERSION_V7 && out->version != PVM2_VERSION_V8 && out->version != PVM2_VERSION_V9) { PLOGE("PVM2 unsupported version %u", out->version); return false; } diff --git a/third_party/xopprotector/native/src/main/cpp/vm/pvm2_format.h b/third_party/xopprotector/native/src/main/cpp/vm/pvm2_format.h index 6b5cf6d..1f90a15 100644 --- a/third_party/xopprotector/native/src/main/cpp/vm/pvm2_format.h +++ b/third_party/xopprotector/native/src/main/cpp/vm/pvm2_format.h @@ -20,6 +20,7 @@ constexpr uint16_t PVM2_VERSION_V5 = 5; constexpr uint16_t PVM2_VERSION_V6 = 6; constexpr uint16_t PVM2_VERSION_V7 = 7; constexpr uint16_t PVM2_VERSION_V8 = 8; +constexpr uint16_t PVM2_VERSION_V9 = 9; /** Morph table size for v3 images. */ constexpr uint8_t PVM2_OP_COUNT_V3 = 40; diff --git a/third_party/xopprotector/native/src/main/cpp/vm/pvm2_interp.cpp b/third_party/xopprotector/native/src/main/cpp/vm/pvm2_interp.cpp index f90bb1c..34fe47d 100644 --- a/third_party/xopprotector/native/src/main/cpp/vm/pvm2_interp.cpp +++ b/third_party/xopprotector/native/src/main/cpp/vm/pvm2_interp.cpp @@ -831,6 +831,31 @@ static bool ensure_well_known_classes(JNIEnv* env) { return true; } +static jstring string_from_utf8(JNIEnv* env, const std::string& value) { + // 镜像使用标准 UTF-8,NewStringUTF 接受的却是 JNI 修改版 UTF-8。 + // 复用 Java 解码器保留内嵌空字符和代理对;const-string 必须维持 ART 的驻留身份。 + JniLocalFrame frame(env, 8); + if (!frame.active) return nullptr; + jclass cls = cache_global_class(env, "java/lang/String"); + if (cls == nullptr) return nullptr; + jmethodID ctor = env->GetMethodID(cls, "", "([BLjava/lang/String;)V"); + if (ctor == nullptr) return nullptr; + jmethodID intern = env->GetMethodID(cls, "intern", "()Ljava/lang/String;"); + if (intern == nullptr) return nullptr; + jbyteArray bytes = env->NewByteArray(static_cast(value.size())); + if (bytes == nullptr) return nullptr; + env->SetByteArrayRegion(bytes, 0, static_cast(value.size()), + reinterpret_cast(value.data())); + if (env->ExceptionCheck()) return nullptr; + jstring encoding = env->NewStringUTF("UTF-8"); + if (encoding == nullptr) return nullptr; + jobject text = env->NewObject(cls, ctor, bytes, encoding); + if (env->ExceptionCheck() || text == nullptr) return nullptr; + jobject result = env->CallObjectMethod(text, intern); + if (env->ExceptionCheck()) return nullptr; + return reinterpret_cast(frame.pop(result)); +} + /** * Resolve payload classes through the loader installed by the single-stub runtime. * @@ -878,7 +903,7 @@ static jclass find_class_desc(JNIEnv* env, const std::string& desc) { "(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;") : nullptr; const std::string binary_name = descriptor_to_binary_name(desc); - jstring name = env->NewStringUTF(binary_name.c_str()); + jstring name = string_from_utf8(env, binary_name); if (for_name != nullptr && name != nullptr) { local = reinterpret_cast(env->CallStaticObjectMethod( class_cls, for_name, name, JNI_FALSE, loader)); @@ -1170,7 +1195,7 @@ static bool fill_jargs(const char* sig, const uint8_t* arg_regs, uint8_t argc, static bool invoke_method(JNIEnv* env, uint8_t op, const std::string& desc, const uint8_t* arg_regs, uint8_t argc, - const std::vector& regs, PendingResult& pending) { + const std::vector& regs, PendingResult& pending, uint16_t version) { // Outer locals (pending/regs) must be DeleteLocalRef'd ONLY while no inner // PushLocalFrame is active — otherwise ART reports // "Attempt to remove index outside index area" / DeleteLocalRef failed. @@ -1186,9 +1211,26 @@ static bool invoke_method(JNIEnv* env, uint8_t op, const std::string& desc, if (!parse_member_ref(desc, &owner, &name, &sig)) { return false; } + std::string direct_super; + if (op == OP_INVOKE_SUPER && version >= PVM2_VERSION_V9) { + size_t separator = owner.find('|'); + if (separator == std::string::npos || separator == 0 || separator + 1 == owner.size()) return false; + direct_super = owner.substr(0, separator); + owner.erase(0, separator + 1); + } cls = find_class_desc(env, owner); - if (cls == nullptr) { - return false; + if (cls == nullptr) return false; + if (!direct_super.empty()) { + // 类 super 从声明者的直接父类分派;接口 super 必须保持原接口的默认实现。 + // 不能从 thiz 的动态类型取父类,否则派生实例会调用错误的实现或递归。 + jclass class_class = cache_global_class(env, "java/lang/Class"); + if (class_class == nullptr) return false; + jmethodID is_interface = env->GetMethodID(class_class, "isInterface", "()Z"); + if (is_interface == nullptr) return false; + jboolean interface_owner = env->CallBooleanMethod(cls, is_interface); + if (env->ExceptionCheck()) return false; + if (!interface_owner) cls = find_class_desc(env, direct_super); + if (cls == nullptr) return false; } mid = (op == OP_INVOKE_STATIC) ? env->GetStaticMethodID(cls, name.c_str(), sig.c_str()) @@ -2450,7 +2492,11 @@ PROTECTOR_ENCRYPT static jobject interpret_body(JNIEnv* env, int dex_index, uint uint16_t idx = read_u16(code + pc); pc += 2; if (!reg_bounds(dst, regs.size()) || idx >= img.strings.size()) goto fail; - reg_take_o(env, ®s[dst], env->NewStringUTF(img.strings[idx].c_str())); + reg_take_o(env, ®s[dst], string_from_utf8(env, img.strings[idx])); + if (env->ExceptionCheck()) { + if (dispatch_exception(env, img, fault_pc, &pc, &stashed_exception)) break; + goto fail; + } break; } case OP_MOVE: { @@ -2851,7 +2897,7 @@ PROTECTOR_ENCRYPT static jobject interpret_body(JNIEnv* env, int dex_index, uint if (mid >= img.methods.size()) goto fail; const uint8_t* arg_regs = code + pc; pc += argc; - if (!invoke_method(env, op, img.methods[mid], arg_regs, argc, regs, pending)) { + if (!invoke_method(env, op, img.methods[mid], arg_regs, argc, regs, pending, img.version)) { if (env->ExceptionCheck()) { if (dispatch_exception(env, img, fault_pc, &pc, &stashed_exception)) { break; diff --git a/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/AutoVmpPolicy.java b/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/AutoVmpPolicy.java index 72067e7..e1a3464 100644 --- a/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/AutoVmpPolicy.java +++ b/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/AutoVmpPolicy.java @@ -134,18 +134,21 @@ static String exclusionReason(ClassDef owner, Method method) { reason = "playback_compatibility"; if (reason == null) return null; if (method.getImplementation() == null || method.getName().startsWith("<")) return reason; - String restriction = independentMethodRestriction(method); + String restriction = independentMethodRestriction(method, "ui_runtime_glue".equals(reason)); return restriction == null ? null : reason + ":" + restriction; } - private static String independentMethodRestriction(Method method) { + private static String independentMethodRestriction(Method method, boolean component) { int flags = method.getAccessFlags(); var code = method.getImplementation(); if ((flags & (0x20 | 0x20000)) != 0) return "synchronization"; - // 跳板保留原声明、访问标志和 this,虚分派仍由 ART 完成;继承/接口本身不改变叶子方法语义。 + // 跳板保留原声明、访问标志和 this,虚分派仍由 ART 完成;继承/接口本身不构成拒绝理由。 // ponytail: hashCode/finalize 仍留在 ART,避免运行时重入;扩展需单独验证 GC 与内部对象操作。 if ((flags & (0x2 | 0x8)) == 0 && (method.getName().equals("hashCode") || method.getName().equals("finalize"))) return "virtual_contract"; + // 组件的字段、调用、数组与异常统一交给共用编译器校验;跳板保留 ART 入口与 this。 + // ponytail: 媒体及数据框架的专用兼容规则仍只放行叶子方法,扩展须有对应框架回归。 + if (component) return null; // 异常表交给 Pvm2Safety 和编译器校验;move-exception/throw 支持捕获、finally 和重新抛出。 // ponytail: 仅放行无状态访问、外部调用的叶子方法;引用和异常复用已有类型化运行时。 // 字段、数组元素、调用等仍留在 ART;扩展需验证对象状态与框架语义,不能直接移除命名规则。 @@ -176,8 +179,7 @@ static String exclusionReason(String typeDescriptor) { if (isDataAndResourceRuntimeGlue(typeDescriptor)) { return "data_resource_runtime_glue"; } - // UI and navigation glue is callback/lifecycle driven. It contributes little - // protection value and must keep Android/AndroidX receiver semantics on ART. + // 组件分类用于保留特殊契约;普通方法继续进入共用编译器,不按名称限制为叶子方法。 if (isUiRuntimeGlue(typeDescriptor)) { return "ui_runtime_glue"; } diff --git a/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/PackerMain.java b/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/PackerMain.java index a8ccc77..537cfc4 100644 --- a/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/PackerMain.java +++ b/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/PackerMain.java @@ -1778,6 +1778,7 @@ private int[] walkDexMethods(com.android.dex.Dex dex, RandomAccessFile raf, byte for (com.android.dex.ClassDef classDef : dex.classDefs()) { if (classDef.getClassDataOffset() == 0) continue; String type = dex.typeNames().get(classDef.getTypeIndex()); + String directSuperclass = classDef.getSupertypeIndex() < 0 ? null : dex.typeNames().get(classDef.getSupertypeIndex()); if (!shouldProcessType(type)) continue; boolean autoPay = paymentAutoVmpEffective && PaymentVmpRules.matches(type); boolean autoIndustry = !autoPay && industryAutoVmpEffective @@ -1794,7 +1795,7 @@ private int[] walkDexMethods(com.android.dex.Dex dex, RandomAccessFile raf, byte com.android.dex.ClassData classData = dex.readClassData(classDef); for (com.android.dex.ClassData.Method method : classData.getDirectMethods()) { notePvm2MethodScanned(phase); - InsnRecord rec = extractOne(dex, raf, method, aesKey, type, phase, skipMethodKeys, pvm2Exclusions); + InsnRecord rec = extractOne(dex, raf, method, aesKey, type, directSuperclass, phase, skipMethodKeys, pvm2Exclusions); if (rec == null) { continue; } @@ -1820,7 +1821,7 @@ private int[] walkDexMethods(com.android.dex.Dex dex, RandomAccessFile raf, byte } for (com.android.dex.ClassData.Method method : classData.getVirtualMethods()) { notePvm2MethodScanned(phase); - InsnRecord rec = extractOne(dex, raf, method, aesKey, type, phase, skipMethodKeys, pvm2Exclusions); + InsnRecord rec = extractOne(dex, raf, method, aesKey, type, directSuperclass, phase, skipMethodKeys, pvm2Exclusions); if (rec == null) { continue; } @@ -2072,7 +2073,7 @@ private boolean shouldTrueVmp(String typeDescriptor) { private InsnRecord extractOne(com.android.dex.Dex dex, RandomAccessFile raf, com.android.dex.ClassData.Method method, byte[] aesKey, - String typeDescriptor, ExtractPhase phase, + String typeDescriptor, String directSuperclass, ExtractPhase phase, Set skipMethodKeys, Map pvm2Exclusions) throws Exception { if (method.getCodeOffset() == 0) return null; // Constructors/clinit must keep invokespecial/super; returning stubs fail ART verify. @@ -2160,7 +2161,7 @@ private InsnRecord extractOne(com.android.dex.Dex dex, RandomAccessFile raf, pvm2Admission.noteCandidate(); Pvm2Compiler.Result compiled = Pvm2Compiler.tryCompile(dex, code, returnType, isStatic, pvm2Morph, - methodReport != null && methodReport.requires(key), paramTypes); + methodReport != null && methodReport.requires(key), paramTypes, directSuperclass); if (!compiled.isOk()) { pvm2Admission.noteFail(compiled.failReason); if (methodReport != null) methodReport.skipped(key, compiled.failReason); diff --git a/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/Pvm2Compiler.java b/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/Pvm2Compiler.java index 37cd36b..74c44bb 100644 --- a/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/Pvm2Compiler.java +++ b/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/Pvm2Compiler.java @@ -20,7 +20,7 @@ */ public final class Pvm2Compiler { private static final int MAX_REGS = 32; - private static final int MAX_CODE_UNITS = 512; + private static final int MAX_CODE_UNITS = 4096; private static final int PACKED_SWITCH_IDENT = 0x0100; private static final int SPARSE_SWITCH_IDENT = 0x0200; private static final int FILL_ARRAY_DATA_IDENT = 0x0300; @@ -66,6 +66,12 @@ public static Result tryCompile(Dex dex, Code code, String returnType, boolean i public static Result tryCompile(Dex dex, Code code, String returnType, boolean isStatic, Pvm2Morph morph, boolean clearAfterUse, String[] parameterTypes) { + return tryCompile(dex, code, returnType, isStatic, morph, clearAfterUse, parameterTypes, null); + } + + public static Result tryCompile(Dex dex, Code code, String returnType, boolean isStatic, + Pvm2Morph morph, boolean clearAfterUse, String[] parameterTypes, + String directSuperclass) { if (code == null) return Result.fail("no code"); if (code.getRegistersSize() > MAX_REGS) return Result.fail("too many regs"); short[] units = code.getInstructions(); @@ -90,7 +96,7 @@ public static Result tryCompile(Dex dex, Code code, String returnType, boolean i } if (arguments.length > 255 || argumentSlots != code.getInsSize()) return Result.fail("argument types do not match register frame"); - String safetyFailure = Pvm2Safety.check(code, isStatic); + String safetyFailure = Pvm2Safety.check(code); if (safetyFailure != null) return Result.fail(safetyFailure); // Extra scratch: lit* / packed-switch use +1; fill-array-data needs +2 (index+value), @@ -118,7 +124,7 @@ public static Result tryCompile(Dex dex, Code code, String returnType, boolean i dalvikPcToEmitIndex.put(pc, emits.size()); int op = units[pc] & 0xff; try { - int advance = translateOne(dex, units, pc, op, scratchReg, totalRegs, strings, + int advance = translateOne(dex, units, pc, op, directSuperclass, scratchReg, totalRegs, strings, methodPool, fieldPool, typePool, emits, fixups); if (advance <= 0) { return Result.fail("bad advance at pc=" + pc + " op=0x" + Integer.toHexString(op)); @@ -142,6 +148,7 @@ public static Result tryCompile(Dex dex, Code code, String returnType, boolean i return Result.fail(e.getMessage()); } byte[] codeBytes = codeBuf.toByteArray(); + if (codeBytes.length > 0xffff) return Result.fail("compiled code too large"); for (Fixup f : fixups) { Integer targetEmit = dalvikPcToEmitIndex.get(f.targetDalvikPc); @@ -303,7 +310,7 @@ private static int kindOfType(String type) { } } - private static int translateOne(Dex dex, short[] units, int pc, int op, + private static int translateOne(Dex dex, short[] units, int pc, int op, String directSuperclass, int scratchReg, int totalRegs, List strings, List methodPool, @@ -596,10 +603,10 @@ private static int translateOne(Dex dex, short[] units, int pc, int op, return 2; } case 0x6e: case 0x6f: case 0x70: case 0x71: case 0x72: { - return translateInvoke35(dex, units, pc, op, strings, methodPool, emits); + return translateInvoke35(dex, units, pc, op, directSuperclass, strings, methodPool, emits); } case 0x74: case 0x75: case 0x76: case 0x77: case 0x78: { - return translateInvoke3r(dex, units, pc, op, strings, methodPool, emits); + return translateInvoke3r(dex, units, pc, op, directSuperclass, strings, methodPool, emits); } case 0x7b: { // neg-int emits.add(Emit.of(Pvm2Opcodes.OP_NEG, (u0 >> 8) & 0x0f, (u0 >> 12) & 0x0f)); @@ -1013,7 +1020,7 @@ private static int readI32Units(short[] units, int index) { return (units[index] & 0xffff) | ((units[index + 1] & 0xffff) << 16); } - private static int translateInvoke35(Dex dex, short[] units, int pc, int op, + private static int translateInvoke35(Dex dex, short[] units, int pc, int op, String directSuperclass, List strings, List methodPool, List emits) { int pvmOp = invokeOp(op); @@ -1025,7 +1032,10 @@ private static int translateInvoke35(Dex dex, short[] units, int pc, int op, int e = (c >> 8) & 0x0f; int d = (c >> 4) & 0x0f; int cc = c & 0x0f; - int mid = internMethod(dex, methodPool, strings, methodIdx); + if (pvmOp == Pvm2Opcodes.OP_INVOKE_SUPER && directSuperclass == null) + throw new UnsupportedOperationException("invoke-super requires declaring class context"); + int mid = internMethod(dex, methodPool, strings, methodIdx, + pvmOp == Pvm2Opcodes.OP_INVOKE_SUPER ? directSuperclass : null); int[] regs = new int[argCount]; if (argCount > 0) regs[0] = cc; if (argCount > 1) regs[1] = d; @@ -1036,7 +1046,7 @@ private static int translateInvoke35(Dex dex, short[] units, int pc, int op, return 3; } - private static int translateInvoke3r(Dex dex, short[] units, int pc, int op, + private static int translateInvoke3r(Dex dex, short[] units, int pc, int op, String directSuperclass, List strings, List methodPool, List emits) { int pvmOp = invokeOpRange(op); @@ -1044,7 +1054,10 @@ private static int translateInvoke3r(Dex dex, short[] units, int pc, int op, int argCount = (u0 >> 8) & 0xff; int methodIdx = units[pc + 1] & 0xffff; int first = units[pc + 2] & 0xffff; - int mid = internMethod(dex, methodPool, strings, methodIdx); + if (pvmOp == Pvm2Opcodes.OP_INVOKE_SUPER && directSuperclass == null) + throw new UnsupportedOperationException("invoke-super requires declaring class context"); + int mid = internMethod(dex, methodPool, strings, methodIdx, + pvmOp == Pvm2Opcodes.OP_INVOKE_SUPER ? directSuperclass : null); int[] regs = new int[argCount]; for (int i = 0; i < argCount; i++) regs[i] = first + i; emits.add(Emit.invoke(pvmOp, mid, regs)); @@ -1362,13 +1375,15 @@ private static int internType(List typePool, List strings, Stri return typePool.size() - 1; } - private static int internMethod(Dex dex, List methodPool, List strings, int methodIdx) { + private static int internMethod(Dex dex, List methodPool, List strings, int methodIdx, String directSuperclass) { MethodId mid = dex.methodIds().get(methodIdx); String owner = dex.typeNames().get(mid.getDeclaringClassIndex()); String name = dex.strings().get(mid.getNameIndex()); com.android.dex.ProtoId proto = dex.protoIds().get(mid.getProtoIndex()); String ret = dex.typeNames().get(proto.getReturnTypeIndex()); StringBuilder sb = new StringBuilder(); + // v9 super 引用同时保留调用者的直接父类与原引用类型;运行时区分类与接口。 + if (directSuperclass != null) sb.append(directSuperclass).append('|'); sb.append(owner).append("->").append(name).append('('); if (proto.getParametersOffset() != 0) { short[] types = dex.readTypeList(proto.getParametersOffset()).getTypes(); @@ -1431,6 +1446,7 @@ private static byte[] buildImageV3(int regCount, int extraScratch, int insSize, // v7:清理策略随镜像一起认证,不能由外部报告或未认证标志覆盖。 out.writeByte(clearAfterUse ? 1 : 0); for (String s : strings) { + if (!StandardCharsets.UTF_8.newEncoder().canEncode(s)) throw new IOException("unpaired UTF-16 surrogate"); byte[] utf = s.getBytes(StandardCharsets.UTF_8); if (utf.length > 0xffff) throw new IOException("string too long"); writeU16(out, utf.length); diff --git a/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/Pvm2Opcodes.java b/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/Pvm2Opcodes.java index 1e0e37b..17efae0 100644 --- a/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/Pvm2Opcodes.java +++ b/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/Pvm2Opcodes.java @@ -6,7 +6,7 @@ private Pvm2Opcodes() { } /** Per-build opcode/immediate/register/handler morph (v6). */ - public static final int VERSION = 8; + public static final int VERSION = 9; public static final int RET_V = 0; public static final int RET_I = 1; diff --git a/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/Pvm2Safety.java b/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/Pvm2Safety.java index cf43a00..a08adf8 100644 --- a/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/Pvm2Safety.java +++ b/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/Pvm2Safety.java @@ -1,501 +1,115 @@ package com.yqsh.protector.packer; import com.android.dex.Code; -import com.android.tools.smali.dexlib2.Opcode; import com.android.tools.smali.dexlib2.Opcodes; +import java.util.BitSet; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Conservative, package-agnostic admission checks for PVM2 methods. - * - *

The interpreter intentionally throws the same NPE as ART when an invoke - * receiver is null. That is correct VM behaviour, but a static transform must - * not move a method into PVM2 when it cannot prove the receiver's nullability. - * This checker keeps the non-null instance receiver and proven non-null branch - * paths compatible with ART. At control-flow joins it intersects facts from - * all incoming paths; unknown receivers crossing a branch or exception edge - * stay on ART, where verifier and handler semantics remain authoritative.

- */ +/** 校验编译所需的结构边界;可空接收者交给运行时按原指令位置抛出并派发异常。 */ final class Pvm2Safety { private static final Opcodes OPCODES = Opcodes.getDefault(); - private Pvm2Safety() { - } + private Pvm2Safety() {} - static String check(Code code, boolean isStatic) { + static String check(Code code) { if (code == null) return "semantic safety: no code"; short[] units = code.getInstructions(); - ExceptionalInfo exceptional = exceptionalBoundaries(code, units); - return checkInternal(units, code.getRegistersSize(), code.getInsSize(), isStatic, - exceptional, false); - } - - static String check(short[] units, int registersSize, int insSize, - boolean isStatic, boolean hasExceptionalFlow) { - return checkInternal(units, registersSize, insSize, isStatic, null, - hasExceptionalFlow); - } - - private static String checkInternal(short[] units, int registersSize, int insSize, - boolean isStatic, ExceptionalInfo exceptional, - boolean hasExceptionalFlow) { - if (exceptional != null && exceptional.invalid) return "semantic safety: malformed exception table"; - if (units == null || units.length == 0) return null; - if (registersSize <= 0 || registersSize > 255) { + int registers = code.getRegistersSize(), inputs = code.getInsSize(); + if (registers < 0 || registers > 255 || inputs < 0 || inputs > registers) return "semantic safety: invalid register frame"; - } - Map widths = new HashMap<>(); - int pc = 0; - while (pc < units.length) { - int op = units[pc] & 0xff; - int width; - try { - width = widthOf(units, pc, op); - } catch (RuntimeException ex) { - return "semantic safety: malformed instruction"; - } - if (width <= 0 || pc + width > units.length) { - return "semantic safety: malformed instruction"; - } - widths.put(pc, width); - pc += width; - } - if (pc != units.length || widths.isEmpty()) return "semantic safety: malformed instruction"; - - FlowState initial = new FlowState(registersSize); - int thisReg = registersSize - Math.max(insSize, 0); - if (!isStatic && insSize > 0 && thisReg >= 0 && thisReg < registersSize) { - initial.knownNonNull[thisReg] = true; - } - - Map inStates = new HashMap<>(); - ArrayDeque pending = new ArrayDeque<>(); - inStates.put(0, initial); - pending.add(0); - - while (!pending.isEmpty()) { - pc = pending.removeFirst(); - Integer widthValue = widths.get(pc); - if (widthValue == null) return "semantic safety: malformed branch target"; - int width = widthValue; - int u0 = units[pc] & 0xffff; - int op = u0 & 0xff; - FlowState state = inStates.get(pc).copy(); - if (exceptional != null && pc < exceptional.inTry.length - && (exceptional.inTry[pc] || exceptional.handler[pc])) { - state.controlFlow = true; - } else if (exceptional == null && hasExceptionalFlow) { - state.controlFlow = true; - } - - // 异常边读取执行前的事实,不能继承解引用正常完成后的非空结论。 - Opcode metadata = OPCODES.getOpcodeByValue(op); - if (exceptional != null && metadata != null && metadata.canThrow()) { - for (int handlerPc : exceptional.targets.getOrDefault(pc, List.of())) { - if (!widths.containsKey(handlerPc)) return "semantic safety: malformed exception target"; - FlowState thrown = state.copy(); - thrown.controlFlow = true; - // ponytail: 写目标在异常边保守作废,避免依赖 JNI 失败前是否已写入;精确放行需逐指令证明。 - if (metadata.setsRegister() && op != 0x1f) { - int destination = destination(metadata, u0, units, pc); - clearKnown(destination, thrown.knownNonNull); - thrown.forgetTypeTest(destination); - if (metadata.setsWideRegister()) { - clearKnown(destination + 1, thrown.knownNonNull); - thrown.forgetTypeTest(destination + 1); - } + if (units == null || units.length == 0) return null; + BitSet boundaries = new BitSet(units.length + 1); + BitSet executable = new BitSet(units.length); + try { + for (int pc = 0; pc < units.length;) { + int width = widthOf(units, pc); + if (width <= 0 || width > units.length - pc) + return "semantic safety: malformed instruction"; + boundaries.set(pc); + if ((units[pc] & 0xff) != 0 || units[pc] == 0) executable.set(pc); + pc += width; + } + boundaries.set(units.length); + for (int pc = executable.nextSetBit(0); pc >= 0; pc = executable.nextSetBit(pc + 1)) { + int u0 = units[pc] & 0xffff, op = u0 & 0xff; + long target = -1; + if (op == 0x28) target = (long)pc + (byte)(u0 >>> 8); + else if (op == 0x29 || (op >= 0x32 && op <= 0x3d)) target = (long)pc + units[pc + 1]; + else if (op == 0x2a) target = (long)pc + signed32(units, pc + 1); + if ((op >= 0x28 && op <= 0x2a || op >= 0x32 && op <= 0x3d) + && !contains(executable, target)) return "semantic safety: malformed branch target"; + if (op == 0x2b || op == 0x2c || op == 0x26) { + long address = (long)pc + signed32(units, pc + 1); + if (!contains(boundaries, address) || address >= units.length || (address & 1) != 0) + return "semantic safety: malformed payload target"; + int payload = (int)address; + int ident = op == 0x2b ? 0x0100 : op == 0x2c ? 0x0200 : 0x0300; + if ((units[payload] & 0xffff) != ident) return "semantic safety: malformed payload type"; + if (op != 0x26) { + int size = units[payload + 1] & 0xffff; + int base = payload + (op == 0x2b ? 4 : 2 + size * 2); + for (int i = 0; i < size; i++) + if (!contains(executable, (long)pc + signed32(units, base + i * 2))) + return "semantic safety: malformed switch target"; } - if (mergeState(inStates, handlerPc, thrown)) pending.addLast(handlerPc); - } - } - - if (requiresReceiver(op)) { - int argc = isInvoke35(op) ? (u0 >>> 12) & 0x0f : (u0 >>> 8) & 0xff; - if (argc == 0) { - return isInvoke35(op) - ? "semantic safety: invoke missing receiver" - : "semantic safety: invoke/range missing receiver"; - } - int receiver = isInvoke35(op) - ? (units[pc + 2] & 0xffff) & 0x0f - : units[pc + 2] & 0xffff; - String reason = receiverReason(receiver, state.knownNonNull, state.controlFlow); - if (reason != null) return reason; - // 调用正常返回后接收者必非空;异常边已在执行前传播。 - state.knownNonNull[receiver] = true; - } - - // 字段/数组访问正常完成后,其对象必非空;先记录,再处理可能覆盖对象的目标寄存器。 - if (op == 0x21 || (op >= 0x52 && op <= 0x5f)) { - setKnown((u0 >>> 12) & 0x0f, state.knownNonNull, true); - } else if (op >= 0x44 && op <= 0x51) { - setKnown(units[pc + 1] & 0xff, state.knownNonNull, true); - } - if (metadata != null && metadata.setsRegister() && op != 0x1f) { - int destination = destination(metadata, u0, units, pc); - state.forgetTypeTest(destination); - if (metadata.setsWideRegister()) state.forgetTypeTest(destination + 1); - int source = (u0 >>> 12) & 0x0f; - if (op == 0x20 && source != destination && source < registersSize && destination < registersSize) - state.typeTestSource[destination] = source; - } - updateKnownNonNull(op, u0, units, pc, state.knownNonNull); - for (Successor successor : successors(units, pc, op, width, state, widths)) { - if (!widths.containsKey(successor.pc)) { - return "semantic safety: malformed branch target"; } - if (mergeState(inStates, successor.pc, successor.state)) { - pending.addLast(successor.pc); + if (op >= 0x6e && op <= 0x72 || op >= 0x74 && op <= 0x78) { + boolean range = op >= 0x74; + int count = range ? u0 >>> 8 : u0 >>> 12; + if (!range && count > 5) return "semantic safety: invalid invoke argument count"; + if (count == 0 && op != 0x71 && op != 0x77) + return "semantic safety: invoke missing receiver"; + int packed = units[pc + 2] & 0xffff; + for (int i = 0; i < count; i++) { + int register = range ? packed + i : i == 4 ? (u0 >>> 8) & 15 : (packed >>> (i * 4)) & 15; + if (register >= registers) return "semantic safety: invoke register out of range"; + } } } + if (code.getTries() != null) for (Code.Try block : code.getTries()) { + int start = block.getStartAddress(), count = block.getInstructionCount(); + int index = block.getCatchHandlerIndex(); + Code.CatchHandler[] handlers = code.getCatchHandlers(); + if (!contains(executable, start) || count <= 0 || count > units.length - start + || !boundaries.get(start + count) || handlers == null || index < 0 || index >= handlers.length) + return "semantic safety: malformed exception table"; + Code.CatchHandler handler = handlers[index]; + int[] addresses = handler.getAddresses(), types = handler.getTypeIndexes(); + if (addresses == null || types == null || addresses.length != types.length + || addresses.length == 0 && handler.getCatchAllAddress() < 0) + return "semantic safety: malformed exception table"; + for (int address : addresses) if (!contains(executable, address)) + return "semantic safety: malformed exception target"; + if (handler.getCatchAllAddress() >= 0 && !contains(executable, handler.getCatchAllAddress())) + return "semantic safety: malformed exception target"; + } + } catch (RuntimeException malformed) { + return "semantic safety: malformed instruction"; } return null; } - private static String receiverReason(int receiver, boolean[] knownNonNull, - boolean hasControlFlow) { - if (receiver < 0 || receiver >= knownNonNull.length) { - return "semantic safety: receiver register out of range"; - } - if (knownNonNull[receiver]) return null; - // ART and the interpreter both throw NPE for a null receiver in - // straight-line code, so this does not change observable semantics. - // The risky case is a nullable value crossing a branch/handler, where - // PVM2 must not approximate ART's verifier and exception edges. - if (!hasControlFlow) return null; - return "nullable receiver with control flow"; - } - - private static boolean requiresReceiver(int op) { - // invoke-static and invoke-static/range have no receiver. Treating - // their first argument as one unnecessarily rejected safe methods. - return (op >= 0x6e && op <= 0x72 && op != 0x71) - || (op >= 0x74 && op <= 0x78 && op != 0x77); - } - - private static boolean mergeState(Map states, int pc, FlowState incoming) { - FlowState existing = states.get(pc); - if (existing == null) { - states.put(pc, incoming.copy()); - return true; - } - boolean changed = existing.controlFlow != (existing.controlFlow || incoming.controlFlow); - existing.controlFlow |= incoming.controlFlow; - for (int i = 0; i < existing.knownNonNull.length; i++) { - boolean merged = existing.knownNonNull[i] && incoming.knownNonNull[i]; - changed |= existing.knownNonNull[i] != merged; - existing.knownNonNull[i] = merged; - if (existing.typeTestSource[i] != incoming.typeTestSource[i] && existing.typeTestSource[i] != -1) { - existing.typeTestSource[i] = -1; - changed = true; - } - } - return changed; - } - - private static List successors(short[] units, int pc, int op, int width, - FlowState state, Map widths) { - List out = new ArrayList<>(2); - if (isReturnOrThrow(op)) return out; - - if (isIf(op)) { - int target = pc + signed16(units[pc + 1]); - FlowState targetState = state.copy(); - FlowState fallthroughState = state.copy(); - targetState.controlFlow = true; - fallthroughState.controlFlow = true; - int register = (units[pc] >>> 8) & 0xff; - // instanceof 为真保证源对象非空;只保留尚未被改写的直接关系。 - if ((op == 0x38 || op == 0x39) && register < state.typeTestSource.length) { - int source = state.typeTestSource[register]; - if (source >= 0) setKnown(source, - (op == 0x38 ? fallthroughState : targetState).knownNonNull, true); - } - // ponytail: 仅传播当前等值边的非空事实;跨指令关系需另建别名分析。 - if (op == 0x38) { // if-eqz: fallthrough is the non-null path. - setKnown(register, fallthroughState.knownNonNull, true); - } else if (op == 0x39) { // if-nez: target is the non-null path. - setKnown(register, targetState.knownNonNull, true); - } else if (op == 0x32 || op == 0x33) { - int left = register & 0x0f, right = register >>> 4; - FlowState equal = op == 0x32 ? targetState : fallthroughState; - if (left < equal.knownNonNull.length && right < equal.knownNonNull.length - && (equal.knownNonNull[left] || equal.knownNonNull[right])) { - equal.knownNonNull[left] = equal.knownNonNull[right] = true; - } - } - out.add(new Successor(target, targetState)); - if (widths.containsKey(pc + width)) { - out.add(new Successor(pc + width, fallthroughState)); - } - return out; - } - - if (isGoto(op)) { - int target = pc + gotoOffset(units, pc, op); - state.controlFlow = true; - out.add(new Successor(target, state)); - return out; - } - - if (op == 0x2b || op == 0x2c) { - // Switch targets are all control-flow edges. Decode them here so - // a receiver used only from a case is not missed by the analysis. - state.controlFlow = true; - int payload = pc + signed32(units[pc + 1], units[pc + 2]); - addSwitchTargets(units, pc, payload, state, out); - if (widths.containsKey(pc + width)) { - out.add(new Successor(pc + width, state.copy())); - } - return out; - } - - if (isControlFlow(op)) state.controlFlow = true; - if (widths.containsKey(pc + width)) out.add(new Successor(pc + width, state)); - return out; - } - - private static void addSwitchTargets(short[] units, int switchPc, int payload, FlowState state, - List out) { - if (payload < 0 || payload + 1 >= units.length) { - out.add(new Successor(-1, state.copy())); - return; - } - int ident = units[payload] & 0xffff; - int size = units[payload + 1] & 0xffff; - if (ident == 0x0100) { - int base = payload + 4; - if (base < 0 || base > units.length || size > (units.length - base) / 2) { - out.add(new Successor(-1, state.copy())); - return; - } - for (int i = 0; i < size; i++) { - int off = signed32(units[base + i * 2], units[base + i * 2 + 1]); - out.add(new Successor(switchPc + off, state.copy())); - } - } else if (ident == 0x0200) { - int base = payload + 2 + size * 2; - if (base < 0 || base > units.length || size > (units.length - base) / 2 - || payload + 2 > units.length || size > (units.length - payload - 2) / 4) { - out.add(new Successor(-1, state.copy())); - return; - } - for (int i = 0; i < size; i++) { - int off = signed32(units[base + i * 2], units[base + i * 2 + 1]); - out.add(new Successor(switchPc + off, state.copy())); - } - } else { - out.add(new Successor(-1, state.copy())); - } + private static boolean contains(BitSet boundaries, long pc) { + return pc >= 0 && pc < Integer.MAX_VALUE && boundaries.get((int)pc); } - private static boolean isIf(int op) { - return op >= 0x32 && op <= 0x3d; + private static int signed32(short[] units, int pc) { + return (units[pc] & 0xffff) | (units[pc + 1] << 16); } - private static boolean isGoto(int op) { - return op == 0x28 || op == 0x29 || op == 0x2a; - } - - private static int gotoOffset(short[] units, int pc, int op) { - if (op == 0x28) return (byte) ((units[pc] >>> 8) & 0xff); - if (op == 0x29) return signed16(units[pc + 1]); - return signed32(units[pc + 1], units[pc + 2]); - } - - private static int signed16(short value) { - return (short) (value & 0xffff); - } - - private static int signed32(short low, short high) { - return (low & 0xffff) | ((high & 0xffff) << 16); - } - - private static boolean isReturnOrThrow(int op) { - return op >= 0x0e && op <= 0x11 || op == 0x27; - } - - private static ExceptionalInfo exceptionalBoundaries(Code code, short[] units) { - ExceptionalInfo result = new ExceptionalInfo(units == null ? 0 : units.length); - if (units == null) return result; - Code.Try[] tries = code.getTries(); - if (tries == null || tries.length == 0) return result; - Code.CatchHandler[] handlers = code.getCatchHandlers(); - if (handlers == null) { result.invalid = true; return result; } - for (Code.Try t : tries) { - int start = t.getStartAddress(), count = t.getInstructionCount(); - if (start < 0 || start >= units.length || count <= 0 || count > units.length - start - || t.getCatchHandlerIndex() < 0 || t.getCatchHandlerIndex() >= handlers.length) { - result.invalid = true; return result; - } - int end = start + count; - Code.CatchHandler handler = handlers[t.getCatchHandlerIndex()]; - List targets = new ArrayList<>(); - if (handler.getAddresses() != null) for (int address : handler.getAddresses()) targets.add(address); - if (handler.getCatchAllAddress() >= 0) targets.add(handler.getCatchAllAddress()); - if (targets.isEmpty()) { result.invalid = true; return result; } - for (int address : targets) { - if (address < 0 || address >= units.length) { result.invalid = true; return result; } - result.handler[address] = true; - } - for (int pc = start; pc < end;) { - result.inTry[pc] = true; - result.targets.computeIfAbsent(pc, ignored -> new ArrayList<>()).addAll(targets); - try { - int width = widthOf(units, pc, units[pc] & 0xff); - if (width <= 0 || width > end - pc) { result.invalid = true; return result; } - pc += width; - } catch (RuntimeException ex) { result.invalid = true; return result; } - } - } - return result; - } - - private static final class ExceptionalInfo { - final boolean[] inTry; - final boolean[] handler; - final Map> targets = new HashMap<>(); - boolean invalid; - - ExceptionalInfo(int size) { - inTry = new boolean[size]; - handler = new boolean[size]; - } - } - - private static final class FlowState { - final boolean[] knownNonNull; - final int[] typeTestSource; - boolean controlFlow; - - FlowState(int registersSize) { - knownNonNull = new boolean[registersSize]; - typeTestSource = new int[registersSize]; - Arrays.fill(typeTestSource, -1); - } - - void forgetTypeTest(int register) { - for (int i = 0; i < typeTestSource.length; i++) - if (i == register || typeTestSource[i] == register) typeTestSource[i] = -1; - } - - FlowState copy() { - FlowState copy = new FlowState(knownNonNull.length); - System.arraycopy(knownNonNull, 0, copy.knownNonNull, 0, knownNonNull.length); - System.arraycopy(typeTestSource, 0, copy.typeTestSource, 0, typeTestSource.length); - copy.controlFlow = controlFlow; - return copy; - } - } - - private static final class Successor { - final int pc; - final FlowState state; - - Successor(int pc, FlowState state) { - this.pc = pc; - this.state = state; - } - } - - private static void updateKnownNonNull(int op, int u0, short[] units, int pc, - boolean[] known) { - // 对象移动先读取源事实,避免同寄存器移动被误清空;check-cast 不改变值。 - if (op == 0x07) { copyKnown((u0 >>> 8) & 0x0f, (u0 >>> 12) & 0x0f, known); return; } - if (op == 0x08) { copyKnown((u0 >>> 8) & 0xff, units[pc + 1] & 0xffff, known); return; } - if (op == 0x09) { copyKnown(units[pc + 1] & 0xffff, units[pc + 2] & 0xffff, known); return; } - if (op == 0x1f) return; - - // 复用 dexlib2 的写寄存器标记,统一清除 wide 的两格及 lit8 的完整 8 位目标。 - Opcode opcode = OPCODES.getOpcodeByValue(op); - if (opcode == null || !opcode.setsRegister()) return; - int destination = destination(opcode, u0, units, pc); - clearKnown(destination, known); - if (opcode.setsWideRegister()) clearKnown(destination + 1, known); - if (op == 0x0d || op == 0x1a || op == 0x1b || op == 0x1c || op == 0x22 || op == 0x23) { - setKnown(destination, known, true); - } - } - - private static int destination(Opcode opcode, int u0, short[] units, int pc) { - return switch (opcode.format) { - case Format11n, Format12x, Format22c, Format22cs, Format22s -> (u0 >>> 8) & 0x0f; - case Format32x -> units[pc + 1] & 0xffff; - default -> (u0 >>> 8) & 0xff; - }; - } - - private static void copyKnown(int dst, int src, boolean[] known) { - if (dst >= 0 && dst < known.length) { - known[dst] = src >= 0 && src < known.length && known[src]; - } - } - - private static void setKnown(int reg, boolean[] known, boolean value) { - if (reg >= 0 && reg < known.length) known[reg] = value; - } - - private static void clearKnown(int reg, boolean[] known) { - setKnown(reg, known, false); - } - - private static boolean isInvoke35(int op) { - return op == 0x6e || op == 0x6f || op == 0x70 || op == 0x72; - } - - private static boolean isInvoke3r(int op) { - return op == 0x74 || op == 0x75 || op == 0x76 || op == 0x78; - } - - private static boolean isControlFlow(int op) { - return (op >= 0x28 && op <= 0x3d) || op == 0x2b || op == 0x2c; - } - - private static int widthOf(short[] units, int pc, int op) { + private static int widthOf(short[] units, int pc) { int ident = units[pc] & 0xffff; - if (op == 0 && (ident == 0x0100 || ident == 0x0200 || ident == 0x0300)) { - if (ident == 0x0100) { - int size = units[pc + 1] & 0xffff; - return 4 + size * 2; - } - if (ident == 0x0200) { - int size = units[pc + 1] & 0xffff; - return 2 + size * 4; - } - int elemWidth = units[pc + 1] & 0xffff; - long size = (units[pc + 2] & 0xffffL) | ((units[pc + 3] & 0xffffL) << 16); - long dataUnits = (size * elemWidth + 1L) / 2L; - if (elemWidth <= 0 || dataUnits > Integer.MAX_VALUE - 4L) { - throw new IllegalArgumentException("bad payload"); - } - return 4 + (int) dataUnits; - } - switch (op) { - case 0x03: case 0x06: case 0x09: case 0x14: case 0x17: case 0x1b: - case 0x24: case 0x25: case 0x26: case 0x2a: case 0x2b: case 0x2c: - case 0x6e: case 0x6f: case 0x70: case 0x71: case 0x72: - case 0x74: case 0x75: case 0x76: case 0x77: case 0x78: - return 3; - case 0x18: return 5; - case 0xfa: case 0xfb: return 4; - case 0x01: case 0x04: case 0x07: case 0x0a: case 0x0b: case 0x0c: - case 0x0d: case 0x0e: case 0x0f: case 0x10: case 0x11: case 0x12: - case 0x1d: case 0x1e: case 0x21: case 0x27: case 0x28: - case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f: case 0x80: - case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: - case 0x87: case 0x88: case 0x89: case 0x8a: case 0x8b: case 0x8c: - case 0x8d: case 0x8e: case 0x8f: - return 1; - default: - if (op >= 0xb0 && op <= 0xcf) return 1; - if (op <= 0x00) return 1; - return 2; - } + if (ident == 0x0100) return 4 + (units[pc + 1] & 0xffff) * 2; + if (ident == 0x0200) return 2 + (units[pc + 1] & 0xffff) * 4; + if (ident == 0x0300) { + int elementWidth = units[pc + 1] & 0xffff; + long size = Integer.toUnsignedLong(signed32(units, pc + 2)); + long width = 4 + (size * elementWidth + 1) / 2; + if (elementWidth != 1 && elementWidth != 2 && elementWidth != 4 && elementWidth != 8 + || width > Integer.MAX_VALUE) throw new IllegalArgumentException("bad payload"); + return (int)width; + } + var opcode = OPCODES.getOpcodeByValue(ident & 0xff); + if (opcode == null || opcode.format.size <= 0) throw new IllegalArgumentException("unknown opcode"); + return opcode.format.size / 2; } } diff --git a/tools/xop-pvm2-packer.jar b/tools/xop-pvm2-packer.jar index 17f77184e860b68b22fb5a4ad109166f77bd3763..fc1dfb63046ac271d27cecb1c60bb71fc2c610bd 100644 GIT binary patch delta 106917 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

sEiKmjHN?xG3nx>k&+h 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 GeE$av<6<-b delta 112072 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%0AP$`{%LNy)*_q$Jf`dLIG4<~B0yF1$F^ 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

G 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