案例App:书旗
一、未修改App正常运行
APP正常运行,无闪退
二、反编译后不做修改重新打包
开始反编译,打开命令行:
apktool d shuqi.apk
结果如图:
不做修改,直接打包:
apktool b shuqi
在 `shuqi\dist\` 目录下找到重新打包的apk,并生成签名
keytool -genkey -keystore my-release-key.keystore -alias my_alias -keyalg RSA -keysize 4096 -validity 10000
对App进行签名:
jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore my-release-key.keystore -signedjar shuqi.apk shuqi.apk my_alias
安装之后,运行app会闪退。
三、修改so文件破解验证
我们什么都没改,应该可以想到,这应该是做了签名验证,毕竟我们哪里都没改啊。那文件这么多,app 究竟是在哪里改的?
根据 App 启动流程:
App Click --> AMS --> AndroidManifest.xml
--> application --> onCreate
如果 onCreate 加载,那么app就会进入生命周期,所以推断是在 application
查找 application
打开 jadx
,加载 shuqi.apk
,点击导航
搜索文本:application
,选择类名
这里出现了好几个 application
,一个一个仔细查看,其中 Atlas 是由阿里巴巴移动团队自研的手机淘宝安卓客户端容器化框架,肯定不是。ShuqiApplication
这个类就很可疑,很大概率在这里面,点开看下:
怎么知道哪里是我们要的?
App是在运行的时候获取了签名,然后进行了比较,先粗略看下代码,比较的话就是if
了,先看看onCreate
方法
第一个if
是在做初始化,第二个if
我们可以看到checkSigAsync
这个方法,check
,Sig
都是很可疑的关键字,选择这个方法,右键点击跳到它的声明
看到它里面的if
,获取该App的签名进行字符串比较,符合的话就会返回true
,不符合的话就会执行下面的KillProcess
对App进行退出。看到着应该就能推断出来了,只要我们令这个方法返回true
或者不执行这个方法就可以。本来可以用frida
进行hook
返回true
,但是frida
需要App一直开启着,像这种一开就闪退的就不适合。那我们就只能令这个方法不执行了。
修改代码我们只能在smail
文件进行修改,smail
文件和java文件是一一对应的,可以在刚才编译出来的shuqi目录里看到smail
这个文件,找到该类对应的smail
文件,根据 com.shuqi.app.ShuqiApplication
这个名字路径,进行查找:
用文本工具打开这个文件,可以看到checkSigAsync
这个方法是在138行,我们进行搜索138,
我们把这4行代码都给删掉,然后再次对这个App进行打包。
进行签名
jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore my-release-key.keystore -signedjar shuqi.apk shuqi.apk my_alias
签名之后,将上次的卸载,再次进行安装,可以使用adb安装:
adb uninstall com.shuqi.controller
adb install .\shuqi_sign.apk
安装之后,运行该App,发现不会闪退了,成功!