Android Apk反编译似乎很容易

时间:2012-07-29 02:07:33

标签: java android obfuscation apk decompiler

我只是搞乱了。我下载了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):

d2j-dex2jar.bat -f MyAwesomeApp.apk

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

提前致谢。

2 个答案:

答案 0 :(得分:4)

混淆器通常只是将类,方法和字段名称更改为没有意义的名称。所以,如果你有“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固件),导致运行代码的客户端始终不受信任,并且始终可以被篡改

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

答案 1 :(得分:0)

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

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