Java Android Apk反编译似乎很容易

Java Android Apk反编译似乎很容易,java,android,obfuscation,apk,decompiler,Java,Android,Obfuscation,Apk,Decompiler,我只是在胡闹。我下载了dex2jar和Java反编译器JD-GUI 我得到了我自己的apk文件(签名、密封并在googleplay上),使用dex2jar将其放入jar存储库 命令行(Windows用户使用.bat,everyone-Others.sh): 我将输出拖放到JD-GUI中,所有类文件、原始代码都重新出现。 我有点吃惊。我的java/Android代码是否暴露了这一点?如果apk可以如此轻松地反编译和重新生成,ProGuard如何保护我的apk?它看起来一点也不模糊 提前感谢。模糊处

我只是在胡闹。我下载了dex2jar和Java反编译器JD-GUI

我得到了我自己的apk文件(签名、密封并在googleplay上),使用dex2jar将其放入jar存储库

命令行(Windows用户使用.bat,everyone-Others.sh):

我将输出拖放到JD-GUI中,所有类文件、原始代码都重新出现。 我有点吃惊。我的java/Android代码是否暴露了这一点?如果apk可以如此轻松地反编译和重新生成,ProGuard如何保护我的apk?它看起来一点也不模糊


提前感谢。

模糊处理程序通常只是简单地将类、方法和字段名称更改为没有意义的名称。所以,如果你有“ScoreCalculator.computeScore(Player p,Match m)”,你最终会得到“A.zk(F,R)”。这类似于Uglify或闭包编译器对javascript所做的工作,只是在javascript中它是为了减少源代码长度

无论如何,理解这种方法的作用是可能的,只是更难

同样,Java使用后期绑定(如DLL或其他文件)。因此,代码之外的调用(如java.util、java.lang等包)不能混淆。此外,如果您的代码需要接收来自外部的调用(一个典型的示例,在按钮上注册一个侦听器),那么该代码不能被混淆。对于DLL也会发生同样的情况,在DLL中,您可以清楚地看到需要从DLL外部调用的方法的名称以及对其他DLL的调用

但是,特定源代码和编译代码之间的映射不一定是一对一的。旧的C编译器用于为给定的源指令生成相同的操作代码,因此反编译器非常有效。然后,C编译器向生成的操作代码中添加了许多优化,这些优化使反编译器大部分无效

Java从来没有在编译时实现过(很多)优化,因为为了在不同的平台上运行(包括不同的android设备),Java决定在以后的运行时,根据运行设备的架构和硬件属性应用严重的优化(这就是“热点”的主要内容)

好的混淆器通常也会对字节码指令重新排序,或者插入一些无用的指令,或者预先应用一些优化,使反编译器无法(或不太可能)如此轻松地派生源代码

对于能够阅读字节码的人来说,这种技术是无用的,因为如果一个人能够阅读汇编代码,任何可能的C混淆都是无用的

正如许多破解软件所证明的那样,反向工程始终是可能的,即使使用C或其他语言,甚至在固件上(想想iPhone固件),因为您运行代码的客户端总是不可信的,并且总是可能被篡改


如果您有非常关键的代码,一些其他人可能会窃取的非常值钱的东西,我建议您在服务器端运行它,或者以某种方式在服务器端验证它

我还可以补充一点,除了这个APKTool->dex2jar->JD-GUI路线,还有一个现代的替代方案

只需尝试名为Jadx的开源APK和DEX反编译器:
这里也有在线版本:

LOL!您没有将proguard应用于您的apk吗?如果答案是否定的,那就是你的答案!:)您还需要配置ProGuard,您可能想看看NDK,我使用了ProGuard并在rel之前编辑了project.properties文件;放松我的应用程序。我应该提到,类名不是我的原始名称,但所有方法名似乎都是原始名称。也就是说,撤销我的应用很容易,因为只有类名改变了。编辑:静态方法名称似乎也已更改。但逆转这一点很难算是火箭科学。你能发布你的proguard.cfg吗?你们有并没有检查过听起来好像你们并没有正确设置proguard——对于更多的混淆,请检查一下
d2j-dex2jar.bat -f MyAwesomeApp.apk