java - 从 APK 反编译 Java - while 循环不执行任何操作

标签 java reverse-engineering apk decompiling smali

我反编译了一个 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_9sswitch_d 可能指示与 sswitch 指令本身的相对偏移量。

关于java - 从 APK 反编译 Java - while 循环不执行任何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12146157/

相关文章:

java - Maven 程序集——如何创建包含版本的项目 JAR,但不包含 Artifact tar.gz 文件?

android - 如何从 APK 文件中查看 AndroidManifest.xml?

java - 使用 UTF-8 查询在 hibernate 中不起作用

java - TDD:为什么让应用程序代码知道它正在测试而不是运行可能是错误的?

go - 使用Delve调试Go二进制文件期间如何更改寄存器值?

android - 逆向工程 Proguarded-apk

c++ - 宽字符串 Visual Studio 2005 与 2017?

android - 即使使用未翻译的字符串,如何在 Android Studio 上签署 APK?

android - no concrypt_openjdk_jni in java.library.path 错误如何解决?

java - 创建一个随机生成的三角形并将其绘制到 Jpanel