搜索正则表达式:
regex
(invoke-*.* \{([pv]\d+),([pv]\d+)\}, Landroid/content/pm/PackageManager;->getInstallerPackageName\(Ljava/lang/String;\)Ljava/lang/String;)\s*(move-result-object ([pv]\d+))
解释:
invoke-*.* \{([pv]\d+),([pv]\d+)\} - 匹配方法调用,捕获两个寄存器
Landroid/content/pm/PackageManager;->getInstallerPackageName() - 匹配获取安装包来源的方法
move-result-object ([pv]\d+) - 捕获存储结果的寄存器
替换操作:
regex
$1
const-string $2, "com.android.vending"
技术原理
原方法功能:
getInstallerPackageName() 方法用于获取应用的安装来源:
返回 "com.android.vending" = 从Google Play商店安装
返回 "com.amazon.venezia" = 从Amazon商店安装
返回 null = 从其他来源安装(侧载、第三方商店等)
补丁作用:
强制让该方法始终返回 "com.android.vending",应用认为它是从Google Play商店正式安装的。
实际代码示例
原代码:
smali
invoke-virtual {v0, v1}, Landroid/content/pm/PackageManager;->getInstallerPackageName(Ljava/lang/String;)Ljava/lang/String;
move-result-object v2 # 这里可能返回null或其他值
应用补丁后:
smali
invoke-virtual {v0, v1}, Landroid/content/pm/PackageManager;->getInstallerPackageName(Ljava/lang/String;)Ljava/lang/String;
const-string v2, "com.android.vending" # 强制返回Google Play商店