Android逆向分析实例(二)-解决xx输入法回编译后闪退问题

  • A+
所属分类:教程

1.思考

apk回编译后闪退,那肯定是这个app做了保护措施。开始我是这样想的,app闪退?那不就是被杀掉了进程嘛,直接去找KillProcess函数(杀死现有进程,也就是自己杀自己)不就行了么,或者找System.exit()函数(用 java api 退出当前线程)应该也可以,于是我根据这两个函数我找到了这个:apk下载链接

Android逆向分析实例(二)-解决xx输入法回编译后闪退问题

既然找到了函数,那么直接把对应的smali文件里的A02()函数里的内容全都删掉,然后返回一个空值(return null)应该就可以了。思路应该是没问题的,但是问题出现了,我在解压出的文件中找不到A02()所在的那个smali文件😂。

那就只能另寻他路了,可以这样想,app在杀掉进程之前肯定有一个判断,判断这个apk是否被回编译过,如果是,就杀掉当前进程,而这个判断的依据是什么呢?那就是跟上一篇一样的签名验证。

2.定位

有思路了,接下来就是定位代码,还是一样用jadx打开apk,然后全局文本搜索signature,直接找到了verifySignature()函数:

Android逆向分析实例(二)-解决xx输入法回编译后闪退问题

函数代码如下:

Android逆向分析实例(二)-解决xx输入法回编译后闪退问题

把这个false改为true,应该就没问题了。

3.修改

该函数所在的文件为:

Android逆向分析实例(二)-解决xx输入法回编译后闪退问题

找到smali文件中的verifySignature函数:

Android逆向分析实例(二)-解决xx输入法回编译后闪退问题

0x0改为0x1,也就是将return的值从false改为true

改完后重新打包签名,这个时候又出现了一个问题:重打包后的apk文件可以正常安装使用,但是签名后安装就会显示该apk未签名无法安装。这是怎么回事呢?我明明签名了啊,后面发现是因为没有删除原签名文件导致的:

Android逆向分析实例(二)-解决xx输入法回编译后闪退问题

把这两个文件删除后,再次打包签名就没问题了。

生活并不复杂,复杂的是我们人自己。生活是单纯的,单纯的才是正确的。

——王尔德

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: