转载自:http://www.secbuff.com/ios/215.html?d=3
0×00 说明
斗鱼是自己非常喜欢的一家直播平台,由于经常在斗鱼看lol比赛,加上又是武汉的互联网企业,所以就逆向了下斗鱼,看能不能过签名校验。
首先我们正常登录APP,可以正常加载APP各种页面,登录的时候再尝试用QQ号登录,会正常来到授权页面。如下图:
0×01 签名校验分析
一般APP的签名验证有3种:本地验证、网络验证、本地验证+网络验证,其中本地验证也分Java层和Native层验证。那么要分析APP的是否存在签名校验一般的方法是先反编译APP,然后直接回编译再签名,运行APP查看是否存在闪腿或者弹toast提示签名错误。斗鱼的签名验证有问题的时候会无法连接网络,如果再尝试用QQ进行辅助验证的话就可以很明显看出存在签名校验,如下图:
0×02 签名分析
首先我们在启动斗鱼的时候抓包,发现一处可疑之处:
header头中有个dy-sign的字段,我们是否可以猜测是不是签名校验中的网络校验,先把获取到的app校验值传给服务端进行判断,如果正确在是正版app。,否则就是伪造的app。那么我们直接反编译app,不做任何修改,启动自己签名的app后在把dy-sign改成前面获取的看看:
我们看到返回200,但是后面进去后太少加载网络失败,看来有可能存在本地验证。
根据前面介绍的,发现使用伪造签名的app时。进去后会提示无法连接服务器,加载失败的提示,所以就先根据这个错误提示来找找看:
上面的图片就是根据提示信息,找到这个提示消息所对于的string name,然后根据string name找到这个提示信息的ID号,在全局搜索ID号,查看哪里有调用的地方,一步步分析。
通过jd-gui查看调用的java代码,并没有发现有0x7f080304的地方,我们把0x7f080304变成十进制再搜可以搜索,但是并没有什么卵用。
0×03 分析android系统获取签名方法
我们知道如果要做签名验证,app必须调用系统的一个api方法:
packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES );
public void initZygote(StartupParam startupParam) throws Throwable {
XposedHelpers.findAndHookMethod(
"java.security.Signature"
,null,
"verify"
, byte[].class,new XC_MethodHook(){
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log(
"disabled verifysignature......"
);
param.setResult(Boolean.TRUE);
}
});
转载请注明:SecBuff » 斗鱼APP签名校验绕过