赞
踩
签名验证,就是在APP中写入自己私钥的hash值,和一个获取当前签名中的私钥hash值的函数两个值相一致,那么就说明APP没有被改动允许APP运行。如果两值不一致那么说明APP是被二次打包的,APP就自我销毁进程。
签名验证又可以在两个地方做,一个是在MainActivity.java的OnCreate函数中做,一个是在原生代码文件的JNI_OnLoad函数中做。
在OnCreate函数中做,短处是反编译者只要找到在OnCreate中定位到验证函数,然后将其注释,重新打包APP就可以成功运行;好处就是代码简单。
在JNI_OnLoad中做,短处是比较复杂(需要创建支持C/C++原生代码的项目,获取hash需要绕道java代码获取等);好处就是反编译者需要进一步掌握ida等反汇编工具将验证函数删除才能绕过验证。
为了最大限度地提高安全性,可以考滤两种验证都使用。
onCreate函数中:
public static void checkSigAsync(final Context context) { com.shuqi.android.a.b.adg().a(10001, 1, new c() { public boolean handleToken(int i, int i2) { try { if (-1900000000 != context.getPackageManager().getPackageInfo(context.getPackageName(), 64).signatures[0].hashCode()) { Process.killProcess(Process.myPid()); // 结束进程 } } catch (Exception e) { System.exit(-1); } return true; } public int getMaxStep() { return 0; } }); }
假设这里经过我们二次打包签名后,重新安装在手机上的app打开即闪退,我们判断该app对签名做了校验,检测出我们二次打包了app导致闪退。
apktool反编译后的文件目录:
查看AndroidManifest.xml–>application–>android:name定位入口函数
android:name="android.taobao.atlas.startup.AtlasBridgeApplication"
关于AtlasBridgeApplication参考文章:
https://alibaba.github.io/atlas/code_read/atlas_start/atlas_start_1.html
https://blog.csdn.net/M075097/article/details/79225030?utm_source=blogxgwz2
构建过程中会把主工程中的manifest中声明的application会替换为框架中的AtlasBridgeApplication,而该Application是框架初始化的起点,反编译后可见实际的manifest文件中除了会合并所有子bundle的manifest之外还替换了之前声明的application的name。
构建过程中在主工程的manifest中添加了
<meta-data android:name="REAL_APPLICATION" android:value="com.xxxx.xxxx.xxxxApplication"/>//其中xxxxApplication即正常编码中写的自己的Application
其中xxxxApplication
即正常编码中写的自己的Application,以下都直接使用RealAppliaction代替自己声明的Application。
构建过程中会根据build文件中配置的multidex_enable在主工程的Manifest中添加
<meta-data android:name="multidex_enable" android:value="true"/>
反编译后的AndroidManifest.xml中
即入口为ShuqiApplicationShell
,这里结合jadx反编译后查看java源码
入口函数已经找到了,接下来我们应该找对签名校验的方法了。
这里我们需要考虑一个问题,什么时候开始对签名进行校验的?
考虑以上问题的原因方便我们在AndroidManifest.xml
定位相关函数
我们测试的app是打开即闪退,还没有进入生命周期,也就是说在入口函数的地方就做了校验。所以我们只需要在入口函数找到用来检验签名的方法对其修改便可绕过。
OnCreate
是Android中的一个特别的函数,用来“表示一个窗口正在生成”。其不产生窗口,只是在窗口显示前设置窗口的属性如风格、位置颜色等。
由上图可见入口类ShuqiApplicationShell
继承了ShuqiApplication
并调用了父类中的onCreate
方法,所以我们需要到父类ShuqiApplication
中查看onCreate
方法执行了哪些逻辑,有没有执行校验签名的方法。
在父类ShuqiApplication
中找到onCreate
方法
阅读代码发现可疑函数checkSigAsync
跟踪函数查看里面的执行逻辑
到这里也就清楚了
根据com.shuqi.app.ShuqiApplication
查找对应的smali代码进行修改
我们将这块代码直接删除就不会执行这里对应的逻辑,即可绕过验证
打包
apktool b shuqi
签名
# 生成证书
keytool -genkeypair -alias roland.keystore -keyalg RSA -validity 500000 -keystore roland.keystore
# 用证书对app进行签名
jarsigner -verbose -keystore roland.keystore -signedjar shuqi_signed.apk shuqi.apk roland.keystore
安装检验
将修改代码后的apk重新打包签名后进行安装,检查是否还会发生闪退现象。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。