反编译一个android apk? [复制]
Posted
技术标签:
【中文标题】反编译一个android apk? [复制]【英文标题】:Decompling an android apk? [duplicate] 【发布时间】:2012-08-28 21:00:54 【问题描述】:可能重复:android: Getting source code from an APK file
是否有人可以反编译我的 android apk 文件并查看我的包中声明的公共变量或常量?
我定义为公共静态常量的共享密钥将被暴露...
【问题讨论】:
是的,总是可以看到硬编码的值。如果您正在考虑范围界定,那么我不确定我是否理解您的问题。 我说的是字面上看到硬编码的常量键...... 如果您说的是其他人试图对您的代码进行反混淆,那么是的,使用正确的工具,他们将能够看到所有硬编码的值,例如private String key = Au8aujEWS(jol#9jSd9;
。
是的-看here-简单的一键在线工具:)
【参考方案1】:
是的,可以反编译 apk 。
根据混淆级别,它可能需要一些时间,但一个专门/弯曲的人最终会反编译它。
你可以试试
之类的工具apktool
Smali
Show Java Android App
来源:http://geeknizer.com/decompile-reverse-engineer-android-apk/
更新 1
这里还有 2 个选项供您选择:
decompileandroid.com
javadecompilers.com/apk
由@AndrewRukin推荐
更新 2
另一个工具:jadx
【讨论】:
我还可以补充一点,现在可以在线反编译Android应用程序,不需要任何软件!这里有 2 个选项供您选择: - decompileandroid.com - javadecompilers.com/apk【参考方案2】:当您对代码进行去混淆处理时(这里有一个视频教程可能会提供见解: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 ...
通过使用有根据的猜测和重构工具,您将能够对代码进行去混淆处理,因此只要有足够的奉献精神和努力工作,人们就能看到您的所有代码。
我强烈建议不要让您的安全性完全取决于编码到客户端应用程序中的内容。当然,这取决于不让黑客有机会访问您要保护的信息对您的情况有多重要。
【讨论】:
【参考方案3】:是的,这是可能的,但它不是那么简单 - 某人确实必须有充分的理由这样做。
根据您需要多少安全性,您可以在运行时构造您的密钥,而不是将其保存到最终字符串中,从 Internet 下载它(但这种方式必须更好地保护,可能不值得)或者让其他外部服务器代替您的应用来完成工作 - 特别是在您谈论支付和存储公钥时 - 在这种情况下,密钥甚至不会嵌入到您的应用中。
另外,请记住使用提到的混淆工具(如 ProGuard:http://developer.android.com/tools/help/proguard.html)让黑客的生活更加艰难。
【讨论】:
【参考方案4】:是的,Android APK 可以很容易地被反编译。即使代码被混淆,反编译时也可以看到公共变量、常量及其值。
当您混淆代码时,您的变量名会被重命名。您的变量的值保持不变。混淆与加密不同。因此,当您混淆您的代码时,您的代码不会被加密。
普通代码示例:
String str = "This is a string.";
混淆代码示例:
String a = "This is a string.";
正如您在上面看到的,变量名称从“str”重命名为“a”,但它的值保持不变。混淆通过将变量名称重命名为短的非逻辑名称来使文件更小并使代码更难理解。
我所做的是混淆我的整个代码,然后加密我的密钥并在我的程序中的某个地方解密它。虽然我知道一个坚定而耐心的黑客仍然可以破解我的密钥,但这会让他更难。
【讨论】:
以上是关于反编译一个android apk? [复制]的主要内容,如果未能解决你的问题,请参考以下文章