反向编译有一种方法
将dex文件从apk中解压缩,获取classes.dex,在dex2jar中将dex文件转换为jar文件: dex2jar.bat classes.dex,然后将生成的classes.jar文件转换为JD-guuuugur
jd-gui下载: http://jd.benow.ca/
还报告错误
dex2jar .classes.dex - . classes-de x2 jar.jar com.Google code.d2j.dex exception : notsupportversion.atcom.Google code.d2j.reader.dexfifion atcom.Google code.de x2 jar.tools.de x2 jar cmd.do command line (de x2 jar cmd.Java 3360104 )。 atcom.Google code.de x2 jar.tools.base cmd.domain (base cmd.Java 3360288 ) atcom.Google code.de x2 jar.tools.de x2
此时,我想编译dex2jar的相关文件,了解为什么报告了错误
打开dex2jar-2.0lib目录时,reader.DexFileReader.init会报告错误,这可能是DexFileReader初始化错误。 应该是dex-reader-2.0.jar或dex-reader-2.0.jar
publicdexfilereader (bytebufferin ) in.position ) 0; in=in.asReadOnlyBuffer ().order(byteorder.little_Endian ); int magic=in.getInt ()0xFFFFFF; 魔力!=7890276 ) if (幻灯片==7955812 ) thrownewdexexception (' notsupportodex ' ); } thrownewdexexception (' notsupportmagic.'; } int version=in.getInt ()0xFFFFFF; if () version!=3486512 () version!=3552048 ) (//此处积极抛出异常的thrownewdexexception (' notsupportversion.' ); } .可以推测这是在读取第一个字符时通过比较版本值主动抛出异常
很明显,version是3486512和3552048不是zgdl。 那些是什么呢? 上下搜索可以看到定义的常数:
privatestaticfinalintmagic _ 035=3486512; privatestaticfinalintmagic _ 036=3552048; 额,MAGIC_035和MAGIC_036,在网上查了一下,好像是dex头部检查
较旧版本的幻方版本为035
优化的dex文件,幻像版本为036
说误报不等于这两个,是什么情况?
在notpad中打开classes.dex文件时,头部会出现以下情况
德克斯磁头
第二行竟然是037! 嗯,我有一个大胆的想法。 把037,改成036,保存,再用dex2jar
成功了! 在jd-gui中打开jar文件也可以顺利地进行逆编译
传统思维:
如果幻方版本是dex检查,为什么gts的apk是037这个不正确的值? 这个apk特别吗? (实际验证此apk是否无法安装(为什么读取的int值为3552048,notepad显示为036? (推测与字符代码有关)