有人可以对我的android apk文件进行反编译,并查看我的包中声明的公共变量或常量吗?
我已经定义为公共静态常量的共享密钥将被暴露...
答案 0 :(得分:10)
是的,可以反编译apk。
根据混淆程度,它可能需要一些时间,但专门/弯曲的人最终会反编译它。
您可以尝试
等工具来源:http://geeknizer.com/decompile-reverse-engineer-android-apk/
更新1
以下是另外两个选项:
建议@ AndrewRukin
更新2
另一个工具:jadx
答案 1 :(得分:9)
当您对代码进行反混淆处理时(这是一个可能提供洞察力的视频教程:How to read obfuscated code),您将能够看到所有硬编码值,例如
private String key = "Au8aujEWS(jol#9jSd9";
除非他们不会看到变量名称:
private String a = "Au8aujEWS(jol#9jSd9";
通过使用Sunny mentioned之类的工具,您将能够使所有代码接近原始状态。
我举个例子;如果您有以下原始代码:
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 { ... }
通过使用有根据的猜测和重构工具,您将能够对代码进行反混淆处理,因此,只要有足够的奉献精神和辛勤工作,人们就能看到您的所有代码。
我强烈建议不要完全取决于编码到客户端应用程序中的内容。当然,这取决于你的情况对于让黑客无法访问你想要保护的信息的重要性。
答案 2 :(得分:0)
是的,Android APK很容易被反编译。即使代码被混淆,也可以在反编译时看到公共变量,常量及其值。
当您对代码进行模糊处理时,会重命名您的变量名称。变量的值保持不变。混淆与加密不同。因此,当您对代码进行模糊处理时,代码不会被加密。
普通代码的示例:
String str = "This is a string.";
混淆代码的示例:
String a = "This is a string.";
如上所示,变量名称已从“str”重命名为“a”,但其值保持不变。混淆的工作原理是将变量名重命名为简短的非逻辑名,使文件大小变小,使代码更难理解。
我所做的是模糊我的整个代码然后加密我的密钥并在我的程序中的某个地方解密。虽然我知道一个坚定而耐心的黑客仍然可以破解我的钥匙,但这会让他更难受。
答案 3 :(得分:0)
是的,这是可能的,但事情并非如此简单 - 有人必须有充分的理由去做。
根据您需要多少安全性,您可以在运行时构建密钥,而不是将其保存到最终字符串中,从Internet下载(但这种方式必须更加安全,可能不值得)或者让其他一些外部服务器代替您的应用来完成工作 - 特别是如果您正在讨论付款和存储公钥 - 在这种情况下,密钥甚至不会嵌入到您的应用中。
此外,请记住使用ProGuard提到的混淆工具,让黑客的生活更加艰难:http://developer.android.com/tools/help/proguard.html。