【发布时间】:2019-07-11 21:44:33
【问题描述】:
我反编译了一个 APK,并在一个没有此方法的 Activity 中添加了一个 @Override onDestroy() 方法,所有这些都以 Smali 格式发生,而不是显然在 Java 中发生。然而我得到一个例外说java.lang.VerifyError: Verifier rejected class com.mobi.MainActivity due to bad method void com.mobi.MainActivity.onDestroy()
我尝试在 Android Studio 中创建一个具有简单 onDestroy() 方法的简单项目,将其编译为 APK,然后反编译 APK 以获取 Smali 文件,我去了 MainActivity.smali 并复制了 onDestroy() 代码并将其粘贴到目标MainActivity.smali中进行注入,我再次重新编译它并得到了异常。
我编译并获得 Smali 的简单 onDestroy 代码:
@Override
protected void onDestroy() {
super.onDestroy();
}
我从这个方法中得到的 Smali 代码:
.method protected onDestroy()V
.locals 0
.line 49
invoke-super {p0}, Landroid/support/v7/app/AppCompatActivity;->onDestroy()V
.line 51
return-void
.end method
将这段代码粘贴到目标 Smali 文件后:
.method public onCreate(Landroid/os/Bundle;)V
.... some code ...
.end method
.method protected onDestroy()V
.locals 0
.line 49
invoke-super {p0}, Landroid/support/v7/app/AppCompatActivity;->onDestroy()V
.line 51
return-void
.end method
预计无需任何更改即可顺利运行(因为显然 onDestroy() 方法目前没有任何指令)
但我得到了这个例外:
java.lang.VerifyError: Verifier rejected class com.mobi.MainActivity due to bad method void com.mobi.MainActivity.onDestroy()
PS:当我在没有注入 onDestroy 代码的情况下重新编译 APK -> Works
PS2:当我重新编译我创建的具有相同 onDestroy() Smali 代码的简单应用程序时 -> Works
PS3:当我使用注入的简单 onDestroy() Smali 代码重新编译目标 APK -> 异常!
【问题讨论】: