反编译和逆向出现:java.lang.VerifyError(新问题样本)

#PS:要转载请注明出处,本人版权所有

#PS:这个只是 《 我自己 》理解,如果和你的

#原则相冲突,请谅解,勿喷

前序

某日,遇到一个App,突然想来一发,于是,直接下到这个app的老一点的版本,用某自动脱壳机脱壳后,得到Dex文件。并通过工具(AndroidKiller)生成Smali文件(此文件不完整)。

修复

首先,把Smali文件放回到我们反编译后的Apk文件目录去,修复相关的类目录。这时候,在通过工具,把整个工程重新编译生成Apk,是可以正常安装的,但是不能够正常打开,并且得到java.lang.VerifyError错误。
经过大量的搜索和整理,得到如下结论。
此错的原因为:由于smali指令序列不符合相关的规范(指令丢失,反编译失败了,或者指令反编译错误,得到了错误的smali指令。对于反编译失败,相关的反编译工具(AndroidKiller)可能会在当前字段出现标注,根据标注解决就好)。
网上现存的不规范的原因:
1 寄存器使用数量和定义个数不一致(用脚本很容易出现此问题)
2 函数体不完整,丢失相关标识符.end method等

java.lang.VerifyError 新问题样本

1 反编译出问题的东西大部分在构造函数,init()方法大部分都出现在缺少return-void
2 当前类继承的interface,父类为java object ,出现 没有调用java object - > init()方法

对于以上问题,其实相关工具会在smali文件里面存在 #disallowed odex opcode错误,直接搜索就可以解决。

#PS:请尊重原创,不喜勿喷

#PS:要转载请注明出处,本人版权所有.

有问题请留言,看到后我会第一时间回复

猜你喜欢

转载自blog.csdn.net/u011728480/article/details/78874137