精华内容
下载资源
问答
  • 先看看设备注册的包: POST https://log-lq.snssdk.com/service/2/device_register/?device_id=56581003169& is_activated=1&aid=1128&tt_data=a&version_code=12.4.0&app_name=aweme&app...

    先看看设备注册的包:

    POST https://log-lq.snssdk.com/service/2/device_register/?device_id=56581003169&
    is_activated=1&aid=1128&tt_data=a&version_code=12.4.0&app_name=aweme&app_version=12.4.0&vid=84185501-88C0-4E38-BA3D-F3656A073020&device_id=56581003169&channel=App%20Store&mcc_mnc=46001&aid=1128&screen_width=1125&openudid=690af6a89ae78c69306c8a07bca241b840sd156&cdid=AD072FE4-41B7-4890-BEBC-2D57A4F3F253&os_api=18&ac=4G&os_version=12.4&build_number=123011&device_platform=android&iid=3125112636576938&device_type=Huawei%C8600&is_vcd=1 HTTP/1.1
    Host: log-lq.snssdk.com
    Connection: keep-alive
    Content-Length: 856
    Accept: application/json
    Cookie: odin_tt=458f8eb0d95b7b9adb4b6fc6591918bfb996096967a7aa4305bd81b5150a8199d2e29ed21883cdd7709c5beaa2be3baa; sessionid=66e5128a179ef5f03f5187bae265bf9c; sessionid_ss=ff5128a179ef5f03f5187baecss22; sid_guard=d2da128a179ef5f03f5187bae265bf9c%7C1598662639%7C5183349%7CWed%2C+28-Oct-2020+00%3A46%3A28+GMT; sid_tt=66e5128a179ef5f03f5187bae265bf9c; uid_tt=fsffdc1fa00bb0ddddd400f58d5795df3; uid_tt_ss=232ec1fa00bb0ddddd400f58d5795321; install_id=3125112636576938; ttreq=1$432133fb80de2e267dd1a8478e5394cdd0cd23d1
    Content-Type: application/octet-stream;tt-data=a
    X-SS-Cookie: install_id=3125112636576938; ttreq=432133fb80de2e267dd1a8478e5394cdd0cd23d1; sessionid=ff5128a179ef5f03f5187baecss22; sessionid_ss=ff5128a179ef5f03f5187baecss22; sid_guard=ff5128a179ef5f03f5187baecss22%7C1598662639%7C5183349%7CWed%2C+28-Oct-2020+00%3A46%3A28+GMT; sid_tt=ff5128a179ef5f03f5187baecss22; uid_tt=d36ec1fa00bb0ddddd400f58d5795df3; uid_tt_ss=d36ec1fa00bb0ddddd400f58d5795df3; odin_tt=a09d8eb0d95b7b9adb4b6fc6591918bfb996096967a7aa4305bd81b5150a8199d2e29ed21883cdd7709c5beaa2be3baa
    tt-request-time: 15994653422123
    User-Agent: Aweme 12.3.0 rv:123015 (iPhone; iOS 12.2; zh_CN) Cronet
    aid: 1128
    x-Tt-Token: 00632e5128a179ef5f03f5187bae265bf9cdded28ab77be5f36e4259d59aa924b6c7f5284cdd07bf788188bb5185d61c32145
    sdk-version: 2
    passport-sdk-version: 5.12.1
    X-SS-STUB: 34C32EDE4A3C45F55403E5EBD44A321B
    X-SS-DP: 1128
    x-tt-trace-id: 00-6123a32f7a09f80897b9fe6e7cc5490468-62a08f7a09f32457-01
    Accept-Encoding: gzip, deflate, br
    X-Khronos: 1599465342
    X-Gorgon: 040802f0000e09020319e1d6be6194bfbd32024c25831c86bce
    

    在新版设备注册的url中你会发现多了一部分参数,但是有一个参数比较耀眼那就是is_activated=1。明白人一眼就能看出来是什么含义,关于设备注册里面的参数在这里不方便分析,需要详细了解的可以联系我!评论区有联系方式!

    首先我们要知道抖音封禁设备靠判断什么

    然后我们就可以针对它来解。

    抖音判断一台设备无非就是根据手机的IMEI,IMSI,MAC,系统版本

    型号之类的来判断时候同一台设备

    我们利用JADX来逆向,关键函数在ttEncrypt方法

    func IIDEncrypt(plainStr []byte) []byte {
    	CplainStr := C.CString(string(plainStr))
    	defer C.free(unsafe.Pointer(CplainStr))
    	plainlength := len(plainStr)
    	libPathC := C.CString(EXTENSION_DIR + OIDB_API)
    	defer C.free(unsafe.Pointer(libPathC))
    	encryptedLength := plainlength + 4 + (16 - plainlength%16)
    	CKeyStr := C.CString("!*ss!_defaul%t54K&EY")
    	defer C.free(unsafe.Pointer(CKeyStr))
    	CEncryptedStr := C.encode(libPathC, CplainStr, C.int(encryptedLength), CKeyStr, C.int(20))
    	defer C.free(unsafe.Pointer(CEncryptedStr))
    	encryptedStr := C.GoBytes(unsafe.Pointer(CEncryptedStr), C.int(encryptedLength))
    	//encryptedHexStr := hex.EncodeToString(encryptedStr)
    	return encryptedStr
    }
    char* Encode(char* plain, int plainlength, char* key, int keylength)
    {
        //string plain = hexToStr(hexplain);
        char *xkey;
        char *xplain;
        //int keylength = key.length();
        //int plainlength = plain.length();
        xkey = (char*) malloc(keylength);
        xplain = (char*) malloc(plainlength);
        memcpy(xkey, key, keylength);
        memcpy(xplain, plain, plainlength);
        unsigned char *out = (unsigned char*) malloc(plainlength + 100);
        aweme_aes((__int64)xplain, plainlength, (__int64)xkey, keylength, (__int64)out);
        free(xkey);
        free(xplain);
        xkey = NULL;
        xplain = NULL;
    //    int cryptedStr_length = plainlength + 4 + (16 - plainlength%16);
    //    std::string hexStr = charsToHex(out, cryptedStr_length);
    //    free(out);
        //out = NULL;
        return (char*)out;
    }
    #include "subs.h"
     
     
     
     
    uint32 bswap32(uint32 x)
    {
    	return  ((x << 24) & 0xff000000) |
    		((x << 8) & 0x00ff0000) |
    		((x >> 8) & 0x0000ff00) |
    		((x >> 24) & 0x000000ff);
    }
    unsigned char InvSbox[256] = {  // inverse s-box  
    	0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
    	0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
    	0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
    	0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
    	0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
    	0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
    	0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
    	0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
    	0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
    	0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
    	0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
    	0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
    	0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
    	0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
    	0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
    	0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d };
     
    unsigned char Sbox[256] = {     // forward s-box  
    	0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
    	0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
    	0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
    	0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
    	0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
    	0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
    	0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
    	0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
    	0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
    	0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
    	0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
    	0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
    	0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
    	0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
    	0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
    	0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 };
     
    __int64  aweme_aes(__int64 plainStr, __int64 plainStr_length, __int64 key, __int64 key_length, __int64 strOut)
    {
    	return sub_1005D099C((const void *)plainStr, plainStr_length, (void *)key, key_length, (_BYTE *)strOut, 2);
    }
     
    signed __int64  sub_1005D099C(const void *plainStr, signed int plainStr_length, void *keyStr, signed int keyStr_Length, _BYTE *strOut, char value_2)
    {
    	char v6; // w21
    	_BYTE *strOut2; // x19
    	signed int v8; // w20
    	const void *v9; // x22
    	signed __int64 result; // x0
    	int v11; // w8
    	unsigned int v12; // w8
    	int v13; // w9
    	int v14; // w8
    	unsigned int v15; // w24
    	int v16; // w25
    	_BYTE *v17; // x23
    	signed __int64 v18; // x8
    	signed __int64 v19; // x8
    	int v20; // w10
    	int w11; // w11
    	int w12; // w12
    	int w14; // w14
    	unsigned int *v24; // x13
    	unsigned int v25; // w16
        unsigned int *v26; // [xsp+8h] [xbp-58h]
    	int v27; // [xsp+Ch] [xbp-54h]
    	int v28; // [xsp+10h] [xbp-50h]
    	int v29; // [xsp+14h] [xbp-4Ch]
     
        v26 = (unsigned int*) malloc(1000);
    	v6 = value_2;
    	strOut2 = strOut;
    	v8 = plainStr_length;
    	v9 = plainStr;
    	result = 0xFFFFFFFFLL;
    	if (keyStr_Length >= 1 && keyStr && plainStr_length >= 1 && strOut)
    	{
    		sub_1005D0B50(keyStr, keyStr_Length, (unsigned int *)v26);
    		//sub_1005D0B50(a3, a4, (unsigned int *)&v26);
    		v11 = v8 + 15;
    		if (v8 >= 0)
    			v11 = v8;
    		v12 = v8 - (v11 & 0xFFFFFFF0);
    		v13 = 16 - v12;
    		v14 = 31 - v12;
    		if (v13 >= 0)
    			v14 = v13;
    		v15 = v13 - (v14 & 0xFFFFFFF0);
    		v16 = v8 + v15 + 4;
    		v17 = strOut2 + 4;
    		memmove(strOut2 + 4, v9, v8);
    		*strOut2 = 116;
    		strOut2[1] = 99;
    		strOut2[2] = v6;
    		strOut2[3] = v15;
    		if (v16 >= 5) //plainStr_length
    		{
    			v18 = (unsigned int)v16 - 4LL;
    			do
    			{
    				*v17 = Sbox[(unsigned __int8)*v17];
    				++v17;
    				--v18;
    			} while (v18);
    		}
    		if ((signed int)(v15 + v8) >= 16)
    		{
    			v19 = 0LL;
    //			v20 = v26; //0x25
    //
    //			w11 = (int)((&v26)[1]);
    //			w12 = (int)((&v26)[2]);
    //			w14 = (int)((&v26)[3]);
    			v20 = *v26; //0x25
                //int * tmp1 = (int*)v20;
    			w11 = v26[1];
               // int * tmp2 = (int*)w11;
    			w12 = v26[2];
                //int * tmp3 = (int*)w12;
    			w14 = v26[3];
                //int * tmp4 = (int*)w14;
    			v24 = (unsigned int *)(strOut2 + 16);
    			do
    			{
    				v25 = *(v24 - 2);
    				*(v24 - 3) = bswap32(bswap32(*(v24 - 3)) ^ v20);
    				*(v24 - 2) = bswap32(w11 ^ __ROR4__(bswap32(v25), 24));
    				*(v24 - 1) = bswap32(w12 ^ __ROR4__(bswap32(*(v24 - 1)), 16));
    				*v24 = bswap32(w14 ^ __ROR4__(bswap32(*v24), 8));
    				v24 += 4;
    				++v19;
    			} while (v19 < (v15 + v8) >> 4);
    		}
    		result = 0LL;
    	}
        free(v26);
        v26 = NULL;
    	return result;
    }
     
    void * sub_1005D0B50(void *keyStr, signed int keyStr_length, unsigned int *out)
    {
    	unsigned int *out2; // x19
    	signed int keyStr_length2; // w20
    	signed int v5; // w21
    	void *result; // x0
    	__int64 v7; // x8
    	bool v8; // nf
    	unsigned __int8 v9; // vf
    	__int64 v10; // x8
    	unsigned int v11; // w9
    	unsigned int v12; // w9
     
    	out2 = out;
    	keyStr_length2 = keyStr_length;
    	if (keyStr_length >= 16)
    		v5 = 16;
    	else
    		v5 = keyStr_length;
    	result = memcpy(out, keyStr, v5);
    	if (keyStr_length2 <= 15)
    	{
    		v7 = v5 + 1;
    		do
    		{
    			*((_BYTE *)out2 + v7 - 1) = InvSbox[*((unsigned __int8 *)out2 + v7 - 2)];
    			v9 = __OFSUB__(v7, 16LL);
    			v8 = v7++ - 16 < 0;
    		} while (v8 ^ v9);
    	}
    	v10 = 0LL;
    	do
    	{
    		*((_BYTE *)out2 + v10) = Sbox[*((unsigned __int8 *)out2 + v10)];
    		++v10;
    	} while (v10 != 16);
    	v11 = out2[1];
    	*out2 = bswap32(*out2); //w10
    	out2[1] = bswap32(v11); //w11
    	v12 = out2[3];
    	out2[2] = bswap32(out2[2]); //w12
    	out2[3] = bswap32(v12); //w14
    	//printf("");
    	return result;
    }

    通过上面device_register的url我们可以知道,设备注册其实是向抖音提交当前设备的一些信息,例如MAC、SSID、UUID、IMEI、IMSI、WIFIMAC、device_brand、device_model、device_board、device_type、openudid、clientudid、build_serial等等来注册得到 device_id和install_id。

     

    其实抖音的验签机制很野,即使你的x-gorgon算法生成稍微和它APP本身计算的有些出入(说白了就是抖音检测到你是独立计算到),它照样会开放一些功能给你,比如获取feed接口(热门视频),但是你会发现没法点赞,评论,私信。后来经过frida进行一个hook验证,发现确有此事,很多x-gorgon算法都是使用hook或者直接调用so到方式实现到,根本没去真正解刨它里面到运算过程。再一次测试到过程中,我把url以及x-khrons和cookie,xttsub固定起来,使用hook或者调用so的方式去计算x-gorgon结果,发现不管你执行多少次,结果都是一样的。但是,我使用frida来拦截抖音它自己的签名过程,并把参数改成和上面的一样,那么它每次计算的结果都不一样。由此可见,抖音在计算过程中肯定获取了某些全局参数,比如它签名后会把一些值存入到
    一个全局变量,下次计算到时候读取,也或者它在某些功能动作到时候,会记录一些值,影响签名到计算算法。这个事情到确实得到多次证实,用hook或者so调用方式其实抖音是知道的

    如果是直接把SO拿出来调用,得到的跟APP里面得出的是不一致的。

    进一步验证,我把cms的接口都HOOK住。然后看顺序。

    输出结果如下

    decode:0404001000018b386ff8b154ff4fc10cf79d74bca55d75398ee0
    decode:5dfc13b6e9b1a8131ec9fe3546ce6e4900000000000000000000000000000000435be92aa3259d3fdbed7d341f16d2da00000000000000000000000000000000
    decode:040400100001d956086cf8e14b01c10cf79d74bca55d75394ea6
    decode:153a6e2fbe986c0472603ddb349fd95d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    decode:0404001000019bde7af5f8e14bc33736dad874bca55d75395665
    decode:f3e0258d2bb713f718dd8a335109228a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    decode:040400100001b6b912a1f8e14bc33736dad874bca55d753956d1
    decode:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    decode:0404001000014d6de9baf8e14bc33736dad874bca55d7539560e
    decode:153a6e2fbe986c0472603ddb349fd95d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    decode:0404001000019bde7af5f8e14bc33736dad874bca55d7539d66d
    decode:153a6e2fbe986c0472603ddb349fd95d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    decode:0404001000019bde7af5f8e14bc33736dad874bca55d7539d66d
    decode:18cb57ab5a5e6c4e281a59e850958c6614e1e5f771c631bc1195c3725673279c435be92aa3259d3fdbed7d341f16d2da00000000000000000000000000000000

    调用了META接口之后,XG有明显的变化。在经过234编号后就无明显变化。

    XG的计算不单纯是简单的几个参数串在一起调用SO就完事的。

    我为了严谨再次确认,从软件启动的时候每隔3秒调用一次。输出如下。

    ‘ * “0404d07100019a0e1440e23f320ce4a518a2316455f6681c77ff|1595258812”
    ‘ * “0404d07100019a0e1440e23f320ce4a518a2316455f6681cb7f3|1595258815”
    ‘ * “0404d07100019a0e1440e23f320ce4a518a2316455f6681c0918|1595258818”
    ‘ * “0404f871000116414c1cb5ff90d058381eac0ff8b86f5b6cf841|1595258821”
    ‘ * “0404c0fa0001b283c4aa6d8371ce4786276f68d39bbfbe3ff76b|1595258824”
    ‘ * “04047847000199e497dc87cc722beb6b04bec1dc480ba39ce3b6|1595258827”
    ‘ * “04040000000116faf9c9565f3c17c9e2a8d723bfb55edbb34c29|1595258830”
    ‘ * “04040000000116faf9c9565f3c17c9e2a8d723bfb55edbb3b4a6|1595258833”
    ‘ * “04040000000116faf9c9565f3c17c9e2a8d723bfb55edbb314ac|1595258836”
    ‘ * “04040000000116faf9c9565f3c17c9e2a8d723bfb55edbb324af|1595258840”
    ‘ * “04040000000116faf9c9565f3c17c9e2a8d723bfb55edbb3e4a3|1595258843”
    ‘ * “04040000000116faf9c9565f3c17c9e2a8d723bfb55edbb344a9|1595258846”
    ‘ * “04040000000116faf9c9565f3c17c9e2a8d723bfb55edbb3b866|1595258849”
    ‘ * “04040000000116faf9c9565f3c17c9e2a8d723bfb55edbb3186c|1595258852”
    ‘ * “04040000000116faf9c9565f3c17c9e2a8d723bfb55edbb3d860|1595258855”
    ‘ * “04040000000116faf9c9565f3c17c9e2a8d723bfb55edbb3686b|1595258858”

    可以知道,设备注册出来不可用,跟很多因素都有关系,环境信息,设备信息 已经前面的xg,以及xlog风控算法的支持等等。

    关于设备注册出来不可用,或者可用率很低,以及设备被封禁不出数据,设备激活等等解决方案在这里不在多说,如果需要解决方案的详细信息,可与我联系!

    展开全文
  • 抖音设备注册算法实现(二)

    千次阅读 2020-06-21 02:27:24
    抖音设备注册算法是在native层,无法通过反编译dex获取到具体算法实现,设备注册大概逻辑是: 1、将传入参数转成byte数组; 2、对传入参数进行GZIP压缩; 3、对压缩后的byte数组进行加密处理; 4、请求官方接口...

    前言:

            抖音APP升级比较快,最近利用空闲时间又研究了一番设备注册算法,过程比较痛苦,反编译、逆向、对拍...等过程绞尽脑汁,不过最终还是搞定了(手动高兴一波)!

    “众所周知”:

            抖音设备注册算法是在native层,无法通过反编译dex获取到具体算法实现,设备注册大概逻辑是:

    1、将传入参数转成byte数组;

    2、对传入参数进行GZIP压缩;

    3、对压缩后的byte数组进行加密处理;

    4、请求官方接口:https://log.snssdk.com/service/2/device_register

    具体实现如下:

    测试一下看看结果:

    OK,没问题,可以用!

    我对返回的结果做了进一步封装,以便不同场景使用到不同的字段。我的微:YY_yhzf,欢迎来撩。。

    展开全文
  •  抖音APP刚安装到手机上,再打开是都会自动请求API进行设备注册,抓到注册的包并进行分析,抓包数据如下: POST /service/2/device_register/?ac=wifi&channel=wandoujia_aweme2&aid=1128&app_name=aweme&...
  • 抖音设备注册算法

    2021-01-10 23:39:26
    抖音APP刚安装到手机上,再打开是都会自动请求API进行设备注册,抓到注册的包并进行分析,抓包数据如下: POST /service/2/device_register/?ac=wifi&channel=wandoujia_aweme2&aid=1128&app_name=...

    第一步:抓包

        抖音APP刚安装到手机上,再打开是都会自动请求API进行设备的注册,抓到注册的包并进行分析,抓包数据如下:
    
    POST /service/2/device_register/?ac=wifi&channel=wandoujia_aweme2&aid=1128&app_name=aweme&version_code=750&version_name=7.5.0&device_platform=android&ssmix=a&device_type=HWI-AL00&device_brand=HUAWEI&language=zh&os_api=28&os_version=9&uuid=868793039197273&openudid=9ba4839bf09a1834&manifest_version_code=750&resolution=1080*2160&dpi=480&update_version_code=7502&_rticket=1585398980154&app_type=normal&mcc_mnc=46001&ts=1585398980&tt_data=a HTTP/1.1
    

    body:加密后的数据
    这是抖音设备注册接口,接口最重要的信息放在了body里面,body是经过加密后得到的。

    二、分析:

    body未加密前的参数其实主要就三个:udid、openudid、mc,至于这三个参数值是怎么生成的,其实不难。 三个参数拿到后,进一步计算并进行gzip压缩,然后放在body内请求API即可完成设备的注册。

    三、业务代码

    import uuid
    import json
    import base64
    import device_register as devreg
    #from flask import Flask
    from flask import Flask,jsonify,request,make_response,abort
    
    app = Flask(__name__)
    
    # 注册加密body
    @app.route('/encrypt', methods=['POST'])
    #@app.route('/register/<user>',methods=['POST'])  
    def body_encrypt():
        data = request.get_data()
        json_data = json.loads(data.decode("utf-8"))
        #print(json_data)
        data = devreg.TT_encrypt(json.dumps(json_data))
        # 返回加密数据
        return data
    
    
    # 注册解密body
    @app.route('/dencrypt', methods=['POST'])
    #@app.route('/register/<user>',methods=['POST'])  
    def body_dencrypt():
        data = request.get_data()
        #json_data = json.loads(data.decode("utf-8"))
        #print(json_data)
        data = devreg.TT_decrypt(data)
        # 返回加密数据
        return data
    
    
    
    # 注册设备id
    @app.route('/reg', methods=['POST'])
    #@app.route('/register/<user>',methods=['POST'])  
    def reg_uuid():
        myuuid = str(uuid.uuid4())
        openudid = '93ac3401e7d34b21'
        data = request.get_data()
        json_data = json.loads(data.decode("utf-8"))
        data = devreg.TT_encrypt(json.dumps(json_data))
    
        url = 'https://log.snssdk.com/service/2/device_register/?mcc_mnc=46000&ac=wifi&channel=aweGW&aid=1128&app_name=aweme&version_code=100&version_name=10.0.0&device_platform=android&ssmix=a&device_type=SM-G925F&device_brand=samsung&language=zh&os_api=22&os_version=5.1.1&uuid=' + myuuid + '&openudid=' + openudid + '&manifest_version_code=880&resolution=720*1280&dpi=192&update_version_code=8802&_rticket=1610172967141&tt_data=a&config_retry=b'
        r = devreg.s.post(url=url, data=data)
        # 向客户端返回响应数据
        return r.text
    
    if __name__=='__main__':
        app.run(host='0.0.0.0',port='8888')
    

    四、注册结果

    {"new_user":1,"device_token":"AAA5600009909AKJAAIJKSJKJK099023899821388908890888890KKJKYJHNKHKYHUNK767556556556565JJLKLKML","server_time":1710292708,"device_id":5057506557506,"install_id":f3365b81e5f6e5f6,"device_id_str":"5057506557506","install_id_str":"f3365b81e5f6e5f6","open_udid":"9a9ebc992708","cdid":"17af3c9a-5359-11eb-b3a2-f3365b81e5f6","macaddr":"88:77:77:56:91:12"}
    
    展开全文
  • 浅谈安卓抖音协议, 抖音设备注册

    千次阅读 2020-12-07 09:31:42
    那么回到今天的话题,抖音设备如何注册其实网上已经有公开的资料的确可行,咱们老生常谈,简单的聊一下思路逻辑一:首先通过抓包找到接口地址http://log.snssdk.com/service/2/device_register二:通过JDAX对源...

    短视频、直播数据服务,请查看文档: TitoData
    免责声明:本文档仅供学习与参考,请勿用于非法用途!否则一切后果自负。
    文章来源于互联网,非原创,若侵权,请私信联系我们处理。


    抖音最近加入了风控,大大限制了数据拉取的成功度,处理这个问题很棘手,具体自己探索。
    同时抖音加强了对SO的加密,即使修复ida堆栈,也是jumpout,大大提升了代码追踪的繁琐度,所以最新版的SO还没有深入跟进分析。

    那么回到今天的话题,抖音的设备如何注册
    其实网上已经有公开的资料
    的确可行,咱们老生常谈,简单的聊一下思路逻辑
    一:首先通过抓包找到接口地址
    http://log.snssdk.com/service/2/device_register
    二:通过JDAX对源代码的分析,我们可以发现它
    image.png
    先通过GZIP压缩,再TTEncryptUtils加密,最后POST发送出去请求
    然后X-SS-STUB,发现它只是一个对post的body部分的md5

    三:最后我们可以拼装属于自己的请求包



    ——————————————————————————————————————————

    展开全文
  • 抖音x-Gorgon,抖音did,iid设备注册,快手sig,快手did设备注册算法版, 测试地址:http://yinbai.icu:6001 仅做学习之用,若有侵权请联系删除。
  • 抖音设备注册device_register签名加密流程device_id,iid,install_id 接口:/service/2/device_register/ 抖音生成设备id算法 获取device_id有几个重点: (1) carrier、display_name字段:这个字段不是utf-8编码,是...
  • 了解到前一段时间,火山小视频升级为了抖音火山版,想必其相应的安全措施也升级了吧,笔者本着学术交流的目的研究了一下抖音火山版的设备注册方法,也就是生成device_id与iid(install_id)的过程。从而找到了如何...
  • 那么回到今天的话题,抖音设备如何注册其实网上已经有公开的资料的确可行,咱们老生常谈,简单的聊一下思路逻辑一:首先通过抓包找到接口地址http://log.snssdk.com/service/2/device_register二:通过JDAX对源...
  • 文章仅提供思路,千里之行,还要靠各位自己努力,不喜勿看。 抖音最近加入了风控,大大...那么回到今天的话题,抖音设备如何注册 其实网上已经有公开的资料 的确可行,咱们老生常谈,简单的聊一下思路逻辑 ...
  • 今日实现了120601版本(貌似9月初发布)的Xgorgon加签及设备注册的加密。通过Xgorgon可正常爬取到数据,通过设备信息的加密可注册到新的设备号(device_id)。 一、反编译APK(Xgorgon) 1、jadx打开apk并搜索x...
  • 抖音通信协议的加密算法是目前最完善的了,一些关键函数都被VM混淆过 ,比如设备注册、视频信息等常用接口,只能通过动态调试跟踪去理解其过程。 我们先来分析一下常用的设备注册是如何生成的,这是请求抖音接口的第...
  • 一部手机一个设备能不能登录多个抖音号? 一个抖音号可不可以在多个手机上登录?  一部手机登录多个抖音号会有什么后果? 这是做抖音的新手经常会问的问题!...这里的关键点就是同一设备注册几个抖音号的问
  • 抖音版本里面加了好几个算法...最近搞出开了04的算法,xlog,设备注册算法激活。feed算法等。 费了很大的功夫, xgorgon的算法在libcms.so中,在JNI_Onload中动态注册jni函数。 算法用ollvm混淆了,主要是流程平坦化
  • 今日实现了120601版本(貌似9月初发布)的Xgorgon加签及设备注册的加密。通过Xgorgon可正常爬取到数据,通过设备信息的加密可注册到新的设备号(device_id)。 一、反编译APK(Xgorgon) 1、jadx打开apk并搜索x...
  • 抖音版本里面加了好几个算法,有as,cp(早期就这两个),mas,X-Gorgon,X-SS-STUB算法,很多关键key之间有相互关联,只要有一个环节算错了,就会请求不到数据。目前版本的抖音加了很多的验证,及代码混淆,难度偏大。...
  • 具体接口具体分析 三、 接口使用方法:http://yinbai.icu:6001(有示例) 直接访问接口有示例,可以获得x-gorgon以及设备注册did,iid等信息。 四、 如有兴趣的技术同学可一起讨论学习,q:1178776532 此贴存粹技术...
  • xlog主要是搜集环境信息参数,例如经纬度,设备信息、cpumacwifi等信息,组成一个json串然后调用data加密传到服务器进行分析比对。来分析此账号是否正常,决定了账号能否正常点赞关注出数据等风控!(xlog...
  • 与X-Gorgon算法和设备注册服务的不同,他主要是搜集环境信息参数包括一些检测点,组成一个json串然后调用data加密传到服务器进行分析比对。我们抓包可以看到一条url为/v2/r?,POST包,其body体为加密函数,加密过程VM...
  • 如已安装过抖音, 需重置模拟器才可抓到包, 刚打开抖音即可抓到注册设备号的数据包 数据包截图 选项 解释 请求方式 POST 请求体 加密数据包 返回数据 设备号信息 (主要参数 : device_id和install_id) ...
  • 抖音xlog算法解密过程

    千次阅读 2020-08-08 22:15:41
    设备注册算法 登录注册算法 xg算法 xlog算法 xlog解密 今天,我们来看下xlog算法,xlog算法是抖音对于风控数据提交的算法,也叫设备解锁算法,我们根据抖音最新的12.0.1版本进行逆向,解密xlog接口的数据后,发现...
  • 今天有空分享一下抖音的加密算法,作为拥有庞大用户量的App,其通信协议加密的强度肯定是不弱的,关键算法被VM,只能动态分析去理解。我们通过抓包分析,请求的url上带有as、cp两个加密字段,这两个字段是早期版本...
  • 最近有好多小伙伴私信问我抖音不管做什么都显示频繁,问我解决办法是什么,我在这里给大家统一回答一下。------------------朴素的分割线--------------如果出现以上情况,主要问题分为3点1.ip(占比百分之70)2....
  • 抖音xlog算法解析

    千次阅读 2019-12-10 16:58:39
    与X-Gorgon算法和设备注册服务的不同,他主要是搜集环境信息参数包括一些检测点,组成一个json串然后调用data加密传到服务器进行分析比对。我们抓包可以看到一条url为/v2/r?,POST包,其body体为加密函数,加密过程VM...
  • 1、抖音爬虫基础分析

    2020-10-27 11:55:46
    抖音爬虫基础分析背景步骤1、抓包2、x-gorgon加签3、注册设备4、xlog上报位置如何插入一段漂亮的代码片 背景 目前抖音达人数量繁多,带货能力良莠不齐。帮助商家寻找达人帮忙带货,如果没有数据的支撑很容易被坑,...

空空如也

空空如也

1 2
收藏数 38
精华内容 15
关键字:

抖音设备注册