我有自己的apk文件(签名,密封和在Google Play),使用dex2jar使其成为一个jar存储库.
命令行(Windows用户使用.bat,其他人.sh):
d2j-dex2jar.bat -f MyAwesomeApp.apk
我将输出拖放到JD-GUI中,所有的类文件,原始代码重新出现.
我有点吃惊了我的java / Android代码是否暴露? ProGuard如何保护我的apk,如果它可以被反编译和重新生成这么容易?它看起来似乎没有混淆…
提前致谢.
解决方法
有可能了解方法的做法,只是更难.
Aslo,Java使用后期绑定(作为DLL或SO文件).所以,不在代码之外的调用(比如java.util,java.lang等..包)不能被模糊化.另外,如果您的代码需要从外部接收呼叫(一个典型的例子,在按钮上注册一个监听器),则该代码不能被模糊化.一个DLL也是一样,你可以清楚地看到需要在DLL外部调用的方法的名称,并调用其他的DLL.
然而,某个源代码和编译代码之间的映射不一定是一对一的.旧的C编译器用于为给定的源指令生成相同的操作码,因此反编译器非常有效.然后,C编译器为结果的操作码添加了许多优化,这些优化使反编译器大部分无效的为[1]
Java在编译时从未实现(很多)优化,因为在不同的平台(包括不同的Android设备)上运行,Java决定在运行时基于运行设备的体系结构和硬件属性,在运行时应用严重的优化(这是“HotSpot”大部分是[2]).
良好的混淆器通常也会重新排序字节码指令,或插入一些无用的指令,或者应用前期的一些优化,使反编译器无法(或更少)能够轻松获取源代码.
对于可以读取字节码的人来说,这种技术是无用的,因为如果一个人可以读取汇编代码,任何可能的C混淆都是无用的.
许多破解软件表明,即使使用C或其他滞后功能,即使在固件(考虑iPhone固件)的情况下,逆向工程也是可能的,因为您的代码正在运行的客户端始终是不受信任的,并且总是被篡改.
如果你有非常关键的代码,那么有些东西值得很多钱,别人可能会偷,我建议运行它的服务器端,或验证它的服务器端不知何故.