关于java:Android Apk反编译似乎很容易

Android Apk decompilation seems to easy

我只是搞乱了。 我下载了dex2jar http://code.google.com/p/dex2jar/和Java Decompiler JD-GUI http://java.decompiler.free.fr/?q=jdgui

我有自己的apk文件(已签名,密封并在Google Play上),使用dex2jar将其放入jar存储库。

命令行(Windows用户使用.bat,其他人.sh):

1
d2j-dex2jar.bat -f MyAwesomeApp.apk

我将输出拖放到JD-GUI中,并且所有类文件都重新出现了原始代码。
我吃了一惊。 我的java / Android代码暴露了吗? ProGuard如何保护我的apk,如果它可以轻松反编译和重新生成? 它似乎根本没有混淆......

提前致谢。


混淆器通常只是将类,方法和字段名称更改为没有意义的名称。所以,如果你有"ScoreCalculator.computeScore(Player p,Match m)",你最终会得到"A.zk(F f,R r)"。这类似于Uglify或Closure编译器为javascript所做的,除了在javascript中它是为了减少源长度。

无论如何,有可能理解这种方法的作用,它只会更难。

Aslo,Java使用后期绑定(作为DLL或SO文件)。因此,不能对代码外部的调用(如java.util,java.lang等..包)进行模糊处理。此外,如果您的代码需要从外部接收调用(典型示例,在按钮上注册侦听器),则无法对该代码进行模糊处理。同样适用于DLL,您可以清楚地看到需要在DLL外部调用的方法的名称以及对其他DLL的调用。

但是,某个源代码与编译代码之间的映射不一定是一对一的。较旧的C编译器用于为给定的源指令生成相同的操作码,因此反编译器非常有效。然后C编译器为生成的操作码添加了许多优化,而这些优化使反编译器大多无效[1]

Java从未在编译时实现(很多)优化,因为要在不同的平台上运行(包括不同的Android设备),Java决定在运行时根据运行设备的体系结构和硬件属性应用严格的优化(这就是"HotSpot"主要是关于[2])。

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

当涉及到可以读取字节码的人时,这种技术是无用的,因为如果一个人可以读取汇编代码,任何可能的C混淆都是无用的。

正如许多破解软件所证明的那样,逆向工程总是可行的,即使使用C或其他语言,甚至是固件(想想iPhone固件),导致运行代码的客户端总是不受信任,并且总是被篡改。

如果你有非常关键任务代码,其他人可能偷了很多钱,我建议在服务器端运行,或以某种方式验证服务器端。


我还可以补充说,这个APKTool-> dex2jar-> JD-GUI路线有现代替代方案!

试试名为Jadx的开源APK和DEX反编译器:https://sourceforge.net/projects/jadx/files/
它还有在线版本:http://www.javadecompilers.com/apk