【问题标题】:Smali - injecting a simple method returns an ExceptionSmali - 注入一个简单的方法返回一个异常
【发布时间】: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 -> 异常!

【问题讨论】:

    标签: java android


    【解决方案1】:

    解决了..

    问题很清楚,我发布这个答案是为了帮助很多陷入困境的开发人员:

    问题出在 Line 上。 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{
    }
    

    我犯的错误是我在 Smali 中注入了 onDestroy() 方法,它的 super.onDestroy() 不知道目标 MainActivity.smali 是 Activity 还是 AppCompatActivity
    事实上,目标 MainActivity 是基于 Activity 构建的,而源 MainActivity 是在 AppCompatActivity 中创建的,因此复制的 Smali 代码不会像在源活动中那样在目标 MainActivity.smali 上工作。

    解决方案:

    将 Line.5 更改为:

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

    收件人:

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



    如何知道目标Activity是扩展Activity还是AppCompatActivity? :

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

    1. .class public Lcom/mobi/MinActivity;
    2. .super Landroid/app/Activity;
    3. .source "MainActivity.java"
    

    .super 之后的第二行显示活动的继承。

    我希望这可以帮助很多人,如果你还没有犯这个错误,现在你知道如何不犯了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      • 2017-02-12
      • 2012-06-20
      • 1970-01-01
      • 2018-04-22
      相关资源
      最近更新 更多