Skip to content

fix: 修复 PVM2 const-wide/32 负立即数符号扩展 - #79

Merged
kairowan merged 1 commit into
mainfrom
fix/pvm2-const-wide-sign-extension
Nov 4, 2026
Merged

kairowan merged 1 commit into
mainfrom
fix/pvm2-const-wide-sign-extension

Conversation

@kairowan

@kairowan kairowan commented Nov 4, 2026

Copy link
Copy Markdown
Owner

根因

PVM2 Packer 在编译 Dalvik const-wide/32(opcode 0x17)时,把 32 位立即数当成无符号数扩展:

long imm = (units[pc + 1] & 0xffffL) | ((units[pc + 2] & 0xffffL) << 16);

-2147483648(Integer.MIN_VALUE)被写成 +2147483648。
这类常量用于 Pvm2 的 Integer/Long 边界判断时,会把合法的 1 判成越界并返回 null。

真实表现:服务端返回 {"code":1},但 PVM2 转换后的 Integer 归一化方法返回 null,App 业务层只能看到 code=null。

修复

  • Pvm2Compiler.java 的 0x17 改为按有符号 int 读取,再扩展到 long
  • 重新构建 tools/xop-pvm2-packer.jar
  • 新增回归:const-wide/32 -2147483648 经 PVM2 编译后必须返回 -2147483648
  • 在宿主 PVM2 运行时测试中执行该镜像并断言返回值

验证

  • make test-pvm2
  • PVM2_SANITIZER='' make test-pvm2-runtime
  • 定向宿主探针:
    • D(Integer 1) 修复前 null,修复后 1
    • D(Long 1)、D(Double 1)、D(Float 1) 同样恢复
    • D(String "1") 仍为 1

影响

这是加固工具自身的 PVM2 编译器修复。已加固的 APK/AAB 需要用修复后的 Shellsmith 重新加固才会生效;服务端和 App 业务代码无需修改。

@kairowan
kairowan merged commit 7ef0e92 into main Nov 4, 2026
13 checks passed
@kairowan
kairowan deleted the fix/pvm2-const-wide-sign-extension branch November 4, 2026 12:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant