From 5f42eba556656472638b188007a959e30524cc89 Mon Sep 17 00:00:00 2001 From: haonan Date: Fri, 16 Oct 2026 16:19:53 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=85=BC=E5=AE=B9=20PVM2=20=E7=BB=A7?= =?UTF-8?q?=E6=89=BF=E5=BC=82=E5=B8=B8=E5=8F=8A=E6=97=A0=E8=B5=84=E6=BA=90?= =?UTF-8?q?=20APK=20=E5=B9=B6=E5=8F=91=E5=B8=83=201.8.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/release-notes/versions/1.8.4.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 +- apps/shield-gui/src/lib/protect-diagnostic.ts | 2 +- .../tests/protect-diagnostic.test.mjs | 2 +- crates/shield-core/Cargo.toml | 2 +- .../src/protect/resource_format.rs | 27 ++ .../src/protect/resource_format_tests.rs | 57 +++- crates/shield-core/src/protect/xop_pvm2.rs | 28 ++ crates/shield-core/src/protect_api.rs | 6 +- crates/shield-core/src/protection_report.rs | 4 +- docs/process/test-checklist.md | 9 + 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 +- .../protector/packer/Pvm2ProtectionCheck.java | 157 ++++++++- .../protector/packer/Pvm2RuntimeImages.java | 27 ++ tests/native/pvm2_runtime_check.cpp | 54 +++- tests/scripts/check-pvm2-art.py | 300 ++++++++++++++++++ tests/scripts/check-pvm2-runtime.py | 1 + .../native/src/main/cpp/vm/pvm2_interp.cpp | 6 +- .../yqsh/protector/packer/AutoVmpPolicy.java | 19 +- .../protector/packer/ResourceIdRewriter.java | 8 + tools/xop-pvm2-packer.jar | Bin 8316281 -> 8316378 bytes 30 files changed, 706 insertions(+), 51 deletions(-) create mode 100644 .github/release-notes/versions/1.8.4.md create mode 100644 tests/scripts/check-pvm2-art.py diff --git a/.github/release-notes/versions/1.8.4.md b/.github/release-notes/versions/1.8.4.md new file mode 100644 index 0000000..5b6d8c9 --- /dev/null +++ b/.github/release-notes/versions/1.8.4.md @@ -0,0 +1,12 @@ +### PVM2 继承与异常处理兼容修复 + +- 符合条件的独立方法不再仅因所属类存在继承或接口契约而被排除;保留原方法声明、访问标志和接收者,由 ART 继续负责虚方法分派。 +- 放行通过指令、控制流及异常表校验的独立异常处理方法,修复 `throw null` 未产生可捕获 `NullPointerException` 的运行时问题,覆盖捕获顺序、重抛和 `finally` 路径。 +- 修复合法空资源表、完全无资源表 APK 在资源 ID 重排、Apktool 重打包及空路径映射校验中的失败。 +- 构造器、同步、编译器桥接、特殊对象契约及不支持的状态访问/调用仍按规则保留;零转换和必保方法未覆盖仍明确失败,不把跳过的方法计为已保护。 + +### 验证与使用说明 + +- 自建 Java/D8 样本的 36 个方法中,26 个完成转换与产物核验,10 个明确保留。在 Android 9、15、16 的 arm64 模拟器上完成 20 轮运行,每轮 482 项断言全部通过,包含 Android 16 的 16 KB 内存页和无资源表变体。 +- 模拟器回归不能替代厂商真机或客户原始 APK 验收;没有客户方法体时,不能保证其全部方法都能转换。完整覆盖范围以当前产物的逐方法报告为准。 +- 升级后需要重新加固,已有 APK 不会自动获得本次修复。PVM2 需要 JDK 17 或更高版本;分享逐方法报告前请手动脱敏。 diff --git a/Cargo.lock b/Cargo.lock index 1f00c7f..ee885cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2201,7 +2201,7 @@ dependencies = [ [[package]] name = "mocika-shield" -version = "1.8.3" +version = "1.8.4" dependencies = [ "dunce", "reqwest 0.12.28", @@ -2229,7 +2229,7 @@ dependencies = [ [[package]] name = "mocikashield" -version = "1.8.3" +version = "1.8.4" dependencies = [ "cc", "chacha20poly1305", @@ -3635,7 +3635,7 @@ dependencies = [ [[package]] name = "shield-cli" -version = "1.8.3" +version = "1.8.4" dependencies = [ "anyhow", "clap", @@ -3653,7 +3653,7 @@ dependencies = [ [[package]] name = "shield-core" -version = "1.8.3" +version = "1.8.4" dependencies = [ "anyhow", "chacha20poly1305", diff --git a/apps/shield-cli/Cargo.toml b/apps/shield-cli/Cargo.toml index 665a553..30e9d9b 100644 --- a/apps/shield-cli/Cargo.toml +++ b/apps/shield-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shield-cli" -version = "1.8.3" +version = "1.8.4" 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 156a019..cd45ed1 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.3", + "version": "1.8.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mocika-shield-gui", - "version": "1.8.3", + "version": "1.8.4", "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 40b524f..2027415 100644 --- a/apps/shield-gui/package.json +++ b/apps/shield-gui/package.json @@ -1,6 +1,6 @@ { "name": "mocika-shield-gui", - "version": "1.8.3", + "version": "1.8.4", "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 66a7cd9..012ff08 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.3" +version = "1.8.4" 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 99bc4ba..82d7902 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.3", + "version": "1.8.4", "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 5fd114e..35e0beb 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.3", + version: "1.8.4", git_hash: "dev", build_date: "unknown", }; diff --git a/apps/shield-gui/src/lib/protect-diagnostic.ts b/apps/shield-gui/src/lib/protect-diagnostic.ts index 8ab5bbe..ed93f21 100644 --- a/apps/shield-gui/src/lib/protect-diagnostic.ts +++ b/apps/shield-gui/src/lib/protect-diagnostic.ts @@ -56,7 +56,7 @@ export function buildPvm2FailureDiagnostic(summary: Pvm2FailureSummary, locale: data_resource_runtime_glue: ["数据/资源框架兼容规则", "Data/resource compatibility"], compiler_generated_bridge: ["编译器生成桥接/合成方法", "Compiler-generated bridge/synthetic method"], playback_compatibility: ["媒体/辅助类兼容规则", "Media/helper compatibility"], - compatibility_virtual_contract: ["兼容范围:继承/接口虚方法契约未验证", "Compatibility: unverified inherited/interface contract"], + compatibility_virtual_contract: ["兼容范围:特殊对象方法或虚方法契约未验证", "Compatibility: unverified special object method or virtual contract"], compatibility_synchronization: ["兼容范围:同步方法", "Compatibility: synchronized method"], compatibility_exception_region: ["兼容范围:含异常处理区", "Compatibility: exception region"], compatibility_non_leaf_instruction: ["兼容范围:含叶子方法白名单之外的指令", "Compatibility: instruction outside the leaf allowlist"], diff --git a/apps/shield-gui/tests/protect-diagnostic.test.mjs b/apps/shield-gui/tests/protect-diagnostic.test.mjs index 5c9ec2b..2f72e5c 100644 --- a/apps/shield-gui/tests/protect-diagnostic.test.mjs +++ b/apps/shield-gui/tests/protect-diagnostic.test.mjs @@ -52,7 +52,7 @@ test("兼容限制按方法实际阻断条件统计,不再全部显示为生 reasons: { initializer: 3, compatibility_virtual_contract: 6, compatibility_synchronization: 2, compatibility_exception_region: 3, compatibility_non_leaf_instruction: 7 } }, "zh"); assert.match(text, /所选方法数: 21/); - assert.match(text, /继承\/接口虚方法契约未验证\): 6/); + assert.match(text, /特殊对象方法或虚方法契约未验证\): 6/); assert.match(text, /同步方法\): 2/); assert.match(text, /含异常处理区\): 3/); assert.match(text, /白名单之外的指令\): 7/); diff --git a/crates/shield-core/Cargo.toml b/crates/shield-core/Cargo.toml index 087eed4..cbe45ad 100644 --- a/crates/shield-core/Cargo.toml +++ b/crates/shield-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shield-core" -version = "1.8.3" +version = "1.8.4" edition = "2021" authors = ["MocikaDev"] license = "MIT OR Apache-2.0" diff --git a/crates/shield-core/src/protect/resource_format.rs b/crates/shield-core/src/protect/resource_format.rs index 2aca9e6..2b99eda 100644 --- a/crates/shield-core/src/protect/resource_format.rs +++ b/crates/shield-core/src/protect/resource_format.rs @@ -8,6 +8,33 @@ use zip::{ZipArchive, ZipWriter}; const JPEG_SIGNATURE: [u8; 3] = [0xFF, 0xD8, 0xFF]; +/// 修正 Apktool 3 对空资源表的包信息及无资源表时遗漏的 Android 框架引用。 +pub(crate) fn normalize_empty_resource_metadata(apk_dir: &Path) -> Result { + let path = apk_dir.join("apktool.yml"); + let metadata = fs::read_to_string(&path).context("读取 Apktool 资源元数据失败")?; + // ponytail: 只修正 Apktool 3 已验证的空表输出格式;其他格式保持原样,不猜测资源 ID。 + let mut normalized = metadata + .replace("resourcesInfo:\n packageId: 0\n packageName: \n", "") + .replace( + "resourcesInfo:\r\n packageId: 0\r\n packageName: \r\n", + "", + ); + // 完全无资源表时 Apktool 不记录框架,但重编 Manifest 的 android:* 属性仍需要它。 + if !apk_dir.join("res").exists() + && !apk_dir.join("resources.arsc").exists() + && !metadata + .lines() + .any(|line| line.starts_with("usesFramework:") || line.starts_with("resourcesInfo:")) + { + normalized.push_str("\nusesFramework:\n ids:\n - 1\n"); + } + if normalized == metadata { + return Ok(false); + } + fs::write(path, normalized).context("修正 Apktool 空资源元数据失败")?; + Ok(true) +} + /// Apktool 必须重编 Manifest,但不能因此丢掉输入 APK 已有的资源名混淆。 /// 用输入 APK 的原始 `resources.arsc` 和 `res/` 条目覆盖重编结果,其他受保护 /// 条目(Manifest、Stub DEX、Native Runtime)保持不变。 diff --git a/crates/shield-core/src/protect/resource_format_tests.rs b/crates/shield-core/src/protect/resource_format_tests.rs index bf94133..2985957 100644 --- a/crates/shield-core/src/protect/resource_format_tests.rs +++ b/crates/shield-core/src/protect/resource_format_tests.rs @@ -1,4 +1,7 @@ -use super::resource_format::{normalize_mislabeled_jpeg_resources, restore_original_resources}; +use super::resource_format::{ + normalize_empty_resource_metadata, normalize_mislabeled_jpeg_resources, + restore_original_resources, +}; use std::fs; use std::io::{Read, Write}; use std::path::Path; @@ -7,6 +10,58 @@ use zip::{CompressionMethod, ZipArchive, ZipWriter}; const JPEG_PREFIX: &[u8] = &[0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10]; +#[test] +fn 空资源元数据修正不影响普通资源包或共享库() { + let dir = tempfile::tempdir().unwrap(); + let path = dir.path().join("apktool.yml"); + for newline in ["\n", "\r\n"] { + for (id, name, empty) in [ + (0, "", true), + (0, "shared.library", false), + (127, "app", false), + ] { + let prefix = "version: 3.0.3\nusesFramework:\n ids:\n - 1\n"; + let suffix = "doNotCompress:\n- arsc\n"; + let source = format!( + "{prefix}resourcesInfo:\n packageId: {id}\n packageName: {name}\n{suffix}" + ) + .replace('\n', newline); + fs::write(&path, &source).unwrap(); + assert_eq!( + normalize_empty_resource_metadata(dir.path()).unwrap(), + empty + ); + let expected = if empty { + format!("{prefix}{suffix}").replace('\n', newline) + } else { + source + }; + assert_eq!(fs::read_to_string(&path).unwrap(), expected); + assert!(!normalize_empty_resource_metadata(dir.path()).unwrap()); + } + } + for source in [ + "version: 3.0.3\n", + "version: 3.0.3\nusesFramework:\n ids:\n - 2\n", + ] { + fs::write(&path, source).unwrap(); + let missing = !source.contains("usesFramework:"); + assert_eq!( + normalize_empty_resource_metadata(dir.path()).unwrap(), + missing + ); + assert_eq!( + fs::read_to_string(&path).unwrap(), + if missing { + format!("{source}\nusesFramework:\n ids:\n - 1\n") + } else { + source.to_string() + } + ); + assert!(!normalize_empty_resource_metadata(dir.path()).unwrap()); + } +} + #[test] fn jpeg_伪装_png_会无损改名为_jpg() { let dir = tempfile::tempdir().unwrap(); diff --git a/crates/shield-core/src/protect/xop_pvm2.rs b/crates/shield-core/src/protect/xop_pvm2.rs index 9dd67fa..9441b76 100644 --- a/crates/shield-core/src/protect/xop_pvm2.rs +++ b/crates/shield-core/src/protect/xop_pvm2.rs @@ -445,6 +445,10 @@ fn capture_resource_source( ) -> Result<(ResourceEntryFingerprints, u32)> { let file = fs::File::open(apk).context("打开待资源混淆 APK 失败")?; let mut archive = ZipArchive::new(file).context("解析待资源混淆 APK 失败")?; + // ponytail: 没有路径改写时校验器不读取资源表 CRC;无资源 APK 合法缺少该表。 + if mapping.is_empty() { + return Ok((BTreeMap::new(), 0)); + } let mut entries = BTreeMap::new(); for old in mapping.keys() { let entry = archive @@ -1378,4 +1382,28 @@ mod tests { let mapping = NamedTempFile::new().unwrap(); assert_eq!(validate_resource_id_mapping(mapping.path()).unwrap(), 0); } + + #[test] + fn 无资源表只允许空路径映射() { + let apk = NamedTempFile::new().unwrap(); + let mut archive = zip::ZipWriter::new(apk.reopen().unwrap()); + archive + .start_file( + "res/drawable/a.bin", + zip::write::SimpleFileOptions::default(), + ) + .unwrap(); + archive.finish().unwrap(); + assert_eq!( + capture_resource_source(apk.path(), &BTreeMap::new()).unwrap(), + (BTreeMap::new(), 0) + ); + let mapping = BTreeMap::from([("res/drawable/a.bin".into(), "r/a.bin".into())]); + assert!(capture_resource_source(apk.path(), &mapping) + .unwrap_err() + .to_string() + .contains("resources.arsc")); + fs::write(apk.path(), b"invalid zip").unwrap(); + assert!(capture_resource_source(apk.path(), &BTreeMap::new()).is_err()); + } } diff --git a/crates/shield-core/src/protect_api.rs b/crates/shield-core/src/protect_api.rs index 547a014..80c68e4 100644 --- a/crates/shield-core/src/protect_api.rs +++ b/crates/shield-core/src/protect_api.rs @@ -22,7 +22,8 @@ use crate::protect::{ }, native_alias::verify_in_apk, resource_format::{ - normalize_mislabeled_jpeg_resources, restore_original_resources, verify_original_resources, + normalize_empty_resource_metadata, normalize_mislabeled_jpeg_resources, + restore_original_resources, verify_original_resources, }, runtime::{inject_runtime, read_runtime_selection}, }; @@ -400,6 +401,9 @@ fn protect_apk_inner( ) .map_err(ShieldError::from)?; print_success("解包完成"); + if normalize_empty_resource_metadata(&apk_dir).map_err(ShieldError::from)? { + print_success("已修正无资源 APK 的资源编译元数据"); + } remove_excluded(&apk_dir, &opts.excluded_abis).map_err(ShieldError::from)?; if !opts.excluded_abis.is_empty() { let message = format!("已从输出排除 ABI:{}", opts.excluded_abis.join("、")); diff --git a/crates/shield-core/src/protection_report.rs b/crates/shield-core/src/protection_report.rs index 97a471f..4b7d437 100644 --- a/crates/shield-core/src/protection_report.rs +++ b/crates/shield-core/src/protection_report.rs @@ -124,7 +124,7 @@ impl Pvm2SkipReason { Self::DataResourceRuntimeGlue => "数据/资源框架兼容规则", Self::CompilerGeneratedBridge => "编译器生成桥接/合成方法", Self::PlaybackCompatibility => "媒体/辅助类兼容规则", - Self::CompatibilityVirtualContract => "兼容范围:继承/接口虚方法契约未验证", + Self::CompatibilityVirtualContract => "兼容范围:特殊对象方法或虚方法契约未验证", Self::CompatibilitySynchronization => "兼容范围:同步方法", Self::CompatibilityExceptionRegion => "兼容范围:含异常处理区", Self::CompatibilityNonLeafInstruction => "兼容范围:含叶子方法白名单之外的指令", @@ -291,7 +291,7 @@ impl std::fmt::Display for Pvm2Failure { | Pvm2SkipReason::CompatibilityNonLeafInstruction ) }) { - write!(f, "\n兼容分类表示当前准入限制,不代表这些方法都是生命周期回调。仅修改类前缀或降低保护级别不能证明这些方法已获 PVM2 保护;可将独立业务逻辑提取到普通类,并重新核验逐方法覆盖。")?; + write!(f, "\n兼容分类表示当前准入限制,不代表这些方法都是生命周期回调。仅修改类前缀或降低保护级别不能证明这些方法已获 PVM2 保护;请核对逐方法报告中的剩余语义限制,使用配套打包器重新加固并核验覆盖。")?; } if self.summary.reasons.keys().any(|r| { matches!( diff --git a/docs/process/test-checklist.md b/docs/process/test-checklist.md index ad47e1e..c954531 100644 --- a/docs/process/test-checklist.md +++ b/docs/process/test-checklist.md @@ -22,6 +22,15 @@ ANDROID_SERIAL=目标设备序列号 RUN_DEVICE_TEST=1 PVM2_STRICT_TEST=1 \ 存在多台在线设备时必须设置 `ANDROID_SERIAL`,脚本不会随机选择设备。候选版设备矩阵使用 `tests/scripts/run-device-matrix.sh`。脚本可盘点设备、以 `MATRIX_PVM2_STRICT_TEST=1` 逐设备执行 strict APK E2E,或安装 bundletool 生成的 APKS split,并可用 `MATRIX_REQUIRED_APIS/ABIS/VENDORS` 对缺失格子失败关闭;报告不保存 adb serial。dynamic-feature 必须执行功能代码探针,install-time Asset Pack 必须执行 PAS2 解密读取探针,不能只以 base 进程存活标记通过。 +PVM2 方法准入、跳板或异常语义调整后,还需运行 Java/D8 到 ART 的语义回归(JDK 17、SDK 35、Build Tools 35.0.0,以及已构建的 CLI、打包器和标准壳): + +```bash +ANDROID_SDK_ROOT=/本机/Android/sdk \ + python3 tests/scripts/check-pvm2-art.py --serial 目标设备序列号 +``` + +该脚本自建无资源 APK 和测试证书,核验 26 个转换方法及 10 个保留方法,覆盖继承/接口分派、D8 桥接、私有方法反射、引用身份、整数边界、捕获顺序、重抛与 `finally`。每次启动以独立标记确认 482 项断言;执行未加固基线、加固首次启动、再次启动、覆盖安装及基线恢复。省略 `--serial` 仅构建并检查产物;指定设备时只安装测试包,不卸载应用或清除设备日志。默认保留合法空资源表,`--without-resource-table` 补测完全无资源表的 APK。结果写入 `target/pvm2-art-checks/result.json`,模拟器通过不能代替厂商真机验收。 + AAB 候选版必须验证:`bundletool validate` 通过、APKS 包含预期 base/ABI/功能或 Asset Pack split、安装后进程保持运行,并在日志中观察到 PVM2 功能代码、PAS2 资源和业务 `.so` 探针。当前本机证据覆盖 API 35/Android 15 与 API 36/Android 16 的 arm64 install-time 组合;Google Play 内测和 Play App Signing 仍是独立门禁。 ## 使用时机 diff --git a/docs/usage.md b/docs/usage.md index ef5646f..d2031ea 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 指令与产物检查。支持基本类型计算,以及对象/数组参数未使用、引用透传、空值分支和引用身份比较;引用参数不会再仅因其类型被排除,但数组元素和字段访问仍不在这一兼容放行范围内。私有和静态方法可在框架类中单独转换;其它实例方法仅在直接继承 `Object`、不实现接口且不覆盖 `hashCode/finalize` 契约时适用此放行规则。分支、循环和数值运算仍须通过现有编译器检查,不能只凭命名认定可转换。 +选择范围在兼容性过滤**之前**统计。UI/导航、数据/资源辅助和媒体命名不再直接排除整类:没有对象状态访问、外部调用或同步的独立方法,可以继续进入 PVM2 指令与产物检查。支持基本类型计算,以及对象/数组参数未使用、引用透传、空值分支和引用身份比较;引用参数不会再仅因其类型被排除,但数组元素和字段访问仍不在这一兼容放行范围内。私有、静态和实例方法适用相同的方法体检查;继承父类或实现接口本身不再排除普通实例方法。跳板保留原声明、访问标志、参数与接收者,虚方法分派仍由 ART 完成;`hashCode/finalize` 等特殊对象契约仍保守保留。分支、循环和数值运算仍须通过现有编译器检查,不能只凭命名认定可转换。 -构造器、静态初始化器、生成桥接/合成方法和仍涉及框架状态的候选保持原兼容边界;未解析的外部或跨 DEX 继承契约不据此扩大虚方法范围。跳过项仍计入覆盖率分母,并保留 `ui_runtime_glue`、`compiler_generated_bridge`、`data_resource_runtime_glue` 或 `playback_compatibility` 等实际分类。精确必保清单同样受方法兼容检查约束,必保项被排除时任务失败,不会自动降级。所有候选都不可转换时仍返回 `PVM2_ZERO_METHODS`,不会把零转换记为成功。这些规则不代表已识别应用全部关键业务;完整覆盖率需用新打包器重新生成。 +独立方法中的异常处理不再仅因存在异常表而被排除。捕获、异常透传、重新抛出和不访问外部状态的清理逻辑继续经过异常表映射、控制流及指令检查;`throw null` 产生可被捕获的 `NullPointerException`。这不意味着任意 `try/catch/finally` 都受支持:异常区中的外部调用、字段、数组元素或同步仍受上述限制。 -兼容排除的本地原因带有首个阻断条件,例如 `ui_runtime_glue:virtual_contract`;脱敏摘要分别统计继承/接口虚方法契约未验证、同步方法、异常处理区及叶子方法白名单之外的指令。它们表示准入限制,不能据此认定方法一定是生命周期回调。旧报告没有细分信息时仍按原分类展示,不能反推具体方法体。基础预检通过也不代表 PVM2 方法覆盖已经通过。 +构造器、静态初始化器、生成桥接/合成方法和仍涉及框架状态的候选保持原兼容边界;放行继承类的独立方法不等于放行包含 `invoke-super` 等外部调用的方法体。跳过项仍计入覆盖率分母,并保留 `ui_runtime_glue`、`compiler_generated_bridge`、`data_resource_runtime_glue` 或 `playback_compatibility` 等实际分类。精确必保清单同样受方法兼容检查约束,必保项被排除时任务失败,不会自动降级。所有候选都不可转换时仍返回 `PVM2_ZERO_METHODS`,不会把零转换记为成功。这些规则不代表已识别应用全部关键业务;完整覆盖率需用配套的新打包器和运行时重新生成。 + +兼容排除的本地原因带有首个阻断条件,例如 `ui_runtime_glue:virtual_contract`;脱敏摘要分别统计特殊对象方法或虚方法契约未验证、同步方法及叶子方法白名单之外的指令,并兼容旧打包器返回的异常区排除原因。它们表示准入限制,不能据此认定方法一定是生命周期回调。旧报告没有细分信息时仍按原分类展示,不能反推具体方法体。基础预检通过也不代表 PVM2 方法覆盖已经通过。 只有一条 `return` 的参数透传方法同样可转换,包括对象、数组及基本类型/宽值。PVM2 重建完整方法体,不再沿用旧式原地回填的最小字节数限制;最终跳板与加密镜像仍必须通过产物校验。 diff --git a/shield-stub/compat/api19-rust/Cargo.lock b/shield-stub/compat/api19-rust/Cargo.lock index c2cd11f..5247f87 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.3" +version = "1.8.4" dependencies = [ "cc", "chacha20poly1305", diff --git a/shield-stub/compat/api19-rust/Cargo.toml b/shield-stub/compat/api19-rust/Cargo.toml index 4e99383..bdf2769 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.3" +version = "1.8.4" 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 905dd88..d70838a 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.3" +version = "1.8.4" edition = "2021" license = "MIT OR Apache-2.0" diff --git a/tests/java/com/yqsh/protector/packer/Pvm2ProtectionCheck.java b/tests/java/com/yqsh/protector/packer/Pvm2ProtectionCheck.java index e92f5a5..c333ac7 100644 --- a/tests/java/com/yqsh/protector/packer/Pvm2ProtectionCheck.java +++ b/tests/java/com/yqsh/protector/packer/Pvm2ProtectionCheck.java @@ -100,8 +100,10 @@ public static void main(String[] args) throws Exception { } 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]); + checkEmptyResourceTable(root); checkZeroMethodReports(root); checkMethodCompatibility(root); + checkInheritedExceptions(root); Path dex = Files.createDirectory(root.resolve("dex")); fixture(dex.resolve("classes.dex")); fixture(dex.resolve("classes3.dex")); @@ -211,7 +213,7 @@ private static void checkZeroMethodReports(Path root) throws Exception { methods.add(new ImmutableMethod(owner, "nativeCall", List.of(), "I", 0x109, Set.of(), Set.of(), null)); methods.add(new ImmutableMethod(owner, "", List.of(), "V", 0x10008, Set.of(), Set.of(), new ImmutableMethodImplementation(0, List.of(new ImmutableInstruction10x(Opcode.RETURN_VOID)), List.of(), List.of()))); - if (!kind.equals("native")) methods.add(new ImmutableMethod(owner, "value", List.of(), "I", kind.equals("ui") ? 1 : 9, Set.of(), Set.of(), + if (!kind.equals("native")) methods.add(new ImmutableMethod(owner, kind.equals("ui") ? "hashCode" : "value", List.of(), "I", kind.equals("ui") ? 1 : 9, Set.of(), Set.of(), new ImmutableMethodImplementation(kind.equals("registers") ? 512 : 1, List.of(new ImmutableInstruction31i(Opcode.CONST, 0, 42), new ImmutableInstruction11x(Opcode.RETURN, 0)), List.of(), List.of()))); DexPool pool = new DexPool(Opcodes.getDefault()); @@ -253,6 +255,102 @@ private static ImmutableClassDef calculationOwner(String type, String parent, Li return new ImmutableClassDef(type, 1, parent, interfaces, null, Set.of(), List.of(), methods); } + // 同一批异常方法同时用于真实打包检查和生产 Native 解释器执行,避免只验证准入结果。 + static List exceptionMethods(String owner) { + var parameter = List.of(new ImmutableMethodParameter("I", Set.of(), null)); + var division = List.of(new ImmutableInstruction21s(Opcode.CONST_16, 0, 12), + new ImmutableInstruction23x(Opcode.DIV_INT, 0, 0, 2), new ImmutableInstruction11x(Opcode.RETURN, 0), + new ImmutableInstruction11x(Opcode.MOVE_EXCEPTION, 0), new ImmutableInstruction11n(Opcode.CONST_4, 0, -7), + new ImmutableInstruction11x(Opcode.RETURN, 0)); + var ordered = new ArrayList(division); + ordered.addAll(List.of(new ImmutableInstruction11x(Opcode.MOVE_EXCEPTION, 0), + new ImmutableInstruction11n(Opcode.CONST_4, 0, -8), new ImmutableInstruction11x(Opcode.RETURN, 0), + new ImmutableInstruction11x(Opcode.MOVE_EXCEPTION, 0), new ImmutableInstruction21s(Opcode.CONST_16, 0, -9), + new ImmutableInstruction11x(Opcode.RETURN, 0))); + return List.of( + new ImmutableMethod(owner, "ordered", parameter, "I", 1, Set.of(), Set.of(), + new ImmutableMethodImplementation(3, ordered, List.of(new ImmutableTryBlock(2, 2, List.of( + new ImmutableExceptionHandler("Ljava/lang/ArithmeticException;", 5), + new ImmutableExceptionHandler("Ljava/lang/RuntimeException;", 8), new ImmutableExceptionHandler(null, 11)))), List.of())), + new ImmutableMethod(owner, "mismatch", parameter, "I", 1, Set.of(), Set.of(), + new ImmutableMethodImplementation(3, division, List.of(new ImmutableTryBlock(2, 2, + List.of(new ImmutableExceptionHandler("Ljava/lang/NullPointerException;", 5)))), List.of())), + new ImmutableMethod(owner, "cleanup", parameter, "I", 1, Set.of(), Set.of(), + new ImmutableMethodImplementation(4, List.of( + new ImmutableInstruction21s(Opcode.CONST_16, 0, 40), + new ImmutableInstruction23x(Opcode.DIV_INT, 1, 0, 3), + new ImmutableInstruction22b(Opcode.ADD_INT_LIT8, 0, 1, 2), new ImmutableInstruction11x(Opcode.RETURN, 0), + new ImmutableInstruction11x(Opcode.MOVE_EXCEPTION, 1), + new ImmutableInstruction22b(Opcode.ADD_INT_LIT8, 0, 0, 2), new ImmutableInstruction11x(Opcode.THROW, 1), + new ImmutableInstruction11x(Opcode.MOVE_EXCEPTION, 1), new ImmutableInstruction11x(Opcode.RETURN, 0)), + List.of(new ImmutableTryBlock(2, 2, List.of(new ImmutableExceptionHandler(null, 7))), + new ImmutableTryBlock(7, 4, List.of(new ImmutableExceptionHandler("Ljava/lang/ArithmeticException;", 11)))), List.of())), + new ImmutableMethod(owner, "rethrow", List.of(new ImmutableMethodParameter("Ljava/lang/Throwable;", Set.of(), null)), + "V", 1, Set.of(), Set.of(), new ImmutableMethodImplementation(3, List.of( + new ImmutableInstruction11x(Opcode.THROW, 2), new ImmutableInstruction11x(Opcode.MOVE_EXCEPTION, 0), + new ImmutableInstruction11x(Opcode.THROW, 0)), + List.of(new ImmutableTryBlock(0, 1, List.of(new ImmutableExceptionHandler("Ljava/lang/Throwable;", 1)))), List.of()))); + } + + private static void checkInheritedExceptions(Path root) throws Exception { + Path work = Files.createDirectory(root.resolve("inherited-exceptions")); + Path dex = Files.createDirectory(work.resolve("dex")); + String base = "Lfixture/contracts/Base;", contract = "Lfixture/contracts/Contract;"; + var declaration = new ImmutableMethod(contract, "calculate0", List.of(new ImmutableMethodParameter("I", Set.of(), null)), + "I", 0x401, Set.of(), Set.of(), null); + writeClasses(dex.resolve("classes2.dex"), List.of(calculationOwner(base, "Ljava/lang/Object;", List.of(), + List.of(new ImmutableMethod(base, "", List.of(), "V", 0x10001, Set.of(), Set.of(), + new ImmutableMethodImplementation(1, List.of(new ImmutableInstruction35c(Opcode.INVOKE_DIRECT, 1, 0, 0, 0, 0, 0, + new ImmutableMethodReference("Ljava/lang/Object;", "", List.of(), "V")), + new ImmutableInstruction10x(Opcode.RETURN_VOID)), List.of(), List.of())), + new ImmutableMethod(base, "calculate0", declaration.getParameters(), "I", 1, Set.of(), Set.of(), + new ImmutableMethodImplementation(2, List.of(new ImmutableInstruction11n(Opcode.CONST_4, 0, -1), + new ImmutableInstruction11x(Opcode.RETURN, 0)), List.of(), List.of())))), + new ImmutableClassDef(contract, 0x601, "Ljava/lang/Object;", List.of(), null, Set.of(), List.of(), List.of(declaration)))); + byte[] contracts = Files.readAllBytes(dex.resolve("classes2.dex")); + List selected = new ArrayList<>(); + for (int i = 0; i < 3; i++) { + String type = "Lfixture/ui/Rules" + i + ";"; + // 覆盖跨 DEX 父类、接口,以及包外框架父类;不依赖外部 SDK 解析继承图。 + String parent = i == 2 ? "Landroid/app/Activity;" : base; + List methods = new ArrayList<>(); + methods.add(new ImmutableMethod(type, "", List.of(), "V", 0x10001, Set.of(), Set.of(), + new ImmutableMethodImplementation(1, List.of(new ImmutableInstruction35c(Opcode.INVOKE_DIRECT, 1, 0, 0, 0, 0, 0, + new ImmutableMethodReference(parent, "", List.of(), "V")), new ImmutableInstruction10x(Opcode.RETURN_VOID)), List.of(), List.of()))); + for (int j = 0; j < (i == 2 ? 2 : 6); j++) methods.add(calculation(type, "calculate" + j, j == 1 ? 4 : 1)); + if (i == 2) methods.addAll(exceptionMethods(type)); + selected.add(calculationOwner(type, parent, List.of(contract), methods)); + } + writeClasses(dex.resolve("classes.dex"), selected); + Path config = work.resolve("config.json"), report = work.resolve("report.json"); + Files.writeString(config, new JSONObject().put("schema_version", 2).put("modules", new JSONObject() + .put("classes.dex", "base").put("classes2.dex", "base")).put("required", new JSONArray()).toString()); + run(dex, config, work.resolve("code.bin"), report, "Lfixture/ui/"); + int verified = 0, initializers = 0; + for (Object item : new JSONObject(Files.readString(report)).getJSONArray("methods")) { + JSONObject row = (JSONObject)item; + if (row.getBoolean("artifact_verified")) verified++; + else { assert row.getString("reason").equals("initializer") : row; initializers++; } + } + assert verified == 18 && initializers == 3; + assert Arrays.equals(contracts, Files.readAllBytes(dex.resolve("classes2.dex"))); + var rewritten = new DexBackedDexFile(Opcodes.getDefault(), Files.readAllBytes(dex.resolve("classes.dex"))); + for (var cls : rewritten.getClasses()) { + var original = selected.stream().filter(c -> c.getType().equals(cls.getType())).findFirst().orElseThrow(); + assert cls.getSuperclass().equals(original.getSuperclass()) && cls.getInterfaces().equals(original.getInterfaces()); + for (var method : cls.getMethods()) { + var before = new ArrayList(); original.getMethods().forEach(before::add); + var declarationBefore = before.stream().filter(m -> Pvm2Report.descriptor(m).equals(Pvm2Report.descriptor(method))).findFirst().orElseThrow(); + assert method.getAccessFlags() == declarationBefore.getAccessFlags(); + assert method.getAnnotations().equals(declarationBefore.getAnnotations()); + assert method.getParameters().equals(declarationBefore.getParameters()); + if (!method.getName().startsWith("<")) assert TrueVmpTrampoline.matches(method, 0, + rewritten.getMethodSection().indexOf(method), BRIDGE, "interpret"); + } + } + System.out.println("继承与异常兼容:跨 DEX/包外父类/接口的 14 个虚方法、4 个异常方法全部完成转换及产物验证,3 个初始化器保留"); + } + private static void writeClasses(Path path, List classes) throws Exception { DexPool pool = new DexPool(Opcodes.getDefault()); for (var cls : classes) pool.internClass(cls); @@ -285,12 +383,12 @@ private static void checkMethodCompatibility(Path root) throws Exception { var staticMethod = calculation(type, "utility", 9); for (String parent : List.of("Landroid/app/Activity;", "Lfixture/BaseActivity;", "Lexternal/Unknown;")) { var cls = calculationOwner(type, parent, List.of(), List.of()); - assert AutoVmpPolicy.exclusionReason(cls, publicMethod).equals("ui_runtime_glue:virtual_contract"); + assert AutoVmpPolicy.exclusionReason(cls, publicMethod) == null; assert AutoVmpPolicy.exclusionReason(cls, privateMethod) == null; assert AutoVmpPolicy.exclusionReason(cls, staticMethod) == null; } var callback = calculationOwner(type, "Ljava/lang/Object;", List.of("Lexternal/Callback;"), List.of()); - assert AutoVmpPolicy.exclusionReason(callback, publicMethod).equals("ui_runtime_glue:virtual_contract"); + assert AutoVmpPolicy.exclusionReason(callback, publicMethod) == null; var plain = calculationOwner(type, "Ljava/lang/Object;", List.of(), List.of()); for (int flags : List.of(0x29, 0x20009, 0x49, 0x1009)) assert AutoVmpPolicy.exclusionReason(plain, calculation(type, "calculate", flags)) != null; @@ -301,14 +399,14 @@ private static void checkMethodCompatibility(Path root) throws Exception { new ImmutableInstruction11x(Opcode.RETURN, 0), new ImmutableInstruction11x(Opcode.MOVE_EXCEPTION, 0), new ImmutableInstruction11n(Opcode.CONST_4, 0, 0), new ImmutableInstruction11x(Opcode.RETURN, 0)), List.of(new ImmutableTryBlock(0, 1, List.of(new ImmutableExceptionHandler(null, 2)))), List.of())); - assert AutoVmpPolicy.exclusionReason(plain, caught).equals("ui_runtime_glue:exception_region"); + assert AutoVmpPolicy.exclusionReason(plain, caught) == null; for (String generated : List.of("Lfixture/Rules$$ExternalSyntheticLambda0;", "Lfixture/Rules$1;")) assert AutoVmpPolicy.exclusionReason(calculationOwner(generated, "Ljava/lang/Object;", List.of(), List.of()), calculation(generated, "calculate", 9)).equals("compiler_generated_bridge"); - // 混淆类仍直接继承已知框架类型时,生命周期和接口回调保持原执行方式。 + // 混淆或框架继承不改变无状态方法体;入口契约由跳板保留。 var obfuscated = calculation("Lfixture/a;", "callback", 1); - assert AutoVmpPolicy.exclusionReason(calculationOwner("Lfixture/a;", "Landroid/app/Activity;", List.of(), List.of()), obfuscated).equals("ui_runtime_glue:virtual_contract"); - assert AutoVmpPolicy.exclusionReason(calculationOwner("Lfixture/a;", "Ljava/lang/Object;", List.of("Landroid/view/View$OnClickListener;"), List.of()), obfuscated).equals("ui_runtime_glue:virtual_contract"); + 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"); @@ -380,10 +478,13 @@ private static void checkMethodCompatibility(Path root) throws Exception { var references = new JSONObject(Files.readString(report)).getJSONArray("methods"); assert references.length() == 84; for (Object value : references) assert ((JSONObject)value).getBoolean("artifact_verified") : value; - // 精确必保清单也必须服从同一兼容判断;声明回调不会使其自动变得安全。 + // 精确必保清单不能绕过特殊对象方法的重入限制。 String activity = "Lfixture/ui/ScreenActivity;"; var sensitive = calculationOwner(activity, "Landroid/app/Activity;", List.of(), - List.of(calculation(activity, "callback", 1), calculation(activity, "local", 2))); + List.of(new ImmutableMethod(activity, "hashCode", List.of(), "I", 1, Set.of(), Set.of(), + new ImmutableMethodImplementation(1, List.of(new ImmutableInstruction11n(Opcode.CONST_4, 0, 1), + new ImmutableInstruction11x(Opcode.RETURN, 0)), List.of(), List.of())), + calculation(activity, "local", 2))); writeClasses(dex.resolve("classes.dex"), List.of(sensitive)); var captured = new java.io.ByteArrayOutputStream(); var previous = System.out; @@ -404,18 +505,48 @@ private static void checkMethodCompatibility(Path root) throws Exception { assert kept == 1 && protectedCount == 1 : "转换成功率不能代替完整范围覆盖率"; for (boolean safe : List.of(true, false)) { writeClasses(dex.resolve("classes.dex"), List.of(sensitive)); - selection.put("required", new JSONArray(List.of("base\t" + activity + "->" + (safe ? "local" : "callback") + "(I)I"))); + selection.put("required", new JSONArray(List.of("base\t" + activity + "->" + (safe ? "local(I)I" : "hashCode()I")))); Files.writeString(config, selection.toString()); try { run(dex, config, code, report, false); - assert safe : "回调被精确清单绕过兼容检查"; + assert safe : "特殊对象方法被精确清单绕过兼容检查"; } catch (InvocationTargetException failure) { assert !safe && failure.getCause().getMessage().contains("关键方法未通过验证"); JSONObject row = new JSONObject(Files.readString(report)).getJSONArray("methods").getJSONObject(0); assert !row.getBoolean("artifact_verified") && row.getString("reason").equals("ui_runtime_glue:virtual_contract"); } } - System.out.println("方法级兼容检查通过:通用命名、独立计算、回调保留、必保约束、18 个计算方法、60 个引用叶子方法及 24 个基本类型短方法转换"); + System.out.println("方法级兼容检查通过:通用命名、独立计算、特殊契约保留、必保约束、18 个计算方法、60 个引用叶子方法及 24 个基本类型短方法转换"); + } + + private static void checkEmptyResourceTable(Path root) throws Exception { + Path unpack = Files.createDirectory(root.resolve("resource-table")); + Path xml = Files.createDirectories(unpack.resolve("res/values")).resolve("public.xml"); + Path dex = unpack.resolve("classes.dex"); + fixture(dex); + byte[] before = Files.readAllBytes(dex); + for (String source : List.of("", "", + "")) { + Files.writeString(xml, source); + var result = ResourceIdRewriter.rewrite(unpack.toFile()); + assert result.mapping.isEmpty() && result.dexFiles == 1; + assert Files.readString(xml).equals(source) && Arrays.equals(before, Files.readAllBytes(dex)); + } + for (String source : List.of("", "", + "")) { + Files.writeString(xml, source); + try { ResourceIdRewriter.rewrite(unpack.toFile()); throw new AssertionError("未拒绝损坏资源表"); } + catch (java.io.IOException expected) { } + } + Files.delete(xml); + try { ResourceIdRewriter.rewrite(unpack.toFile()); throw new AssertionError("未拒绝缺失资源表"); } + catch (java.io.IOException expected) { } + Files.delete(xml.getParent()); Files.delete(unpack.resolve("res")); + assert ResourceIdRewriter.rewrite(unpack.toFile()).mapping.isEmpty(); + Files.write(unpack.resolve("resources.arsc"), new byte[]{0}); + try { ResourceIdRewriter.rewrite(unpack.toFile()); throw new AssertionError("未拒绝未解码资源表"); } + catch (java.io.IOException expected) { } + System.out.println("资源表检查通过:无资源、空表和单资源保持不变,损坏或未解码资源表仍拒绝"); } private static void fixture(Path path) throws Exception { @@ -428,7 +559,7 @@ private static void fixture(Path path) throws Exception { DexPool pool = new DexPool(Opcodes.getDefault()); pool.internClass(new ImmutableClassDef(OWNER, 1, "Ljava/lang/Object;", List.of(), null, Set.of(), List.of(), methods)); String excluded = "Lfixture/MainActivity;"; - var unchanged = new ImmutableMethod(excluded, "value", List.of(), "I", 1, Set.of(), Set.of(), + var unchanged = new ImmutableMethod(excluded, "hashCode", List.of(), "I", 1, Set.of(), Set.of(), new ImmutableMethodImplementation(1, List.of(new ImmutableInstruction31i(Opcode.CONST, 0, 42), new ImmutableInstruction11x(Opcode.RETURN, 0)), List.of(), List.of())); pool.internClass(new ImmutableClassDef(excluded, 1, "Landroid/app/Activity;", List.of(), null, Set.of(), List.of(), List.of(unchanged))); diff --git a/tests/java/com/yqsh/protector/packer/Pvm2RuntimeImages.java b/tests/java/com/yqsh/protector/packer/Pvm2RuntimeImages.java index 4e1aabe..681f7f8 100644 --- a/tests/java/com/yqsh/protector/packer/Pvm2RuntimeImages.java +++ b/tests/java/com/yqsh/protector/packer/Pvm2RuntimeImages.java @@ -110,5 +110,32 @@ public static void main(String[] args) throws Exception { Files.write(Path.of(args[0], "image" + i + ".gcm"), com.yqsh.protector.packer.util.CryptoUtils.aesGcmEncrypt(new byte[16], result.image)); } + String owner = "Lfixture/ui/VirtualRules;"; + List methods = new ArrayList<>(Pvm2ProtectionCheck.exceptionMethods(owner)); + methods.add(new ImmutableMethod(owner, "self", List.of(), "Ljava/lang/Object;", 1, Set.of(), Set.of(), + new ImmutableMethodImplementation(1, List.of(new ImmutableInstruction11x(Opcode.RETURN_OBJECT, 0)), List.of(), List.of()))); + methods.add(new ImmutableMethod(owner, "identity", List.of(new ImmutableMethodParameter("Ljava/lang/Object;", Set.of(), null)), + "Ljava/lang/Object;", 1, Set.of(), Set.of(), new ImmutableMethodImplementation(2, + List.of(new ImmutableInstruction11x(Opcode.RETURN_OBJECT, 1)), List.of(), List.of()))); + var cls = new ImmutableClassDef(owner, 1, "Lexternal/Base;", List.of("Lexternal/Contract;"), null, Set.of(), List.of(), methods); + DexPool pool = new DexPool(Opcodes.getDefault()); pool.internClass(cls); + Path path = Path.of(args[0], "compatibility.dex"); + FileDataStore store = new FileDataStore(path.toFile()); + try { pool.writeTo(store); } finally { store.close(); } + Dex compatibility = new Dex(path.toFile()); + Map bodies = new HashMap<>(); + for (var definition : compatibility.classDefs()) for (var method : compatibility.readClassData(definition).allMethods()) + bodies.put(compatibility.strings().get(compatibility.methodIds().get(method.getMethodIndex()).getNameIndex()), compatibility.readCode(method)); + for (int kind = 0; kind < methods.size(); kind++) for (int isa = 0; isa < 3; isa++) { + var method = methods.get(kind); + if (AutoVmpPolicy.exclusionReason(cls, method) != null) throw new AssertionError("兼容样本未准入"); + var result = Pvm2Compiler.tryCompile(compatibility, bodies.get(method.getName()), method.getReturnType(), false, + Pvm2Morph.fromIsa(isa, new SecureRandom()), true, method.getParameterTypes().stream().map(CharSequence::toString).toArray(String[]::new)); + if (!result.isOk()) throw new AssertionError(method.getName() + ": " + result.failReason); + int index = 72 + kind * 3 + isa; + Files.write(Path.of(args[0], "image" + index + ".bin"), result.image); + Files.write(Path.of(args[0], "image" + index + ".gcm"), + com.yqsh.protector.packer.util.CryptoUtils.aesGcmEncrypt(new byte[16], result.image)); + } } } diff --git a/tests/native/pvm2_runtime_check.cpp b/tests/native/pvm2_runtime_check.cpp index 0d1c35e..01bd454 100644 --- a/tests/native/pvm2_runtime_check.cpp +++ b/tests/native/pvm2_runtime_check.cpp @@ -92,8 +92,8 @@ int main(int argc, char** argv) { assert(written == 123 && std::all_of(std::begin(boundary), std::end(boundary), [](uint8_t c) { return c == 0xa5; })); const auto plain = image(); std::vector code; - u16(code, 4); u16(code, 1); u32(code, 8); u32(code, 2); u16(code, argc > 1 && std::string(argv[1]) != "block-before-init" ? 170 : 98); - for (int i = 0; i < (argc > 1 && std::string(argv[1]) != "block-before-init" ? 170 : 98); i++) { + u16(code, 4); u16(code, 1); u32(code, 8); u32(code, 2); u16(code, argc > 1 && std::string(argv[1]) != "block-before-init" ? 188 : 98); + for (int i = 0; i < (argc > 1 && std::string(argv[1]) != "block-before-init" ? 188 : 98); i++) { auto bytes = plain; if (i >= 98) { std::ifstream input(std::string(argv[1]) + "/image" + std::to_string(i - 98) + ".bin", std::ios::binary); @@ -346,6 +346,56 @@ int main(int argc, char** argv) { env->DeleteLocalRef(unary); env->DeleteLocalRef(array); env->DeleteLocalRef(text); env->DeleteLocalRef(equalText); env->DeleteLocalRef(alias); puts("引用叶子方法:三种 ISA 共 666 次透传、空值选择、身份比较、数组引用及清理验证通过"); + // 继承类/接口方法沿用相同跳板参数布局,this 不能和首个业务参数混淆。 + jclass arithmetic = env->FindClass("java/lang/ArithmeticException"); + jclass nullPointer = env->FindClass("java/lang/NullPointerException"); + jobject thrown = env->NewObject(arithmetic, env->GetMethodID(arithmetic, "", "()V")); + jobjectArray instanceArgs = env->NewObjectArray(2, objectClass, nullptr); + jobjectArray thisOnly = env->NewObjectArray(1, objectClass, nullptr); + int compatibilityChecks = 0; + for (int isa = 0; isa < 3; isa++) for (jobject receiver : {sentinel, wrappers[0]}) { + assert(receiver); + env->SetObjectArrayElement(instanceArgs, 0, receiver); + env->SetObjectArrayElement(thisOnly, 0, receiver); + result = interpret(env, 2, 182 + isa, thisOnly); + assert(!env->ExceptionCheck() && env->IsSameObject(result, receiver)); + env->DeleteLocalRef(result); compatibilityChecks++; + for (jobject argument : {receiver, thrown, static_cast(nullptr)}) { + env->SetObjectArrayElement(instanceArgs, 1, argument); + result = interpret(env, 2, 185 + isa, instanceArgs); + assert(!env->ExceptionCheck() && env->IsSameObject(result, argument)); + if (result) env->DeleteLocalRef(result); + compatibilityChecks++; + } + for (int kind = 0; kind < 3; kind++) for (int divisor : {INT32_MIN, -3, 0, 1, 2, INT32_MAX}) { + jobject argument = env->CallStaticObjectMethod(integer, box, divisor); + env->SetObjectArrayElement(instanceArgs, 1, argument); env->DeleteLocalRef(argument); + result = interpret(env, 2, 170 + kind * 3 + isa, instanceArgs); + if (kind == 1 && divisor == 0) { + assert(!result && env->ExceptionCheck()); + jthrowable error = env->ExceptionOccurred(); env->ExceptionClear(); + assert(env->IsInstanceOf(error, arithmetic)); env->DeleteLocalRef(error); + } else { + int expected = kind == 2 ? (divisor == 0 ? 42 : 40 / divisor + 2) : (divisor == 0 ? -7 : 12 / divisor); + assert(result && !env->ExceptionCheck() && env->CallIntMethod(result, unbox) == expected); + env->DeleteLocalRef(result); + } + compatibilityChecks++; + } + for (jobject argument : {thrown, static_cast(nullptr)}) { + env->SetObjectArrayElement(instanceArgs, 1, argument); + result = interpret(env, 2, 179 + isa, instanceArgs); + assert(!result && env->ExceptionCheck()); + jthrowable error = env->ExceptionOccurred(); env->ExceptionClear(); + assert(argument ? env->IsSameObject(error, argument) : env->IsInstanceOf(error, nullPointer)); + env->DeleteLocalRef(error); compatibilityChecks++; + } + } + assert(compatibilityChecks == 144); + for (int id = 170; id < 188; id++) assert(!items.at(id)->parsed_vm && items.at(id)->vm_image.capacity() == 0); + env->DeleteLocalRef(arithmetic); env->DeleteLocalRef(nullPointer); env->DeleteLocalRef(thrown); + env->DeleteLocalRef(instanceArgs); env->DeleteLocalRef(thisOnly); + puts("继承与异常方法:三种 ISA 共 144 次 this/参数身份、捕获优先级、不匹配异常传播、finally 清理及重抛身份检查通过"); for (jobject wrapper : wrappers) if (wrapper) env->DeleteLocalRef(wrapper); env->DeleteLocalRef(sentinel); env->DeleteLocalRef(tailArgs); env->DeleteLocalRef(mixedArgs); env->DeleteLocalRef(objectClass); puts("声明参数类型:5 种包装引用、null、混合宽参数、数量/类型错误拒绝通过"); diff --git a/tests/scripts/check-pvm2-art.py b/tests/scripts/check-pvm2-art.py new file mode 100644 index 0000000..baf16c8 --- /dev/null +++ b/tests/scripts/check-pvm2-art.py @@ -0,0 +1,300 @@ +#!/usr/bin/env python3 +"""构建自有 Java/D8 APK,对指定设备执行基线、首次、缓存及覆盖安装回归;不自动选择设备。""" +import argparse +from collections import Counter +import hashlib +import json +import os +from pathlib import Path +import re +import subprocess +import time +import uuid +import zipfile + +ROOT = Path(__file__).resolve().parents[2] +SOURCE = r''' +package dev.mocika.shield.pvm2regression; + +import android.app.Activity; +import android.os.Bundle; +import android.util.Log; +import java.lang.reflect.Method; + +/** Java/D8 真实调用样本;同时检查被转换方法和保持 ART 的兼容边界。 */ +public class CompatibilityActivity extends Activity { + public interface Contract { + 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 RulesView extends Base implements Contract { + @Override public int compute(int value) { return value + 7; } + public long compute(long value) { return value ^ 0x123456789abcdefL; } + public Object self() { return this; } + public Object identity(Object value) { return value; } + public int[] identity(int[] value) { return value; } + public boolean same(Object a, Object b) { return a == b; } + public Object choose(Object a, Object b) { return a != null ? a : b; } + protected int protectedValue(int value) { return value + 3; } + private int privateValue(int value) { return value ^ 0x5a; } + public static int staticValue(int value) { return value - 11; } + public int divide(int value, int divisor) { + try { return value / divisor; } catch (ArithmeticException error) { return -17; } + } + public long wideDivide(long value, long divisor) { + try { return value / divisor; } catch (ArithmeticException error) { return -17L; } + } + public long wideRemainder(long value, long divisor) { + try { return value % divisor; } catch (ArithmeticException error) { return -17L; } + } + public int nested(int divisor) { + int value = 40; + try { + try { value = 40 / divisor; } catch (ArithmeticException error) { value = -17; } + } finally { value += 3; } + return value; + } + public int ordered(Throwable error) { + try { throw error; } + catch (IllegalArgumentException caught) { return 1; } + catch (RuntimeException caught) { return 2; } + catch (Exception caught) { return 3; } + catch (Throwable caught) { return 4; } + } + public int multi(Throwable error) { + try { throw error; } + catch (IllegalArgumentException | NullPointerException caught) { return 1; } + catch (RuntimeException caught) { return 2; } + catch (Throwable caught) { return 3; } + } + public void rethrow(Throwable error) throws Throwable { + try { throw error; } catch (Throwable caught) { throw caught; } + } + public void replace(Throwable original, Throwable replacement) throws Throwable { + try { throw original; } finally { throw replacement; } + } + public int returnInFinally(int divisor) { + try { return 12 / divisor; } finally { return 77; } + } + public Throwable catchReturn(Throwable error) { + try { throw error; } catch (Throwable caught) { return caught; } + } + public Object finallyReference(Object input, Throwable error) throws Throwable { + try { if (error != null) throw error; return input; } finally { input = null; } + } + public int loopCatch(int count) { + int sum = 0; + for (int i = 0; i < count; i++) { + try { sum += 100 / (i - 2); } catch (ArithmeticException error) { sum ^= 5; } + } + return sum; + } + public int switchInCatch(int value, int divisor) { + try { return value / divisor; } + catch (ArithmeticException error) { + switch (value) { case -1: return 31; case 0: return 43; case 1: return 59; default: return 71; } + } + } + public double floating(double value) { return value * 1.5d + 2.0d; } + } + public static class ChildView extends RulesView { + @Override public int compute(int value) { return value + 17; } + @Override public Object self() { return this; } + } + public static class RejectedView extends Base { + private int counter; + public int stateful() { return ++counter; } + public int callOther(int value) { return Math.abs(value); } + public int superCompute(int value) { return super.compute(value); } + public synchronized int locked() { return 5; } + @Override public int hashCode() { return 13; } + public native int nativeCall(); + } + private int checks; + private void check(boolean passed, String label) { + if (!passed) throw new AssertionError(label); + checks++; + } + @Override public void onCreate(Bundle state) { + super.onCreate(state); + try { + RulesView parent = new RulesView(); ChildView child = new ChildView(); + Base base = child; Contract face = child; RulesView view = child; + check(base.compute(5) == 22 && face.compute(5) == 22 && view.compute(5) == 22, "虚分派"); + check(face.defaultValue(5) == 15 && new Base().compute(5) == -1, "默认接口和父类"); + check(parent.self() == parent && child.self() == child, "接收者"); + Object first = new Object(), other = new Object(); int[] array = {1, 2}; + for (Object input : new Object[]{null, first, other, array, Integer.valueOf(3)}) { + check(parent.identity(input) == input && parent.choose(null, input) == input, "引用与空值"); + check(parent.finallyReference(input, null) == input, "finally 引用存活"); + check(parent.same(input, input) && !parent.same(first, other), "引用身份"); + } + check(parent.identity(array) == array && parent.identity((int[])null) == null, "数组透传"); + Method privateMethod = RulesView.class.getDeclaredMethod("privateValue", int.class); + privateMethod.setAccessible(true); + int[] ints = {Integer.MIN_VALUE, -10000, -3, -1, 0, 1, 2, 7, 10000, Integer.MAX_VALUE}; + long[] longs = {Long.MIN_VALUE, -10000000001L, -3L, -1L, 0L, 1L, 2L, Long.MAX_VALUE}; + for (int value : ints) { + check(parent.compute(value) == value + 7 && parent.protectedValue(value) == value + 3, "整数与访问标志"); + check((Integer)privateMethod.invoke(parent, value) == (value ^ 0x5a) && RulesView.staticValue(value) == value - 11, "反射私有和静态"); + for (int divisor : ints) { + check(parent.divide(value, divisor) == (divisor == 0 ? -17 : value / divisor), "整数除法异常"); + int caught = value == -1 ? 31 : value == 0 ? 43 : value == 1 ? 59 : 71; + check(parent.switchInCatch(value, divisor) == (divisor == 0 ? caught : value / divisor), "catch switch"); + } + check(parent.nested(value) == (value == 0 ? -14 : 40 / value + 3), "嵌套清理"); + check(parent.returnInFinally(value) == 77, "finally 覆盖返回与异常"); + } + for (long value : longs) { + check(parent.compute(value) == (value ^ 0x123456789abcdefL), "宽值重载"); + for (long divisor : longs) { + check(parent.wideDivide(value, divisor) == (divisor == 0 ? -17L : value / divisor), "长整数除法"); + check(parent.wideRemainder(value, divisor) == (divisor == 0 ? -17L : value % divisor), "长整数余数"); + } + } + Throwable[] errors = {null, new IllegalArgumentException(), new IllegalStateException(), new Exception(), new AssertionError()}; + for (int i = 0; i < errors.length; i++) { + Throwable error = errors[i]; + check(parent.ordered(error) == (i == 1 ? 1 : i <= 2 ? 2 : i == 3 ? 3 : 4), "捕获顺序"); + check(parent.multi(error) == (i <= 1 ? 1 : i == 2 ? 2 : 3), "多类型捕获"); + Throwable returned = parent.catchReturn(error); + check(error == null ? returned instanceof NullPointerException : returned == error, "捕获对象"); + try { parent.rethrow(error); throw new AssertionError("异常丢失"); } + catch (Throwable caught) { check(error == null ? caught instanceof NullPointerException : caught == error, "重抛身份"); } + if (error != null) { + try { parent.finallyReference(first, error); throw new AssertionError("异常丢失"); } + catch (Throwable caught) { check(caught == error, "finally 异常身份"); } + } + for (Throwable replacement : errors) { + try { parent.replace(error, replacement); throw new AssertionError("异常丢失"); } + catch (Throwable caught) { check(replacement == null ? caught instanceof NullPointerException : caught == replacement, "finally 替换异常"); } + } + } + for (int count = 0; count < 30; count++) { + int expected = 0; + for (int i = 0; i < count; i++) expected = i == 2 ? expected ^ 5 : expected + 100 / (i - 2); + check(parent.loopCatch(count) == expected, "循环异常汇合"); + } + 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), "浮点特殊值"); + 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 同步与对象契约保留"); + 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); } + } +} +''' + +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('--without-resource-table', action='store_true', help='生成完全不带 resources.arsc 的 APK,默认保留合法空表') +args = parser.parse_args() +work = args.output.resolve() +work.mkdir(parents=True, exist_ok=True) +sdk_value = os.environ.get('ANDROID_SDK_ROOT') or os.environ.get('ANDROID_HOME') +if not sdk_value: + raise SystemExit('请设置 ANDROID_SDK_ROOT') +sdk = Path(sdk_value) +bt = sdk / 'build-tools/35.0.0' +android = sdk / 'platforms/android-35/android.jar' +cli = ROOT / 'target/release/shield' +env = dict(os.environ, SHIELD_TEST_KS_PASS='shellsmith-art-regression') +log = (work / 'commands.log').open('w') + +def run(command): + result = subprocess.run([str(x) for x in command], cwd=ROOT, env=env, capture_output=True, text=True, timeout=180) + log.write(result.stdout + result.stderr); log.flush() + if result.returncode: + raise RuntimeError('命令失败,请查看 ' + str(work / 'commands.log')) + return result.stdout + +for name in ['classes', 'dex']: + (work / name).mkdir(exist_ok=True) +(work / 'CompatibilityActivity.java').write_text(SOURCE) +package = 'dev.mocika.shield.pvm2regression' +(work / 'AndroidManifest.xml').write_text('') +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']) +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': + archive.writestr(entry, base.read(entry.filename)) + archive.write(work / 'dex/classes.dex', 'classes.dex') +keystore = work / 'test.p12' +if not keystore.exists(): + run(['keytool', '-genkeypair', '-noprompt', '-keystore', keystore, '-storetype', 'PKCS12', '-storepass:env', 'SHIELD_TEST_KS_PASS', '-keypass:env', 'SHIELD_TEST_KS_PASS', '-alias', 'probe', '-keyalg', 'RSA', '-validity', '365', '-dname', 'CN=Shellsmith ART Test']) +keystore.chmod(0o600) +env['MOCIKA_SHIELD_KS_PASS'] = env['SHIELD_TEST_KS_PASS'] + +def sign(source, destination): + run([cli, 'sign', '-i', work / source, '-o', work / destination, '--ks', keystore, '--key-alias', 'probe', '--ks-type', 'pkcs12', '--apksigner', ROOT / 'tools/apksigner.jar']) + +sign('input-unsigned.apk', 'input.apk') +protect = [cli, 'protect', '-i', work / 'input.apk', '-o', work / 'protected.apk', '--resources', ROOT / 'shield-stub/build/outputs/resources/resources.zip', '--apktool', ROOT / 'tools/apktool_3.0.3.jar', '--apksigner', ROOT / 'tools/apksigner.jar', '--profile', 'strict', '--ai-resistance', 'high', '--environment-policy', 'compatible', '--xop-pvm2-packer', ROOT / 'tools/xop-pvm2-packer.jar'] +for name in ['RulesView', 'ChildView', 'RejectedView']: + protect += ['--xop-true-vmp-prefix', 'L' + package.replace('.', '/') + '/CompatibilityActivity$' + name + ';'] +run(protect) +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() +counts = Counter() +for row in report['methods']: + if '-><' in row['descriptor']: + assert not row['artifact_verified'] and row['reason'] == 'initializer', row + 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']: + 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', + '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) +results = {'coverage': dict(counts), 'apk_sha256': report['output_sha256'], + 'resource_table': 'absent' if args.without_resource_table else 'empty', + '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: + adb = [sdk / 'platform-tools/adb', '-s', serial] + device = {'api': run(adb + ['shell', 'getprop', 'ro.build.version.sdk']).strip(), + 'abi': run(adb + ['shell', 'getprop', 'ro.product.cpu.abi']).strip(), 'scenarios': []} + for scenario, apk in [('baseline', 'input.apk'), ('protected-first', 'protected-signed.apk'), + ('protected-cached', None), ('protected-update', 'protected-signed.apk'), ('baseline-restore', 'input.apk')]: + if apk: + assert 'Success' in run(adb + ['install', '-r', work / apk]) + run(adb + ['shell', 'am', 'force-stop', package]) + # 只读取本次启动之后的日志;不清除设备日志或现有业务数据。 + stamp = run(adb + ['shell', 'date', "'+%m-%d %H:%M:%S.000'"]).strip() + token = uuid.uuid4().hex + marker = 'PVM2_REGRESSION_OK token=' + token + ' checks=' + run(adb + ['shell', 'am', 'start', '-W', '-n', package + '/.CompatibilityActivity', '--es', 'run_token', token]) + logs = '' + for _ in range(15): + logs = run(adb + ['logcat', '-d', '-T', stamp, '-s', 'Pvm2Regression:E', 'AndroidRuntime:E', '*:S']) + if marker in logs or 'FATAL EXCEPTION' in logs: + break + time.sleep(1) + path = work / ('api' + device['api'] + '-' + scenario + '.log') + path.write_text(logs) + 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 + device['page_size'] = int(match.group(2)) + assert run(adb + ['shell', 'pidof', package]).strip(), str(path) + device['scenarios'].append({'name': scenario, 'checks': checks}) + print('Android API ' + device['api'] + ' ' + scenario + ':' + str(checks) + ' 项执行检查通过', flush=True) + results['devices'].append(device) + (work / 'result.json').write_text(json.dumps(results, ensure_ascii=False, indent=2) + '\n') diff --git a/tests/scripts/check-pvm2-runtime.py b/tests/scripts/check-pvm2-runtime.py index a2fc758..d64da79 100644 --- a/tests/scripts/check-pvm2-runtime.py +++ b/tests/scripts/check-pvm2-runtime.py @@ -24,6 +24,7 @@ jar = ROOT / 'tools/xop-pvm2-packer.jar' subprocess.run([sys.executable, str(ROOT / 'scripts/build_pvm2_packer.py'), '--check'], check=True) subprocess.run(['javac', '--release', '17', '-cp', str(jar), '-d', str(temp), + str(ROOT / 'tests/java/com/yqsh/protector/packer/Pvm2ProtectionCheck.java'), str(ROOT / 'tests/java/com/yqsh/protector/packer/Pvm2RuntimeImages.java')], check=True) subprocess.run(['java', '-cp', str(temp) + os.pathsep + str(jar), 'com.yqsh.protector.packer.Pvm2RuntimeImages', str(temp)], check=True) 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 8537ec5..f90bb1c 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 @@ -3167,8 +3167,10 @@ PROTECTOR_ENCRYPT static jobject interpret_body(JNIEnv* env, int dex_index, uint case OP_THROW: { if (pc + 1 > code_size) goto fail; uint8_t src = code[pc++]; - if (!reg_bounds(src, regs.size()) || regs[src].o == nullptr) goto fail; - env->Throw(static_cast(regs[src].o)); + if (!reg_bounds(src, regs.size())) goto fail; + // throw null 与 ART 一致地产生 NPE,且必须经过当前方法的异常表。 + if (regs[src].o == nullptr) throw_npe(env, "throw null"); + else env->Throw(static_cast(regs[src].o)); 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 c48f2cc..72067e7 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,21 +134,20 @@ 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(owner, method); + String restriction = independentMethodRestriction(method); return restriction == null ? null : reason + ":" + restriction; } - private static String independentMethodRestriction(ClassDef owner, Method method) { + private static String independentMethodRestriction(Method method) { int flags = method.getAccessFlags(); var code = method.getImplementation(); if ((flags & (0x20 | 0x20000)) != 0) return "synchronization"; - if (!code.getTryBlocks().isEmpty()) return "exception_region"; - // 私有/静态方法不覆盖框架回调;其它实例方法仅放行无继承/接口契约的普通类。 - // ponytail: 未解析外部及跨 DEX 父类的回调契约,保守保留其虚方法;扩展需完整继承图验证。 - if ((flags & (0x2 | 0x8)) == 0 && (!"Ljava/lang/Object;".equals(owner.getSuperclass()) - || !owner.getInterfaces().isEmpty() || method.getName().equals("hashCode") + // 跳板保留原声明、访问标志和 this,虚分派仍由 ART 完成;继承/接口本身不改变叶子方法语义。 + // ponytail: hashCode/finalize 仍留在 ART,避免运行时重入;扩展需单独验证 GC 与内部对象操作。 + if ((flags & (0x2 | 0x8)) == 0 && (method.getName().equals("hashCode") || method.getName().equals("finalize"))) return "virtual_contract"; - // ponytail: 仅放行无状态访问、外部调用的叶子方法;引用参数、透传与比较复用已有类型化运行时。 + // 异常表交给 Pvm2Safety 和编译器校验;move-exception/throw 支持捕获、finally 和重新抛出。 + // ponytail: 仅放行无状态访问、外部调用的叶子方法;引用和异常复用已有类型化运行时。 // 字段、数组元素、调用等仍留在 ART;扩展需验证对象状态与框架语义,不能直接移除命名规则。 for (var instruction : code.getInstructions()) { Opcode opcode = instruction.getOpcode(); @@ -156,8 +155,8 @@ private static String independentMethodRestriction(ClassDef owner, Method method Short value = OPCODES.getOpcodeValue(opcode); if (value == null) return "non_leaf_instruction"; int op = Short.toUnsignedInt(value); - if (!(op <= 0x09 || (op >= 0x0e && op <= 0x11) || (op >= 0x12 && op <= 0x19) - || (op >= 0x28 && op <= 0x3d) || (op >= 0x7b && op <= 0xe2))) return "non_leaf_instruction"; + if (!(op <= 0x09 || (op >= 0x0d && op <= 0x11) || (op >= 0x12 && op <= 0x19) + || (op >= 0x27 && op <= 0x3d) || (op >= 0x7b && op <= 0xe2))) return "non_leaf_instruction"; } return null; } diff --git a/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/ResourceIdRewriter.java b/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/ResourceIdRewriter.java index e8b50c4..1817e82 100644 --- a/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/ResourceIdRewriter.java +++ b/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/ResourceIdRewriter.java @@ -81,12 +81,20 @@ private ResourceIdRewriter() { } public static Result rewrite(File unpackRoot) throws Exception { + // Apktool 解包完全不含资源表的 APK 时不生成 res 目录。 + if (!new File(unpackRoot, "res").exists() && !new File(unpackRoot, "resources.arsc").exists()) + return new Result(Map.of(), 0, listDexFiles(unpackRoot).size()); File publicXml = new File(unpackRoot, "res/values/public.xml"); if (!publicXml.isFile()) { throw new IOException("resource ID reorder requires res/values/public.xml"); } Document document = parseXml(publicXml); + if (!"resources".equals(document.getDocumentElement().getTagName())) { + throw new IOException("public.xml requires a resources root"); + } NodeList nodes = document.getElementsByTagName("public"); + // 无资源 APK 的合法空表无需重排;损坏或缺失的表仍须报错。 + if (nodes.getLength() == 0) return new Result(Map.of(), 0, listDexFiles(unpackRoot).size()); Map entries = new LinkedHashMap<>(); Map> byType = new LinkedHashMap<>(); Set semanticPins = new HashSet<>(); diff --git a/tools/xop-pvm2-packer.jar b/tools/xop-pvm2-packer.jar index 0c7775403423f030637a9675ed81e7d101ef9883..17f77184e860b68b22fb5a4ad109166f77bd3763 100644 GIT binary patch delta 119337 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 gZ!U2-?kY6zyuoX5-Brwh?O;~KT9ExUoWv}n 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 delta 119265 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