Smali-注入简单方法会返回异常

时间:2019-07-11 12:59:08

标签: java android

我反编译了一个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中进行注入,我再次对其进行了重新编译并得到了异常。

我编译了简单的onDestroy代码,并从以下位置获得了Smali:

@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:当我重新编译APK而没有注入onDestroy代码时-> Works
PS2:重新编译所创建的简单应用程序时,该应用程序具有相同的onDestroy()Smali代码-> Works
PS3:当我通过注入简单的onDestroy()Smali代码->异常重新编译目标APK时!

1 个答案:

答案 0 :(得分:0)

解决了..

问题非常明显,我发布了此答案,因此可以帮助很多滞留在其中的开发人员:

该问题已解决。 5

1. .method protected onDestroy()V
2.    .locals 0
3.
4.    .line 49
5.    invoke-super {p0}, Landroid/support/v7/app/AppCompatActivity;->onDestroy()V
6.
7.    .line 51
8.    return-void
.end method

Landroid/support/v7/app/AppCompatActivity的位置是对AppCompatActivity进行如下扩展的活动:

public class MainActivity extends AppCompatActivity {
}

Landroid/app/Activity用于扩展Activity的活动,如下所示:

public class MainActivity extends Activity{
}

我犯的错误是,我在onDestroy()中注入了super.onDestroy()的方法Activity,但不知道目标MainActivity.smali是AppCompatActivity还是Activity
实际上,目标MainActivity是建立在AppCompatActivity上的,而源MainActivity是在invoke-super {p0}, Landroid/support/v7/app/AppCompatActivity;->onDestroy()V 上进行的,因此复制的Smali代码将无法像源活动中那样在Target MainActivity.smali上运行。 br />

解决方案:

将Line.5更改为:

invoke-super {p0}, Landroid/app/Activity;->onDestroy()V

收件人:

Activity



如何知道目标活动是否扩展了AppCompatActivity1. .class public Lcom/mobi/MinActivity; 2. .super Landroid/app/Activity; 3. .source "MainActivity.java" ? :

只需检查Activity的Smali文件的第二行,类似于:

.super

{{1}}之后的第二行显示了活动的继承。

我希望这对很多人有帮助,如果您仍然没有陷入这个错误,那么现在您知道该怎么做。