gpt4 book ai didi

android - 关于使用 apktool 从 apk 反转的特殊 smali 类的两个问题

转载 作者:行者123 更新时间:2023-12-05 00:19:11 24 4
gpt4 key购买 nike

我在 smali github 上问过这个问题,但这可能是一个更好的地方再问一次。
我观察到两个我想问的奇怪的代码反编译案例。该代码是在 Windows 10 上使用 apktool 2.4.1 对 apk 进行反编译的,这两个问题都与确定这在 smali 语言中是否合法以及如何以逻辑和编程方式(使用解析器)进行处理有关。

  • 第一个问题是在一个 smali 类中有多个相同的字段定义。我有以下情况:
  • .class public final Likev2/network/sdk/network/tools/VpnBuilderHelper;
    .super Ljava/lang/Object;


    # annotations
    .annotation system Ldalvik/annotation/MemberClasses;
    value = {
    Likev2/network/sdk/network/tools/VpnBuilderHelper$a;
    }
    .end annotation


    # instance fields
    .field public a:Landroid/net/VpnService$Builder;

    .field public final a:Landroid/net/VpnService;

    .field public a:Likev2/network/sdk/network/tools/VpnBuilderHelper$a;

    .field public b:Likev2/network/sdk/network/tools/VpnBuilderHelper$a;


    # direct methods
    .method public constructor <init>(Landroid/net/VpnService;)V
    .locals 0

    if-eqz p1, :cond_0

    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
    ...
    如果您观察前三个实例字段,所有三个都具有相同的名称“a”。它们也有不同的类型。最初,我在想这可能是从父类(super class)中隐藏成员的情况,但是这个父类(super class)的父类(super class)是普通的对象。
    这将如何解释?
  • 第二个问题是将字符“-”作为方法名称中的第一个字符。有问题的代码是这个:
  • ...
    # virtual methods
    .method public final -deprecated_javaName()Ljava/lang/String;
    .locals 1

    .line 1
    iget-object v0, p0, Lb0/m0;->javaName:Ljava/lang/String;

    return-object v0
    .end method
    ...
    这里有问题的方法名称是'-deprecated_javaName'。考虑到“-”字符,这是一个合法名称吗?我在谷歌上搜索,发现只有一个地方提到了这个名字,这是在下面的代码中: https://jar-download.com/artifacts/com.squareup.okhttp3/okhttp/4.2.2/source-code/okhttp3/CipherSuite.kt
    如果您看一下,似乎这已被弃用并重命名为 Kotlin 函数:
    ...
    @JvmName("-deprecated_javaName")
    @Deprecated(
    message = "moved to val",
    replaceWith = ReplaceWith(expression = "javaName"),
    level = DeprecationLevel.ERROR)
    fun javaName(): String = javaName
    ...
    我正在使用自定义 antlr 脚本解析 smali,该脚本将函数名称设置为始终以字母开头并且在此字符上失败。
    如果有人能阐明这两个 smali 特性发生了什么以及如何正确处理它们的解析,我将不胜感激。

    最佳答案

  • dex 文件有一个包含 dex 文件中引用的每个字段的表,然后对任何给定字段的任何引用都通过该表的索引。 field_id_item结构是该表中包含单个字段引用的条目。如您所见,所有 field_id_items包括被引用字段的名称和类型。因此,在同一个类中拥有多个具有相同名称但类型不同的字段是完美的。由于字段引用始终包括名称和类型,因此对于引用哪个字段没有歧义。
  • dex 格式中成员名称的允许语法定义为 here .这个定义比 java 允许的更广泛,所以完全有可能有一个有效的 dex 成员名称,它在 java 中是一个无效的名称。 -deprecated_javaName是一个完美的 dex 成员名称 :)
  • 关于android - 关于使用 apktool 从 apk 反转的特殊 smali 类的两个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63728360/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com