- A+
所属分类:教程
1.思考
apk回编译后闪退,那肯定是这个app做了保护措施。开始我是这样想的,app闪退?那不就是被杀掉了进程嘛,直接去找KillProcess函数(杀死现有进程,也就是自己杀自己)不就行了么,或者找System.exit()函数(用 java api 退出当前线程)应该也可以,于是我根据这两个函数我找到了这个:apk下载链接
既然找到了函数,那么直接把对应的smali文件里的A02()函数里的内容全都删掉,然后返回一个空值(return null)应该就可以了。思路应该是没问题的,但是问题出现了,我在解压出的文件中找不到A02()所在的那个smali文件😂。
那就只能另寻他路了,可以这样想,app在杀掉进程之前肯定有一个判断,判断这个apk是否被回编译过,如果是,就杀掉当前进程,而这个判断的依据是什么呢?那就是跟上一篇一样的签名验证。
2.定位
有思路了,接下来就是定位代码,还是一样用jadx打开apk,然后全局文本搜索signature,直接找到了verifySignature()函数:
函数代码如下:
把这个false改为true,应该就没问题了。
3.修改
该函数所在的文件为:
找到smali文件中的verifySignature函数:
将0x0改为0x1,也就是将return的值从false改为true。
改完后重新打包签名,这个时候又出现了一个问题:重打包后的apk文件可以正常安装使用,但是签名后安装就会显示该apk未签名无法安装。这是怎么回事呢?我明明签名了啊,后面发现是因为没有删除原签名文件导致的:
把这两个文件删除后,再次打包签名就没问题了。