From c13f0139206388b6dd1b75d39db9d6adcea9317e Mon Sep 17 00:00:00 2001 From: haonan Date: Fri, 16 Oct 2026 14:59:59 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20PVM2=20?= =?UTF-8?q?=E5=BC=95=E7=94=A8=E4=B8=8E=E7=9F=AD=E6=96=B9=E6=B3=95=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E5=B9=B6=E5=8F=91=E5=B8=83=201.8.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/release-notes/versions/1.8.3.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 +- .../components/app/protect-progress-panel.tsx | 12 +-- apps/shield-gui/src/hooks/use-about-page.ts | 2 +- .../src/hooks/use-protect-workflow.ts | 1 + .../shield-gui/src/hooks/use-sign-workflow.ts | 2 + apps/shield-gui/src/lib/i18n.ts | 4 +- apps/shield-gui/src/lib/protect-diagnostic.ts | 6 +- apps/shield-gui/src/lib/tauri.ts | 2 +- .../shield-gui/src/pages/aab-protect-page.tsx | 1 + .../tests/protect-diagnostic.test.mjs | 12 +++ .../tests/protect-progress.test.mjs | 27 +++++++ crates/shield-core/Cargo.toml | 2 +- crates/shield-core/src/protection_report.rs | 49 +++++++++++- docs/usage.md | 6 +- 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 | 75 +++++++++++++----- .../protector/packer/Pvm2RuntimeImages.java | 25 +++++- tests/native/pvm2_runtime_check.cpp | 44 +++++++++- .../yqsh/protector/packer/AutoVmpPolicy.java | 32 +++----- .../com/yqsh/protector/packer/PackerMain.java | 11 +-- .../yqsh/protector/packer/Pvm2Admission.java | 4 + tools/xop-pvm2-packer.jar | Bin 8316298 -> 8316281 bytes 30 files changed, 277 insertions(+), 78 deletions(-) create mode 100644 .github/release-notes/versions/1.8.3.md create mode 100644 apps/shield-gui/tests/protect-progress.test.mjs diff --git a/.github/release-notes/versions/1.8.3.md b/.github/release-notes/versions/1.8.3.md new file mode 100644 index 0000000..2768829 --- /dev/null +++ b/.github/release-notes/versions/1.8.3.md @@ -0,0 +1,12 @@ +### PVM2 引用与短方法兼容修复 + +- 修复独立方法因对象、数组参数被过度排除的问题。符合条件的引用透传、空值判断和引用身份比较可继续进入 PVM2 转换与产物核验。 +- 修复单条 `return` 方法被旧式原地回填长度检查拦截的问题,覆盖对象、数组和基本类型/宽值参数透传;PVM2 仍须通过完整跳板及加密镜像验证。 +- 细分继承/接口虚方法契约、同步、异常处理区及指令限制,避免把所有兼容排除都显示为生命周期问题。零转换、必保方法未覆盖仍明确失败,跳过项仍计入完整覆盖率。 +- 修复 APK、AAB 和签名任务失败后仍显示“执行中”的进度标题,补齐结束计时和失败步骤标记;明确基础预检通过不代表方法覆盖已通过。 + +### 验证与使用说明 + +- 已完成自建 APK 的加固、签名和产物复核,以及生产 Native 解释器三种 ISA 下 666 次引用语义检查。旧版为零转换的引用样本在修复后验证了 18/21 个方法,3 个构造器明确保留;继承契约负例仍正确失败。 +- 本次未新增 Android 真机回归,宿主 JVM/JNI 测试不能代替 ART 真机验收。没有客户 APK 和方法体时,不能据此保证其具体方法全部兼容。 +- 升级后需要重新加固,已有 APK 不会自动获得本次修复。逐方法报告包含业务标识,分享前请手动脱敏。 diff --git a/Cargo.lock b/Cargo.lock index 75aa77c..1f00c7f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2201,7 +2201,7 @@ dependencies = [ [[package]] name = "mocika-shield" -version = "1.8.2" +version = "1.8.3" dependencies = [ "dunce", "reqwest 0.12.28", @@ -2229,7 +2229,7 @@ dependencies = [ [[package]] name = "mocikashield" -version = "1.8.2" +version = "1.8.3" dependencies = [ "cc", "chacha20poly1305", @@ -3635,7 +3635,7 @@ dependencies = [ [[package]] name = "shield-cli" -version = "1.8.2" +version = "1.8.3" dependencies = [ "anyhow", "clap", @@ -3653,7 +3653,7 @@ dependencies = [ [[package]] name = "shield-core" -version = "1.8.2" +version = "1.8.3" dependencies = [ "anyhow", "chacha20poly1305", diff --git a/apps/shield-cli/Cargo.toml b/apps/shield-cli/Cargo.toml index beb2cfd..665a553 100644 --- a/apps/shield-cli/Cargo.toml +++ b/apps/shield-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shield-cli" -version = "1.8.2" +version = "1.8.3" 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 16d9e21..156a019 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.2", + "version": "1.8.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mocika-shield-gui", - "version": "1.8.2", + "version": "1.8.3", "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 dc7867a..40b524f 100644 --- a/apps/shield-gui/package.json +++ b/apps/shield-gui/package.json @@ -1,6 +1,6 @@ { "name": "mocika-shield-gui", - "version": "1.8.2", + "version": "1.8.3", "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 62104a0..66a7cd9 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.2" +version = "1.8.3" 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 a01932a..99bc4ba 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.2", + "version": "1.8.3", "identifier": "dev.mocika.shield-gui", "build": { "beforeDevCommand": "npm run dev -- --host 127.0.0.1", diff --git a/apps/shield-gui/src/components/app/protect-progress-panel.tsx b/apps/shield-gui/src/components/app/protect-progress-panel.tsx index 08b947d..ddc31fa 100644 --- a/apps/shield-gui/src/components/app/protect-progress-panel.tsx +++ b/apps/shield-gui/src/components/app/protect-progress-panel.tsx @@ -1,5 +1,5 @@ import { useEffect, useState } from "react"; -import { Check, Loader2 } from "lucide-react"; +import { Check, CircleX, Loader2 } from "lucide-react"; import { stepLabels } from "@/components/app/branding"; import { t, type Locale } from "@/lib/i18n"; @@ -24,10 +24,10 @@ export function ProtectProgressPanel({ }) { const [tick, refresh] = useState(0); useEffect(() => { - if (!startedAt || finishedAt) return; + if (state !== "running" || !startedAt || finishedAt) return; const timer = window.setInterval(() => refresh((value) => value + 1), 1000); return () => window.clearInterval(timer); - }, [finishedAt, startedAt]); + }, [state, finishedAt, startedAt]); const currentIndex = steps.indexOf(currentStep); const percent = state === "done" ? 100 : currentIndex < 0 ? 0 : Math.min(99, Math.round(((currentIndex + 0.5) / steps.length) * 100)); const elapsed = (() => { @@ -39,7 +39,7 @@ export function ProtectProgressPanel({ return (