我反编译了一个 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;
}
最佳答案
您的字节码是已编译的 switch 语句的片段。具体来说,它是使用稀疏开关Dalvik字节码指令实现的。您仅显示了两个 switch 案例,其中都分配给 mContextualTag
,然后执行 return
语句。这个return
被放置在程序中的一个点上,并且switch case跳转到它。标签 sswitch_9
和 sswitch_d
可能指示与 sswitch
指令本身的相对偏移量。
关于java - 从 APK 反编译 Java - while 循环不执行任何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12146157/