Android的Apk反编译似乎很容易

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

我有我自己的 apk文件(签名,密封,并在谷歌播放),使用dex2jar使其成为一个jar库。

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

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中减少了源的长度。

无论如何,理解这个方法的作用是可能的,这只是一个难题。

另外,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

链接地址: http://www.djcxy.com/p/90703.html

上一篇: Android Apk decompilation seems to easy

下一篇: How to prevent reverse engineering of an Android APK file to secure code?