2

我反编译了一个 apk,看到许多 while 循环立即返回,后面跟着其他代码:

while (true){
   return;
   if (!cond1){
     continue;
   }
   if (cond2){
     continue;
   }
}

如果您想在反编译中生成此代码,您会编写什么 Java 代码来实现这一目标?

笔记。反编译过程是apktool -> baksmali -> smali -> dex2jar

编辑

我实际上无法从 Android APK 获取原始 Java 字节码(至少我不知道如何)。可能是我的工具在逆向工程方面做得很差,但以下是 smali 的输出:

:goto_8
return-void

.line 40
:sswitch_9
const/4 v0, 0x0

iput v0, p0, Lcom/sec/android/app/camera/command/ContextualTagSelectCommand;->mContextualTag:I

goto :goto_8

.line 44
:sswitch_d
const/4 v0, 0x1

iput v0, p0, Lcom/sec/android/app/camera/command/ContextualTagSelectCommand;->mContextualTag:I

goto :goto_8

对应于:

while (true)
{
  return;
  this.mContextualTag = 0;
  continue;
  this.mContextualTag = 1;
}
4

1 回答 1

2

您的字节码是已编译 switch 语句的片段。具体来说,它是使用稀疏开关Dalvik 字节码指令实现的。您只显示了两个 switch 案例,它们都分配给mContextualTag然后执行return语句。它return被放置在程序中的一个点上,switch case 跳转到它。标签sswitch_9sswitch_d可能指示sswitch指令本身的相对偏移量。

于 2012-08-27T18:09:08.547 回答