抖音版本里面加了好几个算法,有as,cp(早期就这两个),mas,X-Gorgon,X-SS-STUB,X-Khronos算法,不少关键key之间有相互关联,只要有一个环节算错了,就会请求不到数据。目前版本的抖音加了不少的验证,及代码混淆,难度偏大。android
抖音的签名算法在libcms.so中,在JNI_Onload中动态注册jni函数。
算法用ollvm混淆了,主要是流程平坦化,流程混淆和运算替换
主要用到一些逆向工具IDA,Xposed框架算法
8.0版本以后的算法主要是X-Gorgon和X-SS-STUB.以后通过抓包抖音接口,查看Java层,so层代码,分析以下原理。安全
今天有空分享一下抖音的加密算法,做为拥有庞大用户量的APP,其通讯协议加密的强度确定是不弱的,关键算法被VM,只能动态分析去理解。咱们经过抓包分析,请求的URL上带有AS、CP两个加密字段,这两个字段是早期版本算法,后又陆续添加了MAS、X-GORGON算法。咱们今天先对AS、CP两个字段进行分析,这个只能经过动态调试去跟踪加密过程。
首先咱们经过工具调试定位到函数cookie
- [IESAntiSpam testForAlert:msg:]
定位的详细过程忽略……,进入继续调试后发现调用SUB_102E3345函数进行加密排序
1.整理分析流程
session
1.时间戳转十六进制 2.将时间戳排序俩次, a1 v3 是排序key sprintf(byte_102323F30, "%08x", a1); sprintf(byte_102323F3A, "%08x", v3); 3.将url参数用MD5加密一次或俩次根据时间戳&运算 4.将第一次排序结果写入前16位地址加一写入(从1插入),隔一位插入,前边拼a1 5.将第二次排序结果写入后16位(从0插入)后边拼e1
2.结果排序框架
a1d5b43se234dccea7 456dcd5s2320cf3e1 &cp=456fcd5s2320cfs3e1&as=a1d5b43se234dccea7 拼接完成后就能够请求了
后期版本添加了mas算法和最新的X-gorgon算法,目前最新系列版本算法若是须要了解的话能够交流。
3.流程详述
那么咱们就可以更加确信header里的x-gorgon对它进行了一次签名,因此咱们直接jadx上手阅读一波反编译后的代码,这里我直接搜索了x-gorgon关键字,列出了如下结果:
那么咱们就可以更加确信header里的x-gorgon对它进行了一次签名,因此咱们直接jadx上手阅读一波反编译后的代码,这里我直接搜索了x-gorgon关键字,列出了如下结果:
这里我选择了hashMap.put("X-Gorgon", a3);这一行,跳转进去咱们来分析一下它的代码
这里咱们看到有一个它的值是来自a3,a3则是经过String a3 = a.a(com.ss.sys.ces.a.leviathan(i, currentTimeMillis, a.a(a2 + str4 + str5 + str6)));这行代码进行获取到的结果,咱们看到它传了4个参数,咱们来仔细看一下这4个参数具体都是什么内容:
a2来源:
String b2 = tt.d(str);
d.a(b2);
str它就是该方法传进来的参数,咱们后面能够经过hook方式来获取它的具体内容,而它会执行tt.d()、d.a() 进行2次操做,咱们对其tt.d()跟进去
咱们看到它对这个字符串进行了取 ? 和 # 中间值,怀疑是url,若是是url证实它只是取了url后面的参数,那么继续看它的下一个方法:d.a()
咱们看到这里就是进行了MD5签名取值,那么a2分析到此结束,咱们继续分析第2个参数
str4来源:
这里很是简单,它就是枚举传进来的第二个参数map,判断若是有X-SS-STUB这个值的话就获取,反之则填充32个0,那么咱们抓包发现并无X-SS-STUB这个参数,实际上若是咱们的包是POST的话它就会有,实际上它就是POST数据的一个MD5签名值。
str5来源:
str5也很是简单,也是枚举map里面有没有COOKIE,若是有就把COOKIE进行MD5,那么该参数也到此结束了
str6来源:函数
String c2 = tt.e(str3); if (c2 != null && c2.length() > 0) { str6 = d.a(c2); StcSDKFactory.getInstance().setSession(c2); }
这里咱们记得str3是cookie,它执行了tt.e(str3) 方法获取一个返回值,若是它不是空一样给这个返回值md5,那么咱们跟进去看一下它是作了什么处理:
这里咱们看到它是枚举了cookie里面有没有sessionid这个值,若是有就取出来,那么str6到此结束
参数整理:
a2 = md5(url) 疑似对网址的参数进行md5
str4 = x-ss-stub,只有post时才有效,不然是32个0
str5 = md5(cookie) 对cookie进行md5
str6 = md5(cookie['sessionid']) 对cookie里面对sessionid进行md5,不然也是32个0
咱们整理完了这4条参数后,继续分析,它将这4个参数进行了字符串合并,接着执行 a.a(a2+str4+str5+str6),咱们跟进去看看里面作了什么操做
咱们看到它这里循环了总长度/2次,每次都是把 str[i] 转换成十进制左移4,而后加上 str[i+1] 都一个简单运算,并返回结果,也就是原本是4个32位(128位)而后通过加密后缩短成了64位长度。最后它执行了com.ss.sys.ces.a.leviathan(i, currentTimeMillis, a.a(a2 + str4 + str5 + str6))进行计算,咱们看到它还传了2个参数,i和currentTimeMillis,咱们往前能够看到 i是-1,而currentTimeMillis是当前都十位时间戳。
最后把计算好都byteArray通过位移转换成了string类型,并put到map里面,那么咱们也清楚到看到,k-khronos也就是刚刚到currentTimeMillis时间戳了。咱们发现因为om.ss.sys.ces.a.leviathan是在so层到libcms.so文件,而且里面有大量到混淆就没有再度分析。咱们能够经过xposed或者unidbg到方法进行调用。工具
这里咱们分析完了它算法到具体参数构造完成后,咱们还须要确认它传到参数是不是咱们所联想到,那么这里咱们发现因为它这个方法是一个callback,咱们往前跟一下,寻找一个合适到hook点,使用frida进行hook
这里我对它进行了调用查找,看到只有1个地方,咱们跟进去看看,跟进去以后它就是如下内容,就只是一个简单对赋值给sAddSecurityFactorProcessCallback,咱们在对它进行调用查找,看看是什么地方对它进行对调用。post
public static void setAddSecurityFactorProcessCallback(a aVar) {
sAddSecurityFactorProcessCallback = aVar;
}
这里咱们看到它从这里取的回调指针变量,而后判断若是不为null则执行,那么咱们就能够直接hook这个方法:tryAddSecurityFactor$___twin___,这里个人hook代码也就比较简单,直接输出它传进去的map和str的值以及返回的map进行确认。this
//frida -U com.ss.android.ugc.aweme -l test.js Java.perform(function() { var NetworkParams = Java.use("com.bytedance.frameworks.baselib.network.http.NetworkParams"); NetworkParams['tryAddSecurityFactor$___twin___'].implementation = function(str,map){ var keyset = map.keySet(); var it = keyset.iterator(); console.log("str:\t"+str) while(it.hasNext()){ var keystr = it.next().toString(); var valuestr = map.get(keystr).toString() console.log("map:\t"+keystr+"\t"+valuestr) } var ret ret = this.tryAddSecurityFactor$___twin___(str,map); var keyset = ret.keySet(); var it = keyset.iterator(); while(it.hasNext()){ var keystr = it.next().toString(); var valuestr = ret.get(keystr).toString() console.log("ret map:\t"+keystr+"\t"+valuestr) } return ret; } });
绿色部分就是str参数1的值,黄色则是map,蓝色则是返回的map,咱们看下charles的这个包的header里的xgorgon是否是返回的值。
以上就是对抖音对一个简单的x-gorgon的分析笔记过程,但愿可以有所帮助,也可以对自身的产品安全方面进行一个参考借鉴。
覆盖主流平台:抖音,快手,小红书,TikTok,Zynn,YouTube,1688,拼多多,淘宝,美团,饿了么,淘宝,微博