APK拿到手以后,反编译并不只是把文件丢进工具里等结果。一个安装包里可能同时带有多个DEX、资源文件、Manifest以及第三方库,代码还可能经过混淆或编译优化。JEB Decompiler会递归分析APK中的不同单元,再把DEX字节码转换成便于阅读的反汇编和Java形式代码。实际查看时,类名变短、方法结构奇怪、部分代码无法还原,并不一定是文件损坏,还要结合DEX内容和反编译状态来判断。
一、JEB Decompiler怎么反编译APK文件
JEB打开APK后会建立分析工程,并处理安装包、DEX、XML资源和证书等内容。代码分析主要围绕DEX单元展开,想看Java形式的结果,可以从反汇编视图切换到反编译视图。
1、打开APK并完成初始分析
拿到APK后可以直接建立分析工程,不需要提前手动拆出classes.dex。
①、启动【JEB Decompiler】。
②、依次点击【File】→【Open】。
③、选择准备分析的【APK文件】。
④、等待【Project Explorer】完成项目树加载。
⑤、展开APK下的【DEX】相关单元。
⑥、确认类、资源和Manifest等内容已经出现。
2、打开类并切换到反编译代码
①、在【Project Explorer】中展开目标【DEX】。
②、进入需要查看的包和类。
③、双击目标【Class】打开代码视图。
④、在【Assembly】中把光标放到需要分析的方法附近。
⑤、按【Tab】切换到反编译代码。
⑥、需要返回字节码时再次按【Tab】切换。
JEB的DEX单元会提供反汇编等多个视图,Tab切换适合在底层指令和高层代码之间来回核对。
3、按类重新执行反编译
有些类第一次生成的代码不够清楚,可以单独重新处理,不必重新载入整个APK。
①、在【Assembly】中定位目标【Class】。
②、打开【Action】菜单。
③、选择【Decompile with Options】。
④、检查当前反编译选项。
⑤、需要只处理当前方法时取消对应的顶层类反编译选项。
⑥、重新执行【Decompile】查看结果。
二、JEB Decompiler APK反编译后代码显示异常如何处理
代码显示异常的表现并不固定。有时只是变量名变成单个字母,有时会出现大量跳转、异常控制流,也可能某个类根本没有生成Java视图。排查时先判断问题出在APK解析、DEX反编译还是代码本身经过了混淆。
1、Java代码结构很乱但Assembly正常
①、打开异常方法的【Assembly】视图。
②、检查该方法的DEX指令是否能够正常显示。
③、进入【Action】→【Decompile with Options】。
④、调整当前可用的反编译选项。
⑤、重新生成该【Class】的反编译结果。
⑥、在【Java】和【Assembly】之间切换比较控制流。
如果底层指令完整,而Java结果看起来很绕,问题更可能出在高层结构恢复或原始代码经过优化、混淆。JEB的反编译器还会执行部分去混淆和代码优化处理,不同选项可能让生成结果发生变化。
2、类名和方法名几乎无法阅读
APK经过名称混淆以后,a、b、c这类类名和方法名很常见,这种情况不能靠重新打开文件恢复原始名称。
①、在【Project Explorer】中找到需要整理的【Class】。
②、选中目标类、字段或方法。
③、执行【Rename】。
④、根据调用位置填写便于识别的新名称。
⑤、查看相关交叉引用是否同步显示新名称。
⑥、保存当前分析工程。
3、某个类无法生成反编译代码
①、打开该类对应的【Assembly】。
②、确认方法指令是否能够读取。
③、执行【Decompile with Options】。
④、缩小反编译范围到当前方法。
⑤、关闭可能影响结果的部分高级优化选项后再次处理。
⑥、仍无法生成时保留【Assembly】作为分析依据。
4、部分字段或方法看不到
①、打开目标类的反编译视图。
②、右键进入【Rendering Options】。
③、勾选【Generate synthetic fields】。
④、勾选【Generate synthetic methods】。
⑤、重新查看当前类。
JEB默认可能不会把部分编译器生成的synthetic成员完整显示出来,开启相应渲染选项后可以重新查看。
5、大型APK只处理出一部分内容
大型安装包包含多个DEX时,JEB会自动处理并可进行DEX合并分析,但工程处理状态仍然值得检查。
①、在【Project Explorer】中展开全部【DEX】单元。
②、确认【classes.dex】、【classes2.dex】等内容是否都已识别。
③、右键异常单元并打开【Properties】。
④、查看【Status】是否存在处理错误。
⑤、检查底部【Logger】中的异常信息。
⑥、修正环境问题后重新载入【APK文件】。
三、JEB Decompiler反编译结果怎么继续核对
反编译出来的Java代码适合阅读逻辑,但它毕竟是根据DEX重新构造的结果。准备判断关键算法、参数来源或者分支逻辑时,保留底层指令作为对照,会少掉不少误解。
1、用Assembly核对关键方法
①、在反编译视图中定位目标【Method】。
②、按【Tab】返回【Assembly】。
③、核对条件跳转、方法调用和返回值。
④、按【Space】打开对应的控制流图。
⑤、查看关键分支之间的执行关系。
⑥、再按【Tab】回到反编译代码进行对照。
2、保存已经整理过的分析工程
①、完成类和方法整理后点击【File】→【Save】。
②、保存当前【JDB2】工程。
③、需要导出代码时进入【File】→【Export】。
④、选择需要保存的反编译内容。
后面再次打开JDB2时,可以继续使用已经完成的重命名和分析结果,不需要每次都从原始APK重新开始。JEB也支持从导出菜单保存反编译内容。
总结
JEB Decompiler反编译APK时,Java代码能不能顺利显示,只是分析的一部分。碰到代码结构奇怪、名称混乱或者某个方法无法还原时,回到DEX反汇编看一眼,往往更容易判断问题到底来自混淆、编译优化还是反编译过程。平时把关键类重新命名,再把Java视图和底层指令放在一起看,阅读复杂APK会顺手很多。遇到少量代码没有还原,也不用急着把整个结果推翻,先确认对应DEX内容是否完整更实际。
