因SHA-256算法导致无法上传渠道包的问题

来源:互联网 发布:广元广电网络节目表 编辑:程序博客网 时间:2024/06/06 19:34

负责运营渠道的童鞋发给我这个问题时,感到不知所措,我们的Android客户端并没有使用过SHA加密算法,360从哪里判断安装包(参与360的活动,需要上传安装包)使用了此算法呢?查了下资料,涉及SHA-256算法的Java类主要有3个:

javax.crypto.Cipher;javax.crypto.SecretKey;javax.crypto.spec.SecretKeySpec;

找了下这3个类的关联引用,发现没有被引用过。想来想去,没什么好办法,恰好最近研究了阿里开源项目Dexposed,可以hook Java层任何类、函数,何不用这个工具追踪谁用了这三个类呢?
因为公司的产品包含淘宝客,使用了阿里提供的百川sdk,XPosed早于Dexposed,被阿里所采用(个人比较好奇,阿里自己用Xposed,却开源Dexposed项目),所以通过使用百川sdk中的Xposed工具同样能起到hook效果。其实这种hook更像是在虚拟机执行字节码的前后从底层去拦截。
Xposed的主要工具类是XposedBridge,通过方法hookAllMethods可以hook指定类的所有方法,并在方法执行前、过程中、执行后得到回调。因为要加载so库文件,所以又去翻了翻sdk中加载so库文件的工具类,不一会儿就找到了工具类com.alibaba.sdk.android.hotpatch.a.a.c,看来是被混淆了。现在万事具备,开始找找是谁调用了Cipher、SecretKey、SecretKeySpec这三个类,我分别在SecretKey的getEncoded、SecretKeySpec的构造函数、Cipher的getInstance加了hook,这3处也是方法的实现SHA-256算法的必经之地,最后在用XposedBridge hook前,调用加载so文件的接口函数。

        XposedBridge.hookAllMethods(SecretKey.class, "getEncoded", new XC_MethodHook() {            @Override            public void beforeHookedMethod(MethodHookParam param) throws Throwable {                super.beforeHookedMethod(param);                throw new RuntimeException("SecretKey is used");            }        });        XposedBridge.hookAllConstructors(SecretKeySpec.class, new XC_MethodHook() {            @Override            public void afterHookedMethod(MethodHookParam param) throws Throwable {                super.afterHookedMethod(param);                throw new RuntimeException("SecretKeySpec is used");            }        });        XposedBridge.hookAllMethods(Cipher.class, "getInstance", new XC_MethodHook() {            @Override            public void beforeHookedMethod(MethodHookParam param) throws Throwable {                super.beforeHookedMethod(param);                throw new RuntimeException("Cipher is used");            }        });

接着,程序跑起来...
应用刚启动,首先遇到了一个RuntimeException异常,查看日志,果然是有代码调用了相关类。最后排查出baidu定位sdk、新浪分享sdk都使用了此算法,这下麻烦大了,因为定位和分享是必须功能,但要解决问题就应该删掉这两个组件,这个时候面临两难选择,以后有时间再研究下解决方案,目前只有先去问问产品吧。

0 0