可能重复:
Android:从 APK 文件中获取源代码
有人可以反编译我的 android apk 文件并查看我的包中声明的公共变量或常量吗?
我定义为公共静态常量的共享密钥将被暴露...
是的,可以反编译 apk 。
根据混淆级别,它可能需要一些时间,但一个专门/弯曲的人最终会反编译它。
您可以尝试以下工具
来源: http: //geeknizer.com/decompile-reverse-engineer-android-apk/
更新 1
这里还有 2 个选项供您选择:
更新 2
另一个工具:jadx
当您对代码进行反混淆时(这里有一个视频教程可能会提供见解:如何阅读混淆代码),您将能够看到所有硬编码的值,例如
private String key = "Au8aujEWS(jol#9jSd9";
除了他们不会看到变量名:
private String a = "Au8aujEWS(jol#9jSd9";
通过使用Sunny 提到的工具,您将能够使所有代码接近其原始状态。
我举个例子;如果您有以下原始代码:
public class MainActivity extends Activity {
private String key = "Au8aujEWS(jol#9jSd9";
public void onCreate(Bundle savedInstance) {
//Some code here
}
}
public class OtherActivity extends Activity { ... }
编译并反编译回java代码后,它看起来像这样:
public class A extends B {
private String a = "Au8aujEWS(jol#9jSd9";
public void a (C b) {
//Some code here
}
}
public class D extends B { ... }
通过使用有根据的猜测和重构工具,您将能够对代码进行去混淆处理,因此只要有足够的奉献精神和努力工作,人们将能够看到您的所有代码。
我强烈建议不要让您的安全性完全取决于编码到客户端应用程序中的内容。当然,这取决于不让黑客有可能访问您试图保护的信息对您的情况有多重要。
是的,Android APK 可以很容易地被反编译。即使代码被混淆,反编译时也可以看到公共变量、常量及其值。
当您混淆代码时,您的变量名称会被重命名。您的变量值保持不变。混淆与加密不同。因此,当您混淆您的代码时,您的代码不会被加密。
一个普通代码的例子:
String str = "This is a string.";
混淆代码的示例:
String a = "This is a string.";
如上所示,变量名从“str”重命名为“a”,但其值保持不变。混淆通过将变量名称重命名为短的非逻辑名称来使文件更小并使代码更难理解。
我所做的是混淆我的整个代码,然后加密我的密钥并在我的程序中的某个地方解密它。虽然我知道一个坚定而有耐心的黑客仍然可以破解我的密钥,但这会让他更难。
是的,这是可能的,但并不是那么简单——必须有人真的有充分的理由去做。
根据您需要多少安全性,您可以在运行时构造您的密钥而不是将其保存到最终字符串中,从 Internet 下载它(但这种方式必须更好地保护,可能不值得)或让一些其他外部服务器代替您的应用程序完成工作 - 特别是如果您正在谈论付款和存储您的公钥 - 在这种情况下,密钥甚至不会嵌入到您的应用程序中。
另外,请记住使用提到的混淆工具(如 ProGuard)让黑客的生活更加艰难:http: //developer.android.com/tools/help/proguard.html。