From 6583c80d3f022c7290fe9df758ea5e8371816be4 Mon Sep 17 00:00:00 2001 From: haonan Date: Fri, 16 Oct 2026 11:22:28 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=E4=BF=9D=E7=95=99=20PVM2=20?= =?UTF-8?q?=E9=9B=B6=E8=BD=AC=E6=8D=A2=E5=A4=B1=E8=B4=A5=E6=8A=A5=E5=91=8A?= =?UTF-8?q?=E4=B8=8E=E8=84=B1=E6=95=8F=E5=8E=9F=E5=9B=A0=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/shield-cli/src/commands.rs | 6 +- apps/shield-gui/src-tauri/src/aab_runner.rs | 2 +- .../src-tauri/src/failure_diagnostic.rs | 40 +- apps/shield-gui/src-tauri/src/ios_runner.rs | 16 +- .../src-tauri/src/task_completion.rs | 4 + apps/shield-gui/src-tauri/src/task_manager.rs | 4 + apps/shield-gui/src-tauri/src/updates.rs | 8 +- apps/shield-gui/src/components/app/common.tsx | 2 +- .../src/hooks/use-protect-workflow.ts | 6 + apps/shield-gui/src/lib/protect-diagnostic.ts | 46 ++- apps/shield-gui/src/lib/tauri.ts | 7 + .../shield-gui/src/pages/aab-protect-page.tsx | 13 +- apps/shield-gui/src/pages/protect-page.tsx | 1 + .../tests/protect-diagnostic.test.mjs | 48 +++ crates/shield-core/src/protect/xop_pvm2.rs | 86 +++- crates/shield-core/src/protect_api.rs | 5 +- crates/shield-core/src/protection_report.rs | 369 ++++++++++++++++++ docs/process/support.md | 2 +- docs/usage.md | 2 + .../protector/packer/Pvm2ProtectionCheck.java | 47 ++- .../com/yqsh/protector/packer/Pvm2Report.java | 3 +- tools/xop-pvm2-packer.jar | Bin 8314502 -> 8314516 bytes 22 files changed, 699 insertions(+), 18 deletions(-) create mode 100644 apps/shield-gui/tests/protect-diagnostic.test.mjs diff --git a/apps/shield-cli/src/commands.rs b/apps/shield-cli/src/commands.rs index c1c0a00..c8d4017 100644 --- a/apps/shield-cli/src/commands.rs +++ b/apps/shield-cli/src/commands.rs @@ -448,7 +448,11 @@ pub fn run_protect_aab_with_control( progress(&step, &event.message); }, Arc::clone(&cancel), - )?; + ) + .map_err(|mut error| { + shield_core::protection_report::Pvm2Failure::preserve(&mut error, &args.output); + error + })?; } ProtectionEngineArg::Xop => { let packer = args diff --git a/apps/shield-gui/src-tauri/src/aab_runner.rs b/apps/shield-gui/src-tauri/src/aab_runner.rs index 6d5475e..5ba6d6c 100644 --- a/apps/shield-gui/src-tauri/src/aab_runner.rs +++ b/apps/shield-gui/src-tauri/src/aab_runner.rs @@ -172,7 +172,7 @@ pub(crate) async fn execute_protect_aab( if cancel.load(Ordering::Relaxed) { ExecutionFailure::cancelled() } else { - ExecutionFailure::from(format!("{error:#}")) + ExecutionFailure::from_source(format!("{error:#}"), error.as_ref()) } })?; task_manager diff --git a/apps/shield-gui/src-tauri/src/failure_diagnostic.rs b/apps/shield-gui/src-tauri/src/failure_diagnostic.rs index 49e2e09..0084290 100644 --- a/apps/shield-gui/src-tauri/src/failure_diagnostic.rs +++ b/apps/shield-gui/src-tauri/src/failure_diagnostic.rs @@ -1,6 +1,7 @@ //! 将任务失败映射为受控诊断;不负责发送或持久化原始错误。 use serde::{Deserialize, Serialize}; use shield_core::diagnostic::{Diagnostic, FailureCode, ToolName, CLASSIFIER_VERSION}; +use shield_core::protection_report::{Pvm2Failure, Pvm2FailureSummary}; #[derive(Clone, Debug)] pub(crate) struct ExecutionFailure { @@ -9,6 +10,7 @@ pub(crate) struct ExecutionFailure { pub(crate) cancelled: bool, /// 空字段等前置输入校验不属于已执行操作失败。 pub(crate) executed: bool, + pub(crate) pvm2_failure: Option, } impl ExecutionFailure { @@ -18,6 +20,7 @@ impl ExecutionFailure { diagnostic: Diagnostic::new(FailureCode::Unknown), cancelled: true, executed: false, + pvm2_failure: None, } } pub(crate) fn diagnosed(message: String, diagnostic: Diagnostic) -> Self { @@ -26,6 +29,7 @@ impl ExecutionFailure { diagnostic, cancelled: false, executed: true, + pvm2_failure: None, } } pub(crate) fn preflight(message: String, diagnostic: Diagnostic) -> Self { @@ -34,16 +38,23 @@ impl ExecutionFailure { diagnostic, cancelled: false, executed: false, + pvm2_failure: None, } } pub(crate) fn from_shield(error: shield_core::ShieldError) -> Self { + let pvm2_failure = match &error { + shield_core::ShieldError::Other(source) => source + .downcast_ref::() + .map(|f| f.summary.clone()), + _ => None, + }; let preflight = match &error { shield_core::ShieldError::Other(source) => { shield_core::diagnostic::is_preflight_error(source) } _ => false, }; - match Diagnostic::from_shield(&error) { + let mut failure = match Diagnostic::from_shield(&error) { Some(diagnostic) if preflight => Self::preflight(error.to_string(), diagnostic), Some(diagnostic) => Self::diagnosed(error.to_string(), diagnostic), None => Self { @@ -51,8 +62,34 @@ impl ExecutionFailure { diagnostic: Diagnostic::new(FailureCode::Unknown), cancelled: true, executed: false, + pvm2_failure: None, }, + }; + failure.pvm2_failure = pvm2_failure; + failure + } + + pub(crate) fn from_source(message: String, error: &(dyn std::error::Error + 'static)) -> Self { + let mut failure = Self::from(message); + let mut cause = Some(error); + while let Some(value) = cause { + if let Some(pvm2) = value.downcast_ref::() { + failure.pvm2_failure = Some(pvm2.summary.clone()); + break; + } + if let Some(shield_core::ShieldError::Other(source)) = + value.downcast_ref::() + { + failure.pvm2_failure = source + .downcast_ref::() + .map(|f| f.summary.clone()); + if failure.pvm2_failure.is_some() { + break; + } + } + cause = value.source(); } + failure } } impl From for ExecutionFailure { @@ -62,6 +99,7 @@ impl From for ExecutionFailure { diagnostic: Diagnostic::new(FailureCode::Unknown), cancelled: false, executed: true, + pvm2_failure: None, } } } diff --git a/apps/shield-gui/src-tauri/src/ios_runner.rs b/apps/shield-gui/src-tauri/src/ios_runner.rs index 1bb2198..3336b14 100644 --- a/apps/shield-gui/src-tauri/src/ios_runner.rs +++ b/apps/shield-gui/src-tauri/src/ios_runner.rs @@ -93,7 +93,13 @@ pub(crate) async fn protect_ios_project( Err(message) if message.contains("已取消") => TaskStatus::Cancelled, Err(_) => TaskStatus::Failed, }; - let _ = task_manager.finish(&window, &options.1, status, result.as_ref().err().cloned()); + let _ = task_manager.finish( + &window, + &options.1, + status, + result.as_ref().err().cloned(), + None, + ); result } @@ -146,7 +152,13 @@ pub(crate) async fn prepare_ios_sdk( Err(message) if message.contains("已取消") => TaskStatus::Cancelled, Err(_) => TaskStatus::Failed, }; - let _ = task_manager.finish(&window, &task_id, status, result.as_ref().err().cloned()); + let _ = task_manager.finish( + &window, + &task_id, + status, + result.as_ref().err().cloned(), + None, + ); result } diff --git a/apps/shield-gui/src-tauri/src/task_completion.rs b/apps/shield-gui/src-tauri/src/task_completion.rs index ba76316..b866f8b 100644 --- a/apps/shield-gui/src-tauri/src/task_completion.rs +++ b/apps/shield-gui/src-tauri/src/task_completion.rs @@ -28,6 +28,10 @@ pub(crate) fn finish_task( task_id, status, result.as_ref().err().map(|error| error.message.clone()), + result + .as_ref() + .err() + .and_then(|error| error.pvm2_failure.clone()), )? { window .state::() diff --git a/apps/shield-gui/src-tauri/src/task_manager.rs b/apps/shield-gui/src-tauri/src/task_manager.rs index a268bc7..4ade92a 100644 --- a/apps/shield-gui/src-tauri/src/task_manager.rs +++ b/apps/shield-gui/src-tauri/src/task_manager.rs @@ -44,6 +44,7 @@ pub(crate) struct TaskSnapshot { pub(crate) finished_at_ms: Option, pub(crate) logs: Vec, pub(crate) error: Option, + pub(crate) pvm2_failure: Option, #[serde(skip)] pub(crate) protect_succeeded: bool, #[serde(skip)] @@ -103,6 +104,7 @@ impl TaskManager { message: "任务已开始".to_string(), }], error: None, + pvm2_failure: None, protect_succeeded: false, signing_started: false, }; @@ -158,6 +160,7 @@ impl TaskManager { task_id: &str, status: TaskStatus, error: Option, + pvm2_failure: Option, ) -> Result { let mut tasks = self.0.lock().map_err(|_| "任务状态锁已损坏".to_string())?; let task = tasks @@ -169,6 +172,7 @@ impl TaskManager { } task.finished_at_ms = Some(now); task.error = error.clone(); + task.pvm2_failure = pvm2_failure; task.logs.push(TaskLog { timestamp_ms: now, step: task.current_step.clone(), diff --git a/apps/shield-gui/src-tauri/src/updates.rs b/apps/shield-gui/src-tauri/src/updates.rs index 361dd8e..b0d6767 100644 --- a/apps/shield-gui/src-tauri/src/updates.rs +++ b/apps/shield-gui/src-tauri/src/updates.rs @@ -357,7 +357,13 @@ pub(crate) async fn install_update( Ok(()) } Err(error) => { - let _ = tasks.finish(&window, &task_id, TaskStatus::Failed, Some(error.clone())); + let _ = tasks.finish( + &window, + &task_id, + TaskStatus::Failed, + Some(error.clone()), + None, + ); Err(error) } } diff --git a/apps/shield-gui/src/components/app/common.tsx b/apps/shield-gui/src/components/app/common.tsx index ec438c1..911f516 100644 --- a/apps/shield-gui/src/components/app/common.tsx +++ b/apps/shield-gui/src/components/app/common.tsx @@ -142,7 +142,7 @@ export function StatusMessage({ )} /> )} -
{children}
+
{children}
{action} diff --git a/apps/shield-gui/src/hooks/use-protect-workflow.ts b/apps/shield-gui/src/hooks/use-protect-workflow.ts index ef5eec2..634e9e7 100644 --- a/apps/shield-gui/src/hooks/use-protect-workflow.ts +++ b/apps/shield-gui/src/hooks/use-protect-workflow.ts @@ -54,6 +54,7 @@ export function useProtectWorkflow({ const [dragActive, setDragActive] = useState(false); const [warning, setWarning] = useState(""); const [error, setError] = useState(""); + const [pvm2Failure, setPvm2Failure] = useState(null); const [precheck, setPrecheck] = useState(""); const [preflight, setPreflight] = useState(null); const [runtimeUi, setRuntimeUi] = useState(defaults.runtime_ui ?? defaultRuntimeUi); @@ -119,6 +120,7 @@ export function useProtectWorkflow({ setFilenameEdited(false); setState("idle"); setError(""); + setPvm2Failure(null); setPrecheck(""); setPreflight(null); setWarning(""); @@ -157,6 +159,7 @@ export function useProtectWorkflow({ } setWarning(""); setError(""); + setPvm2Failure(null); setPrecheck(""); setPreflight(null); setCurrentStep(""); @@ -219,6 +222,7 @@ export function useProtectWorkflow({ onTauriEvent("task-state", (payload) => { if (payload.kind !== "protect" || payload.task_id !== taskId.current) return; setCurrentStep(payload.current_step); + setPvm2Failure(payload.pvm2_failure ?? null); setCurrentDetail(payload.logs.at(-1)?.message ?? ""); setStartedAt(payload.started_at_ms); setFinishedAt(payload.finished_at_ms ?? null); @@ -292,6 +296,7 @@ export function useProtectWorkflow({ started = true; setExcludedAbis(exclusions); setError(""); + setPvm2Failure(null); setCurrentStep("CheckTools"); setCurrentDetail(""); setStartedAt(Date.now()); @@ -365,6 +370,7 @@ export function useProtectWorkflow({ dragActive, warning, error, + pvm2Failure, precheck, preflight, runtimeMode, diff --git a/apps/shield-gui/src/lib/protect-diagnostic.ts b/apps/shield-gui/src/lib/protect-diagnostic.ts index 8353205..5d41681 100644 --- a/apps/shield-gui/src/lib/protect-diagnostic.ts +++ b/apps/shield-gui/src/lib/protect-diagnostic.ts @@ -1,4 +1,4 @@ -import type { ApkCheckResult } from "@/lib/tauri"; +import type { ApkCheckResult, Pvm2FailureSummary } from "@/lib/tauri"; import type { Locale } from "@/lib/i18n"; export function buildProtectDiagnostic({ @@ -11,6 +11,7 @@ export function buildProtectDiagnostic({ xopPvm2Configured, currentStep, failed, + pvm2Failure, }: { preflight: ApkCheckResult | null; locale: Locale; @@ -21,6 +22,7 @@ export function buildProtectDiagnostic({ xopPvm2Configured: boolean; currentStep: string; failed: boolean; + pvm2Failure?: Pvm2FailureSummary | null; }) { const checks = preflight?.checks .filter((check) => check.severity !== "ready") @@ -38,9 +40,47 @@ export function buildProtectDiagnostic({ `${english ? "Current stage" : "当前阶段"}: ${currentStep || (english ? "not started" : "未开始")}`, `${english ? "Preflight verdict" : "预检结论"}: ${verdictLabel(locale, preflight?.verdict)}`, checks ? `${english ? "Risk items" : "风险项"}:\n${checks}` : `${english ? "Risk items" : "风险项"}: ${english ? "none" : "无"}`, + ...(failed && pvm2Failure ? [buildPvm2FailureDiagnostic(pvm2Failure, locale)] : []), english - ? "Note: This summary excludes APK and output paths, certificates, passwords, package names, business class names, and raw error text. Also include diagnostic information from the About page. Manually redact any logs before sharing." - : "说明: 本摘要不包含 APK 路径、输出路径、证书、密码、包名、业务类名或原始错误文本。请同时附上“关于”页面的诊断信息;如需提供日志,请先手动脱敏。", + ? "Note: This summary excludes paths, certificates, passwords, package names, business class names, and raw error text. Include your app version; Settings → Feedback attaches environment diagnostics. Method reports contain business identifiers; redact before sharing." + : "说明: 本摘要不包含路径、证书、密码、包名、业务类名或原始错误文本。反馈时请补充软件版本;设置 → 问题反馈可附带环境诊断。逐方法报告含业务标识,分享前请手动脱敏。", + ].join("\n"); +} + +export function buildPvm2FailureDiagnostic(summary: Pvm2FailureSummary, locale: Locale) { + const english = locale === "en"; + const labels: Record = { + no_code: ["无 DEX 方法体(Native/抽象方法)", "No DEX body (native/abstract)"], + initializer: ["构造器/静态初始化器", "Initializer"], + ui_runtime_glue: ["界面/生命周期兼容规则", "UI/lifecycle compatibility"], + data_resource_runtime_glue: ["数据/资源框架兼容规则", "Data/resource compatibility"], + compiler_generated_bridge: ["编译器生成桥接类", "Compiler-generated bridge"], + playback_compatibility: ["媒体/辅助类兼容规则", "Media/helper compatibility"], + nullable_receiver: ["接收者非空语义无法证明", "Nullable receiver"], + unsupported_opcode: ["不支持的指令", "Unsupported opcode"], + register_limit: ["寄存器超限", "Register limit"], + code_size_limit: ["方法大小超限", "Code size limit"], + exception_mapping: ["异常处理映射不支持", "Exception mapping"], + control_flow: ["控制流不支持", "Control flow"], + type: ["类型不支持", "Unsupported type"], + not_attempted: ["未进入转换", "Not attempted"], + other: ["其他原因", "Other"], + }; + const code = `${english ? "Failure code" : "失败代码"}: PVM2_ZERO_METHODS`; + const counts = [summary.selected_classes, summary.selected_methods]; + const reasons = Object.keys(labels) as (keyof typeof labels)[]; + // 白名单重建分享文本;不能把运行日志、报告路径或未知原因字符串拼进摘要。 + const values = reasons.map((reason) => summary.reasons?.[reason] ?? 0); + if (![...counts, ...values].every((n) => Number.isSafeInteger(n) && n >= 0) + || summary.selected_classes > summary.selected_methods + || values.reduce((a, b) => a + b, 0) !== summary.selected_methods) { + return `${code}\n${english ? "Reason counts unavailable" : "原因统计无效,无法展示数量"}`; + } + return [code, + `${english ? "Classes in method inventory" : "方法清单涉及类数"}: ${summary.selected_classes}`, + `${english ? "Selected methods" : "所选方法数"}: ${summary.selected_methods}`, + `${english ? "Transformed methods" : "转换成功方法数"}: 0`, + ...reasons.flatMap((reason, i) => values[i] > 0 ? [`- ${reason} (${labels[reason][english ? 1 : 0]}): ${values[i]}`] : []), ].join("\n"); } diff --git a/apps/shield-gui/src/lib/tauri.ts b/apps/shield-gui/src/lib/tauri.ts index be116d3..86b46f7 100644 --- a/apps/shield-gui/src/lib/tauri.ts +++ b/apps/shield-gui/src/lib/tauri.ts @@ -337,6 +337,13 @@ export type TaskSnapshot = { finished_at_ms?: number | null; logs: TaskLog[]; error?: string | null; + pvm2_failure?: Pvm2FailureSummary | null; +}; + +export type Pvm2FailureSummary = { + selected_classes: number; + selected_methods: number; + reasons: Partial>; }; export type DragDropPayload = { diff --git a/apps/shield-gui/src/pages/aab-protect-page.tsx b/apps/shield-gui/src/pages/aab-protect-page.tsx index c034aad..76caac3 100644 --- a/apps/shield-gui/src/pages/aab-protect-page.tsx +++ b/apps/shield-gui/src/pages/aab-protect-page.tsx @@ -2,9 +2,11 @@ import { RuntimeUiSettings } from "@/components/app/runtime-ui-settings"; import { defaultRuntimeUi } from "@/lib/tauri"; import type React from "react"; import { useCallback, useEffect, useMemo, useRef, useState } from "react"; -import { FolderOpen, RotateCcw, Square } from "lucide-react"; +import { Clipboard, FolderOpen, RotateCcw, Square } from "lucide-react"; import { AppButton, DropZone, SelectedApkCard, SelectInput, StatusMessage, TextInput } from "@/components/app/common"; import { ProtectProgressPanel } from "@/components/app/protect-progress-panel"; +import { useClipboard } from "@/hooks/use-clipboard"; +import { buildPvm2FailureDiagnostic } from "@/lib/protect-diagnostic"; import { notifyError, notifySuccess } from "@/lib/notify"; import { dirname, @@ -55,6 +57,8 @@ export function AabProtectPage({ const [inspection, setInspection] = useState(null); const [state, setState] = useState("idle"); const [error, setError] = useState(""); + const [pvm2Failure, setPvm2Failure] = useState(null); + const { copy } = useClipboard(locale); const [warning, setWarning] = useState(""); const [dragActive, setDragActive] = useState(false); const [selectedCertificateId, setSelectedCertificateId] = useState(""); @@ -107,6 +111,7 @@ export function AabProtectPage({ setState("prechecking"); setInspection(null); setError(""); + setPvm2Failure(null); try { const result = await api.checkAab(path); if (sequence !== checkSequence.current) return; @@ -139,6 +144,7 @@ export function AabProtectPage({ setInspection(null); setWarning(""); setError(""); + setPvm2Failure(null); setPrefixesText(""); setPvm2RequiredMethods(""); setCurrentStep(""); @@ -171,6 +177,7 @@ export function AabProtectPage({ const unlisten = onTauriEvent("task-state", (task) => { if (task.kind !== "protect" || task.task_id !== taskId.current) return; setCurrentStep(task.current_step); + setPvm2Failure(task.pvm2_failure ?? null); setCurrentDetail(task.logs.at(-1)?.message ?? ""); setStartedAt(task.started_at_ms); setFinishedAt(task.finished_at_ms ?? null); @@ -194,6 +201,7 @@ export function AabProtectPage({ taskId.current = crypto.randomUUID(); setState("running"); setError(""); + setPvm2Failure(null); setCurrentStep("CheckTools"); setCurrentDetail(""); setStartedAt(Date.now()); @@ -236,6 +244,7 @@ export function AabProtectPage({ setInspection(null); setState("idle"); setError(""); + setPvm2Failure(null); setWarning(""); setPrefixesText(""); setPvm2RequiredMethods(""); @@ -301,7 +310,7 @@ export function AabProtectPage({ )} {state === "done" && void api.showInFolder(output)}>{t(locale, "showInFolder")}}>{t(locale, "aabProtectCompleted")}} - {error && {t(locale, "errorDetail")}:{error}} + {error && void copy(buildPvm2FailureDiagnostic(pvm2Failure, locale))}>{t(locale, "copyDiagnosticSummary")}}>{t(locale, "errorDetail")}:{error}} {state === "running" || state === "done" ? ( diff --git a/apps/shield-gui/src/pages/protect-page.tsx b/apps/shield-gui/src/pages/protect-page.tsx index c32cbef..d911e45 100644 --- a/apps/shield-gui/src/pages/protect-page.tsx +++ b/apps/shield-gui/src/pages/protect-page.tsx @@ -148,6 +148,7 @@ export function ProtectPage({ xopPvm2Configured: pvmReady, currentStep: workflow.currentStep, failed: workflow.state === "failed", + pvm2Failure: workflow.pvm2Failure, })); const diagnosticCopyLabel = copiedLabel === t(locale, "copied") ? copiedLabel : t(locale, "copyDiagnosticSummary"); const minSdk = workflow.preflight?.facts.min_sdk; diff --git a/apps/shield-gui/tests/protect-diagnostic.test.mjs b/apps/shield-gui/tests/protect-diagnostic.test.mjs new file mode 100644 index 0000000..22d3838 --- /dev/null +++ b/apps/shield-gui/tests/protect-diagnostic.test.mjs @@ -0,0 +1,48 @@ +import assert from "node:assert/strict"; +import { after, test } from "node:test"; +import { createServer } from "vite"; + +const server = await createServer({ server: { middlewareMode: true }, appType: "custom", optimizeDeps: { noDiscovery: true, include: [] } }); +after(() => server.close()); +const { buildProtectDiagnostic, buildPvm2FailureDiagnostic } = await server.ssrLoadModule("/src/lib/protect-diagnostic.ts"); +const failure = { + selected_classes: 2, + selected_methods: 4, + reasons: { no_code: 1, initializer: 1, ui_runtime_glue: 1, register_limit: 1 }, +}; + +test("失败摘要显示实际跳过统计且不复制业务标识或未知字段", () => { + const summary = buildProtectDiagnostic({ + preflight: null, locale: "zh", runtimeMode: "standard", environmentPolicy: "strict", + protectionProfile: "strict", aiResistance: "high", xopPvm2Configured: true, + currentStep: "ProcessDex", failed: true, + pvm2Failure: { ...failure, path: "/Users/private/report.json", descriptor: "Lprivate/Business;", + reasons: { ...failure.reasons, "private password=secret": 1 } }, + }); + assert.match(summary, /PVM2_ZERO_METHODS/); + assert.match(summary, /所选方法数: 4/); + assert.match(summary, /转换成功方法数: 0/); + assert.match(summary, /ui_runtime_glue .*: 1/); + assert.match(summary, /register_limit .*: 1/); + assert.doesNotMatch(summary, /private|Business|password|secret|report\.json/); + assert.doesNotMatch(summary, /关于.*诊断/); +}); + +test("AAB 与 APK 复用相同脱敏格式,异常计数不进入分享内容", () => { + const english = buildPvm2FailureDiagnostic(failure, "en"); + assert.match(english, /Selected methods: 4/); + assert.match(english, /Transformed methods: 0/); + for (const count of [-1, NaN, Infinity, "private", Number.MAX_SAFE_INTEGER + 1]) { + const text = buildPvm2FailureDiagnostic({ ...failure, selected_methods: count }, "zh"); + assert.match(text, /原因统计无效/); + assert.doesNotMatch(text, /private|NaN|Infinity/); + } + assert.match(buildPvm2FailureDiagnostic({ ...failure, selected_methods: 5 }, "zh"), /原因统计无效/); +}); + +test("普通预检不混入上一任务的失败统计", () => { + const text = buildProtectDiagnostic({ preflight: null, locale: "zh", runtimeMode: "standard", + environmentPolicy: "compatible", protectionProfile: "balanced", aiResistance: "balanced", + xopPvm2Configured: false, currentStep: "", failed: false, pvm2Failure: failure }); + assert.doesNotMatch(text, /PVM2_ZERO_METHODS/); +}); diff --git a/crates/shield-core/src/protect/xop_pvm2.rs b/crates/shield-core/src/protect/xop_pvm2.rs index d7f6efb..10d091d 100644 --- a/crates/shield-core/src/protect/xop_pvm2.rs +++ b/crates/shield-core/src/protect/xop_pvm2.rs @@ -586,6 +586,13 @@ pub(crate) fn transform( }, )?; if !output.status.success() { + if output.stdout.contains("selected zero methods") + || output.stderr.contains("selected zero methods") + { + if let Ok(failure) = crate::protection_report::Pvm2Failure::zero_methods(&report_path) { + return Err(failure.into()); + } + } anyhow::bail!(transform_failure_message(&output.stdout, &output.stderr)); } let code = fs::read(&code_out).context("Xop 未生成 PVM2 code.bin")?; @@ -919,7 +926,7 @@ fn optional_usize(values: &BTreeMap, key: &str) -> Result fn transform_failure_message(stdout: &str, stderr: &str) -> String { if stdout.contains("selected zero methods") || stderr.contains("selected zero methods") { - return "Xop PVM2 已匹配到业务类,但没有可转换的方法。构造器和静态初始化器不会转换;含当前不支持的 invoke-custom/polymorphic 指令、超过寄存器/代码大小上限或异常处理表无法映射的方法会被跳过。请改选包含普通自有业务逻辑的类前缀,或查看 PVM2 覆盖率报告" + return "PVM2_ZERO_METHODS:没有可转换的方法,且未取得有效的逐方法失败报告,无法确定具体跳过原因。请确认使用配套的内置打包器;当前信息不能认定是类前缀或指令问题" .to_string(); } @@ -1102,11 +1109,86 @@ mod tests { "java.lang.IllegalStateException: pvm2-transform selected zero methods; provide a matching --true-vmp-prefix\n\tat com.example.Packer.main(Packer.java:1)", ); assert!(message.contains("没有可转换的方法")); - assert!(message.contains("覆盖率报告")); + assert!(message.contains("未取得有效的逐方法失败报告")); assert!(!message.contains("java.lang")); assert!(!message.contains("Packer.java")); } + #[test] + #[ignore = "需要 JDK 17 与从当前源码构建的 tools/xop-pvm2-packer.jar"] + fn 真实打包器零转换经共享核心返回分类并保留失败报告() { + use crate::protection_report::{Pvm2Failure, Pvm2SkipReason}; + let root = Path::new(env!("CARGO_MANIFEST_DIR")).join("../.."); + let jar = root + .join("tools/xop-pvm2-packer.jar") + .canonicalize() + .unwrap(); + let work = tempfile::tempdir().unwrap(); + let classes = work.path().join("classes"); + fs::create_dir(&classes).unwrap(); + assert!(Command::new("javac") + .args(["--release", "17", "-cp"]) + .arg(&jar) + .arg("-d") + .arg(&classes) + .arg(root.join("tests/java/com/yqsh/protector/packer/Pvm2ProtectionCheck.java")) + .output() + .unwrap() + .status + .success()); + let classpath = std::env::join_paths([classes, jar.clone()]).unwrap(); + let generated = Command::new("java") + .args(["-ea", "-cp"]) + .arg(classpath) + .arg("com.yqsh.protector.packer.Pvm2ProtectionCheck") + .arg(work.path()) + .output() + .unwrap(); + assert!( + generated.status.success(), + "{}", + String::from_utf8_lossy(&generated.stderr) + ); + for (kind, expected, count) in [ + ("native", Pvm2SkipReason::NoCode, 2), + ("ui", Pvm2SkipReason::UiRuntimeGlue, 3), + ("registers", Pvm2SkipReason::RegisterLimit, 3), + ] { + let dex = work.path().join(format!("zero-{kind}/dex")); + fs::write( + dex.join("AndroidManifest.xml"), + "", + ) + .unwrap(); + let error = transform( + Path::new("java"), + &jar, + &dex, + &[1; 32], + &"a".repeat(64), + ProtectionProfile::Strict, + &["Lfixture/".into()], + &Default::default(), + &BTreeMap::from([("classes.dex".into(), "base".into())]), + "fixture.Bridge", + "interpret", + &AtomicBool::new(false), + &|_| {}, + ) + .unwrap_err(); + let failure = error + .downcast_ref::() + .expect("失败统计不能被字符串化丢失"); + assert_eq!(failure.summary.selected_methods, count); + assert_eq!(failure.summary.reasons[&expected], 1); + let mut error = crate::ShieldError::from(error); + Pvm2Failure::preserve(&mut error, &work.path().join(format!("{kind}.apk"))); + assert!(error.to_string().contains("本地逐方法失败报告")); + assert!(!error.to_string().contains("Lfixture/")); + assert!(!work.path().join(format!("{kind}.apk")).exists()); + } + } + #[test] fn parses_coverage_and_morph_report() { let report = parse_transform_report( diff --git a/crates/shield-core/src/protect_api.rs b/crates/shield-core/src/protect_api.rs index 904ce63..547a014 100644 --- a/crates/shield-core/src/protect_api.rs +++ b/crates/shield-core/src/protect_api.rs @@ -161,7 +161,10 @@ pub fn protect_apk( .map_err(ShieldError::from)?; let mut working = opts.clone(); working.output = staged.path().to_owned(); - let report = protect_apk_inner(&working, on_progress, cancel)?; + let report = protect_apk_inner(&working, on_progress, cancel).map_err(|mut error| { + crate::protection_report::Pvm2Failure::preserve(&mut error, &opts.output); + error + })?; let has_report = report.is_some(); if let Some(report) = report { report diff --git a/crates/shield-core/src/protection_report.rs b/crates/shield-core/src/protection_report.rs index dac232f..f27fbc5 100644 --- a/crates/shield-core/src/protection_report.rs +++ b/crates/shield-core/src/protection_report.rs @@ -49,6 +49,256 @@ pub(crate) struct MethodReport { pub native_vmp: Vec, } +/// 仅允许固定分类和数量进入可分享摘要,原始原因只保存在本地逐方法报告。 +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum Pvm2SkipReason { + NoCode, + Initializer, + UiRuntimeGlue, + DataResourceRuntimeGlue, + CompilerGeneratedBridge, + PlaybackCompatibility, + NullableReceiver, + UnsupportedOpcode, + RegisterLimit, + CodeSizeLimit, + ExceptionMapping, + ControlFlow, + Type, + NotAttempted, + Other, +} + +impl Pvm2SkipReason { + fn classify(reason: &str) -> Self { + match reason { + "no_code" => Self::NoCode, + "initializer" => Self::Initializer, + "ui_runtime_glue" => Self::UiRuntimeGlue, + "data_resource_runtime_glue" => Self::DataResourceRuntimeGlue, + "compiler_generated_bridge" => Self::CompilerGeneratedBridge, + "playback_compatibility" => Self::PlaybackCompatibility, + "not_attempted" => Self::NotAttempted, + "too large" => Self::CodeSizeLimit, + r if r.contains("unsupported opcode 0x") => Self::UnsupportedOpcode, + r if r.contains("too many regs") => Self::RegisterLimit, + r if r.contains("nullable receiver") || r.contains("receiver register") => { + Self::NullableReceiver + } + r if r.contains("branch") => Self::ControlFlow, + r if r.contains("try ") || r.contains("tries") || r.contains("handler") => { + Self::ExceptionMapping + } + r if r.contains("unsupported return") || r.contains("argument type") => Self::Type, + _ => Self::Other, + } + } + + fn label(self) -> &'static str { + match self { + Self::NoCode => "无 DEX 方法体(Native/抽象方法)", + Self::Initializer => "构造器/静态初始化器", + Self::UiRuntimeGlue => "界面/生命周期兼容规则", + Self::DataResourceRuntimeGlue => "数据/资源框架兼容规则", + Self::CompilerGeneratedBridge => "编译器生成桥接类", + Self::PlaybackCompatibility => "媒体/辅助类兼容规则", + Self::NullableReceiver => "接收者非空语义无法证明", + Self::UnsupportedOpcode => "不支持的指令", + Self::RegisterLimit => "寄存器超限", + Self::CodeSizeLimit => "方法大小超限", + Self::ExceptionMapping => "异常处理映射不支持", + Self::ControlFlow => "控制流不支持", + Self::Type => "类型不支持", + Self::NotAttempted => "未进入转换", + Self::Other => "其他原因(详见本地报告)", + } + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct Pvm2FailureSummary { + /// 逐方法清单涉及的类,不计没有任何方法的空类。 + pub selected_classes: usize, + pub selected_methods: usize, + pub reasons: BTreeMap, +} + +#[derive(Debug)] +pub struct Pvm2Failure { + pub summary: Pvm2FailureSummary, + report: MethodReport, + report_path: Option, + report_save_failed: bool, +} + +impl Pvm2Failure { + pub(crate) fn zero_methods(path: &Path) -> Result { + ensure!( + fs::metadata(path)?.len() <= 64 * 1024 * 1024, + "方法失败报告超过 64 MiB 限制" + ); + let report = MethodReport::read(path)?; + ensure!( + report.schema_version == 2 + && report.code_version == 4 + && matches!(report.image_version, 7 | 8), + "方法失败报告协议无效" + ); + let mut classes = BTreeSet::new(); + let mut methods = BTreeSet::new(); + let mut reasons = BTreeMap::new(); + for row in &report.methods { + ensure!( + valid_signature(&row.descriptor) && methods.insert((&row.module, &row.descriptor)), + "方法失败报告包含无效或重复方法" + ); + ensure!( + row.transform_status == "skipped" + && !row.artifact_verified + && row.final_method_index.is_none() + && row.final_dex_index.is_none(), + "零转换失败报告包含成功转换记录" + ); + ensure!( + report + .dexes + .get(&row.input_dex) + .is_some_and(|dex| dex.module == row.module), + "方法失败报告模块映射不一致" + ); + let reason = row + .reason + .as_deref() + .filter(|r| !r.is_empty()) + .context("方法失败报告缺少跳过原因")?; + classes.insert((&row.module, row.descriptor.split_once("->").unwrap().0)); + *reasons.entry(Pvm2SkipReason::classify(reason)).or_insert(0) += 1; + } + let summary = Pvm2FailureSummary { + selected_classes: classes.len(), + selected_methods: methods.len(), + reasons, + }; + Ok(Self { + summary, + report, + report_path: None, + report_save_failed: false, + }) + } + + /// APK/AAB 外层知道最终输出目录;在临时工作目录销毁前分别保留失败报告。 + pub fn preserve(error: &mut crate::ShieldError, artifact: &Path) { + let crate::ShieldError::Other(source) = error else { + return; + }; + let Some(failure) = source.downcast_mut::() else { + return; + }; + failure.report_path = None; + match failure.save_report(artifact) { + Ok(path) => { + failure.report_path = Some(path); + failure.report_save_failed = false; + } + Err(_) => failure.report_save_failed = true, + } + } + + fn save_report(&mut self, artifact: &Path) -> Result { + let parent = artifact + .parent() + .filter(|p| !p.as_os_str().is_empty()) + .unwrap_or(Path::new(".")); + self.report.build.insert("status".into(), "failed".into()); + self.report + .build + .insert("failure_code".into(), "PVM2_ZERO_METHODS".into()); + self.report.build.insert( + "failure_summary".into(), + serde_json::to_value(&self.summary)?, + ); + // 每次失败独立留存,不覆盖之前的成功报告或失败证据;临时文件默认仅本机用户可读。 + let mut file = tempfile::Builder::new() + .prefix("pvm2-failure-") + .suffix(".json") + .tempfile_in(parent)?; + serde_json::to_writer_pretty(&mut file, &self.report)?; + let (_, path) = file.keep()?; + Ok(path) + } +} + +impl std::fmt::Display for Pvm2Failure { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "PVM2_ZERO_METHODS:没有可转换的方法。逐方法清单涉及 {} 个类、{} 个方法,成功转换 0。", + self.summary.selected_classes, self.summary.selected_methods + )?; + for (reason, count) in &self.summary.reasons { + write!(f, "\n{}:{}", reason.label(), count)?; + } + if self.summary.selected_methods == 0 { + write!( + f, + "\n所选范围没有方法记录,请核对 APK 中的实际类名及选择范围。" + )?; + } else if self + .summary + .reasons + .keys() + .all(|r| matches!(r, Pvm2SkipReason::NoCode | Pvm2SkipReason::Initializer)) + { + write!(f, "\n所选范围只有无 DEX 方法体或初始化方法,请选择含普通 DEX 方法体的业务范围;SO 内部函数需另走 Native 保护链路。")?; + } else { + if self.summary.reasons.keys().any(|r| { + matches!( + r, + Pvm2SkipReason::UiRuntimeGlue + | Pvm2SkipReason::DataResourceRuntimeGlue + | Pvm2SkipReason::CompilerGeneratedBridge + | Pvm2SkipReason::PlaybackCompatibility + ) + }) { + write!(f, "\n部分方法被兼容规则排除,请根据本地报告确认要保护的业务范围;不应强行绕过兼容检查。")?; + } + if self.summary.reasons.keys().any(|r| { + matches!( + r, + Pvm2SkipReason::NullableReceiver + | Pvm2SkipReason::UnsupportedOpcode + | Pvm2SkipReason::RegisterLimit + | Pvm2SkipReason::CodeSizeLimit + | Pvm2SkipReason::ExceptionMapping + | Pvm2SkipReason::ControlFlow + | Pvm2SkipReason::Type + | Pvm2SkipReason::NotAttempted + | Pvm2SkipReason::Other + ) + }) { + write!(f, "\n存在转换能力或语义检查限制,请携带原因统计反馈,不能仅靠修改类前缀认定已解决。")?; + } + } + if let Some(path) = &self.report_path { + write!( + f, + "\n本地逐方法失败报告(含业务标识,请勿直接公开):{}", + path.display() + )?; + } else if self.report_save_failed { + write!( + f, + "\n逐方法报告保存失败,请检查输出目录权限或磁盘空间;上述原因统计仍可复制。" + )?; + } + Ok(()) + } +} + +impl std::error::Error for Pvm2Failure {} + pub(crate) fn sha256(data: &[u8]) -> String { format!("{:x}", Sha256::digest(data)) } @@ -447,6 +697,125 @@ mod tests { })).unwrap() } + #[test] + fn 零转换报告分类脱敏并在临时目录销毁后保留到实际输出目录() { + let temporary = tempfile::tempdir().unwrap(); + let output = tempfile::tempdir().unwrap(); + let path = temporary.path().join("methods.json"); + let mut detail = report(); + detail.dexes.insert( + "classes.dex".into(), + DexRecord { + module: "base".into(), + input_sha256: "input".into(), + output_sha256: "output".into(), + }, + ); + let cases = [ + ("no_code", Pvm2SkipReason::NoCode), + ("initializer", Pvm2SkipReason::Initializer), + ("ui_runtime_glue", Pvm2SkipReason::UiRuntimeGlue), + ( + "data_resource_runtime_glue", + Pvm2SkipReason::DataResourceRuntimeGlue, + ), + ( + "compiler_generated_bridge", + Pvm2SkipReason::CompilerGeneratedBridge, + ), + ( + "playback_compatibility", + Pvm2SkipReason::PlaybackCompatibility, + ), + ( + "nullable receiver at register 3", + Pvm2SkipReason::NullableReceiver, + ), + ("unsupported opcode 0xfc", Pvm2SkipReason::UnsupportedOpcode), + ("too many regs", Pvm2SkipReason::RegisterLimit), + ("too large", Pvm2SkipReason::CodeSizeLimit), + ("handler cannot map", Pvm2SkipReason::ExceptionMapping), + ("bad branch target", Pvm2SkipReason::ControlFlow), + ("unsupported return Lprivate/Secret;", Pvm2SkipReason::Type), + ("not_attempted", Pvm2SkipReason::NotAttempted), + ( + "private-customer /Users/private/project password=secret", + Pvm2SkipReason::Other, + ), + ]; + for (i, (reason, _)) in cases.iter().enumerate() { + detail.methods.push(serde_json::from_value(serde_json::json!({ + "module": "base", "descriptor": format!("Lprivate/Secret;->method{i}()V"), "required": false, + "input_instruction_bytes": 0, "input_dex": "classes.dex", "transform_status": "skipped", + "reason": reason, "artifact_verified": false, "plaintext_policy": null + })).unwrap()); + } + detail.write(&path).unwrap(); + let failure = Pvm2Failure::zero_methods(&path).unwrap(); + assert_eq!(failure.summary.selected_classes, 1); + assert_eq!(failure.summary.selected_methods, cases.len()); + for (_, reason) in cases { + assert_eq!(failure.summary.reasons[&reason], 1); + } + let safe = serde_json::to_string(&failure.summary).unwrap(); + for secret in ["private", "Secret", "method0", "password", "/Users/"] { + assert!(!safe.contains(secret)); + } + assert!(!failure.to_string().contains("private")); + let mut error = crate::ShieldError::from(anyhow::Error::new(failure)); + Pvm2Failure::preserve(&mut error, &temporary.path().join("intermediate.apk")); + // AAB 复用 APK 核心时,必须重新保存到最终输出目录,不能留下将被删除的临时路径。 + Pvm2Failure::preserve(&mut error, &output.path().join("final.aab")); + drop(temporary); + let crate::ShieldError::Other(source) = &error else { + panic!() + }; + let failure = source.downcast_ref::().unwrap(); + let saved = failure.report_path.clone().unwrap(); + assert!(saved.is_file() && saved.starts_with(output.path())); + let stored: serde_json::Value = serde_json::from_slice(&fs::read(&saved).unwrap()).unwrap(); + assert_eq!(stored["build"]["status"], "failed"); + assert_eq!(stored["build"]["failure_code"], "PVM2_ZERO_METHODS"); + assert_eq!(stored["methods"].as_array().unwrap().len(), cases.len()); + assert!(!output.path().join("final.aab").exists()); + assert!(!report_path(&output.path().join("final.aab")).exists()); + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + assert_eq!( + fs::metadata(&saved).unwrap().permissions().mode() & 0o777, + 0o600 + ); + } + Pvm2Failure::preserve(&mut error, &output.path().join("final.aab")); + assert!(saved.is_file()); + Pvm2Failure::preserve(&mut error, &output.path().join("missing/final.aab")); + assert!(error.to_string().contains("报告保存失败")); + assert!(error.to_string().contains("成功转换 0")); + } + + #[test] + fn 零转换诊断拒绝缺失损坏或夹带成功记录的报告() { + let dir = tempfile::tempdir().unwrap(); + let path = dir.path().join("methods.json"); + assert!(Pvm2Failure::zero_methods(&path).is_err()); + fs::write(&path, b"broken").unwrap(); + assert!(Pvm2Failure::zero_methods(&path).is_err()); + let mut detail = report(); + detail.write(&path).unwrap(); + assert!(Pvm2Failure::zero_methods(&path) + .unwrap() + .to_string() + .contains("没有方法记录")); + detail.methods.push(serde_json::from_value(serde_json::json!({ + "module": "base", "descriptor": "La/A;->value()I", "required": false, "input_instruction_bytes": 6, + "input_dex": "classes.dex", "transform_status": "transformed", "reason": null, + "artifact_verified": true, "plaintext_policy": "bounded_cache", "final_dex_index": 0, "final_method_index": 0 + })).unwrap()); + detail.write(&path).unwrap(); + assert!(Pvm2Failure::zero_methods(&path).is_err()); + } + #[test] fn 清单严格区分模块重载并拒绝无效描述符() { let dir = tempfile::tempdir().unwrap(); diff --git a/docs/process/support.md b/docs/process/support.md index de66618..d5381aa 100644 --- a/docs/process/support.md +++ b/docs/process/support.md @@ -29,7 +29,7 @@ 反馈与手动提交的 issue 一样会在 GitHub 上创建**公开** issue,反馈正文(Bug 反馈还包括自动附带的诊断信息)任何访客都能看到,请只填写可以公开的内容。服务端不可用时,软件会提供在浏览器打开预填 issue 页面的入口,反馈正文与诊断信息会预填到表单中,仍需在 GitHub 上确认后提交。 -加固页出现预检风险或任务失败时,可点击“复制诊断摘要”。该摘要只包含预检结论、风险代码、运行策略和失败阶段;不复制原始错误文本,避免路径、包名或业务类名随反馈扩散。需要补充错误或日志时,应先由用户手动脱敏。 +加固页出现预检风险或任务失败时,可点击“复制诊断摘要”。该摘要包含预检结论、风险代码、运行策略和失败阶段;PVM2 零方法转换失败还包含方法数量与固定分类的跳过统计,不复制原始错误文本、路径、包名或业务类名。AAB 的零转换错误也提供该复制入口。输出目录的 `pvm2-failure-*.json` 为本地逐方法失败报告,含业务标识,不能直接公开。需要补充该报告、错误或日志时,应先由用户手动脱敏。 诊断信息包含: diff --git a/docs/usage.md b/docs/usage.md index 8322ca9..0c0aadb 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -231,6 +231,8 @@ v8 新增经认证的声明参数类型表,修复把 `Object` 传入的 `Integ GUI 的系统推荐默认值是“标准运行时 + 兼容环境保护 + balanced 代码保护 + balanced AI”,无需配置 PVM2 即可直接加固。高级设置会持久化;若上次保存了尚未配置完整的 strict 设置,主卡片会显示“使用推荐默认值(可直接加固)”,点击后恢复可用的推荐方案。该操作是显式切换,不会把 strict 静默降级。 +如果匹配到类但 PVM2 转换成功数为 0,任务仍会失败,并显示 `PVM2_ZERO_METHODS`、逐方法清单涉及的类数、方法数及实际跳过原因统计。无 DEX 方法体、初始化器、兼容排除、指令/寄存器等限制分别计数,未知原因不会猜测成指令问题。APK/AAB 输出目录会保留独立的 `pvm2-failure-*.json`,明确标记 `failed`,不覆盖成功产物或成功报告。该本地报告包含业务方法标识;“复制诊断摘要”只复制固定原因分类和数量。报告缺失、损坏或保存失败时会明确说明,不把零转换当作成功,也不自动关闭保护。 + “第几代”没有统一行业标准。当前能力应按实际范围描述:基础 DEX 加密封装、成功转换方法的 PVM2、构建级多态、资源/asset 与业务 ELF 静态保护,以及可选的源码级标量语义 Native VMP。不能把这些组件的存在等同于整个 APK 达到“3.5 代”。[代码保护升级方案](design/android-code-protection-upgrade.md)把“3.5 代”作为待验收的内部目标,要求关键方法清单、最终产物核验与运行时/性能证据;关键方法清单、产物核验、运行时清理和 Native 构建证据接入已实现,完整设备语义与性能矩阵仍待完成。Native VMP 的通用 C/C++ 语义、Play 内测也未完成,不能把本地结构验证算成真实设备或 Play 证据。 AAB 预检不会把 APK 解包器误用于 AAB: diff --git a/tests/java/com/yqsh/protector/packer/Pvm2ProtectionCheck.java b/tests/java/com/yqsh/protector/packer/Pvm2ProtectionCheck.java index cb686de..d4a2dec 100644 --- a/tests/java/com/yqsh/protector/packer/Pvm2ProtectionCheck.java +++ b/tests/java/com/yqsh/protector/packer/Pvm2ProtectionCheck.java @@ -99,6 +99,7 @@ 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]); + checkZeroMethodReports(root); Path dex = Files.createDirectory(root.resolve("dex")); fixture(dex.resolve("classes.dex")); fixture(dex.resolve("classes3.dex")); @@ -187,13 +188,57 @@ public static void main(String[] args) throws Exception { } private static void run(Path dex, Path config, Path code, Path report, boolean prefixes) throws Exception { + run(dex, config, code, report, prefixes ? "Lfixture/" : null); + } + + private static void run(Path dex, Path config, Path code, Path report, String prefix) throws Exception { List args = new ArrayList<>(List.of("pvm2-transform", "--dex-dir", dex.toString(), "--code-out", code.toString(), "--insn-key-hex", KEY, "--package-name", "fixture.unrelated", "--vm-bridge", BRIDGE, "--report-config", config.toString(), "--report-out", report.toString(), "--no-payment-auto-vmp", "--no-industry-auto-vmp")); - if (prefixes) args.addAll(List.of("--true-vmp-prefix", "Lfixture/")); + if (prefix != null) args.addAll(List.of("--true-vmp-prefix", prefix)); Method method = PackerMain.class.getDeclaredMethod("runPvm2TransformCli", String[].class); method.setAccessible(true); method.invoke(null, (Object) args.toArray(String[]::new)); } + private static void checkZeroMethodReports(Path root) throws Exception { + // 三种真实零转换原因:无 DEX 方法体、类级兼容排除、编译器寄存器上限。 + for (String kind : List.of("native", "ui", "registers")) { + Path work = Files.createDirectory(root.resolve("zero-" + kind)); + Path dex = Files.createDirectory(work.resolve("dex")); + String owner = kind.equals("ui") ? "Lfixture/MainActivity;" : "Lfixture/Rules;"; + List methods = new ArrayList<>(); + 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", 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()); + pool.internClass(new ImmutableClassDef(owner, 1, "Ljava/lang/Object;", List.of(), null, Set.of(), List.of(), methods)); + FileDataStore store = new FileDataStore(dex.resolve("classes.dex").toFile()); + try { pool.writeTo(store); } finally { store.close(); } + 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("required", new JSONArray()).toString()); + try { + run(dex, config, work.resolve("code.bin"), report, "Lfixture/"); + throw new AssertionError("零方法转换被误判为成功"); + } catch (InvocationTargetException expected) { + assert expected.getCause().getMessage().contains("selected zero methods"); + } + JSONObject result = new JSONObject(Files.readString(report)); + Map reasons = new TreeMap<>(); + for (Object value : result.getJSONArray("methods")) { + JSONObject row = (JSONObject) value; + assert row.getString("transform_status").equals("skipped") && !row.getBoolean("artifact_verified"); + reasons.merge(row.getString("reason"), 1, Integer::sum); + } + assert reasons.get("no_code") == 1 && reasons.get("initializer") == 1 : reasons; + if (kind.equals("ui")) assert reasons.get("ui_runtime_glue") == 1 : reasons; + if (kind.equals("registers")) assert reasons.get("too many regs") == 1 : reasons; + System.out.println("零方法失败报告通过:" + kind + " " + reasons); + } + } + private static void fixture(Path path) throws Exception { List methods = new ArrayList<>(); for (boolean parameter : List.of(false, true)) { diff --git a/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/Pvm2Report.java b/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/Pvm2Report.java index f6d7e9a..b92f7b6 100644 --- a/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/Pvm2Report.java +++ b/third_party/xopprotector/packer/src/main/java/com/yqsh/protector/packer/Pvm2Report.java @@ -68,7 +68,8 @@ void inventory(List files, Predicate selectedType) throws Exceptio if (impl != null) for (var instruction : impl.getInstructions()) size += instruction.getCodeUnits() * 2; String reason = impl == null ? "no_code" : method.getName().startsWith("<") ? "initializer" : "not_attempted"; String exclusion = AutoVmpPolicy.exclusionReason(cls.getType()); - if (!required.contains(id) && exclusion != null) reason = exclusion; + // 没有方法体和初始化器先按实际结构计数,避免被类级兼容规则掩盖。 + if (reason.equals("not_attempted") && !required.contains(id) && exclusion != null) reason = exclusion; JSONObject row = new JSONObject().put("module", module).put("descriptor", signature) .put("required", required.contains(id)).put("input_instruction_bytes", size) .put("input_dex", file.getName()).put("transform_status", "skipped") diff --git a/tools/xop-pvm2-packer.jar b/tools/xop-pvm2-packer.jar index 3d5340bb4df6443122f196cbbea33f7acf395759..e7343238558d92775d6ec7ccfff2c91119b58735 100644 GIT binary patch delta 112123 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

bi0E+aHfd3 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 delta 111105 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 From 3e7bb0253f47792a9414470576b4ab96932a1410 Mon Sep 17 00:00:00 2001 From: haonan Date: Fri, 16 Oct 2026 11:28:53 +0800 Subject: [PATCH 2/2] =?UTF-8?q?chore:=20=E5=87=86=E5=A4=87=201.8.1=20?= =?UTF-8?q?=E8=AF=8A=E6=96=AD=E4=BF=AE=E5=A4=8D=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/release-notes/versions/1.8.1.md | 11 +++++++++++ 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 +- shield-stub/compat/api19-rust/Cargo.lock | 2 +- shield-stub/compat/api19-rust/Cargo.toml | 2 +- shield-stub/src/main/rust/Cargo.toml | 2 +- 12 files changed, 26 insertions(+), 15 deletions(-) create mode 100644 .github/release-notes/versions/1.8.1.md diff --git a/.github/release-notes/versions/1.8.1.md b/.github/release-notes/versions/1.8.1.md new file mode 100644 index 0000000..a95e8f8 --- /dev/null +++ b/.github/release-notes/versions/1.8.1.md @@ -0,0 +1,11 @@ +### PVM2 零转换失败诊断修复 + +- 修复“已匹配到业务类,但没有可转换的方法”时,实际跳过原因和覆盖率报告随临时目录丢失的问题。现在会显示匹配类数、方法数及分类原因,并在输出目录保留独立的失败报告。 +- APK、AAB 与命令行共用报告保留逻辑;桌面端复制诊断摘要只包含固定原因分类和数量,不包含路径、证书、密码、包名或业务方法名。 +- 修正构造器、静态初始化器及无代码方法被类级排除原因覆盖的问题;报告无法读取或保存时明确提示,避免继续指向不存在的报告。 +- 增加 Native 方法、界面类排除和寄存器超限等零转换场景的真实打包器回归,并验证 APK/AAB 失败报告保留与摘要脱敏。 + +### 使用说明 + +- 本版修复失败原因丢失和诊断不准确,不改变 PVM2 方法转换的支持范围。仍无可转换方法时会阻断交付,不会静默关闭保护。 +- 遇到同类报错,请升级后重新执行,并优先提供复制的诊断摘要。输出目录中的完整失败报告可能包含业务类和方法信息,分享前请手动脱敏。 diff --git a/Cargo.lock b/Cargo.lock index 53d706b..22188ea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2201,7 +2201,7 @@ dependencies = [ [[package]] name = "mocika-shield" -version = "1.8.0" +version = "1.8.1" dependencies = [ "dunce", "reqwest 0.12.28", @@ -2229,7 +2229,7 @@ dependencies = [ [[package]] name = "mocikashield" -version = "1.8.0" +version = "1.8.1" dependencies = [ "cc", "chacha20poly1305", @@ -3635,7 +3635,7 @@ dependencies = [ [[package]] name = "shield-cli" -version = "1.8.0" +version = "1.8.1" dependencies = [ "anyhow", "clap", @@ -3653,7 +3653,7 @@ dependencies = [ [[package]] name = "shield-core" -version = "1.8.0" +version = "1.8.1" dependencies = [ "anyhow", "chacha20poly1305", diff --git a/apps/shield-cli/Cargo.toml b/apps/shield-cli/Cargo.toml index ada8488..641c7c4 100644 --- a/apps/shield-cli/Cargo.toml +++ b/apps/shield-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shield-cli" -version = "1.8.0" +version = "1.8.1" 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 5eaae2e..a1ed75b 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.0", + "version": "1.8.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mocika-shield-gui", - "version": "1.8.0", + "version": "1.8.1", "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 126622a..e67bfa7 100644 --- a/apps/shield-gui/package.json +++ b/apps/shield-gui/package.json @@ -1,6 +1,6 @@ { "name": "mocika-shield-gui", - "version": "1.8.0", + "version": "1.8.1", "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 9ee0b2f..da1cb16 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.0" +version = "1.8.1" 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 aad930d..1ba2166 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.0", + "version": "1.8.1", "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 9aef590..92a2ed7 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.0", + version: "1.8.1", git_hash: "dev", build_date: "unknown", }; diff --git a/crates/shield-core/Cargo.toml b/crates/shield-core/Cargo.toml index 116ad21..2deea88 100644 --- a/crates/shield-core/Cargo.toml +++ b/crates/shield-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shield-core" -version = "1.8.0" +version = "1.8.1" edition = "2021" authors = ["MocikaDev"] license = "MIT OR Apache-2.0" diff --git a/shield-stub/compat/api19-rust/Cargo.lock b/shield-stub/compat/api19-rust/Cargo.lock index af2eafa..4dcd226 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.0" +version = "1.8.1" dependencies = [ "cc", "chacha20poly1305", diff --git a/shield-stub/compat/api19-rust/Cargo.toml b/shield-stub/compat/api19-rust/Cargo.toml index c48b675..7f09ba4 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.0" +version = "1.8.1" 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 2e70c08..63de6a8 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.0" +version = "1.8.1" edition = "2021" license = "MIT OR Apache-2.0"