迅雷协议分析

来源:互联网 发布:linux opengl 安装 编辑:程序博客网 时间:2024/06/05 11:43
迅雷协议分析
10-23 17:00 来源: 作者: 【大 中 小】 评论:0 条 浏览:695

迅雷登陆验证
<--TCP!来源标识.Data(53 Bytes)
00 00 00 35 00 00 00 4d 00 00 .........5...M..
0040 00 4d 00 00 00 24 65 30 31 37 39 34 64 63 2d 33 .M...$e01794dc-3
0050 61 36 62 2d 34 32 39 39 2d 39 64 33 61 2d 37 38 a6b-4299-9d3a-78
0060 36 66 64 33 39 36 65 61 39 36 00 6fd396ea96.

迅雷数据包结构
00 00 00 35 数据包长度
00 00 00 4d 将要发送的'发送验证信息.Data'数据包的长度
00 00 00 4d 将要发送的'发送验证信息.Data'数据包的长度
00 00 00 24 标识串长度-1(末位的空字节)
65 30 31 ... 39 36 00 标识串.这个字符串每次程序启动后不一样,程序重新启动前一直沿用.与用户标识无关


<--TCP!发送验证信息.Data(77 Bytes)
00 00 00 0e 00 00 00 05 00 00 ................
0040 00 41 00 00 00 0b 51 55 45 52 59 41 55 54 48 45 .A....QUERYAUTHE
0050 4e 00 00 00 00 09 6d 61 78 6c 65 76 65 6c 34 00 N.....maxlevel4.
0060 00 00 20 30 34 62 64 64 64 31 37 63 31 36 33 32 .. 04bddd17c1632
0070 37 35 38 39 63 65 33 66 65 65 30 65 34 31 39 62 7589ce3fee0e419b
0080 36 33 33 633

迅雷TCP数据包结构
00 00 00 0e 未知,固定不变(猜测与版本有关,未经验证)
00 00 00 03 程序启动时初始化为0,第一次用户登陆+3,其余每次用户登陆+4
00 00 00 41 下面的数据长度
00 00 00 0b 标识"QUERYAUTHEN"的长度-1(末位的空字节)
51 55 45 52 59 41 55 54 48 45 4e 00 标识"QUERYAUTHEN"
00 00 00 09 用户名长度
6d 61 78 6c 65 76 65 6c 34 用户名
00 00 00 20 密码hash的长度
30 34 62 ... 36 33 33 密码的hash
--登陆验证END

维持用户在线状态
<--UDP!Data(73 Bytes)
00 00 00 0e 00 00 .|.S.8.Q.'......
0030 00 07 00 00 00 3d 00 00 00 04 50 49 4e 47 00 00 .....=....PING..
0040 00 08 33 39 32 36 36 39 38 37 00 00 00 24 37 61 ..39266987...$7a
0050 66 61 33 38 30 66 2d 34 32 36 37 2d 34 35 39 61 fa380f-4267-459a
0060 2d 39 62 30 31 2d 66 30 39 35 63 37 36 37 61 30 -9b01-f095c767a0
0070 37 32 00 72.

迅雷UDP数据包结构
00 00 00 0e 未知,固定不变(猜测与版本有关,未经验证)
00 00 00 07 所发送的此数据包的计数
00 00 00 3d 后面的数据长度
00 00 00 04 标识"PING"的长度
50 49 4e 47 标识"PING"
00 00 00 08 用户id长度
33 39 32 36 36 39 38 37 用户id字符串
00 00 00 24 标识串长度-1(末位的空字节)
37 61 66 ... 37 32 00 标识串
--维持用户在线状态END

迅雷下载文件后加积分
<--TCP!来源验证.Data(53 Bytes)
00 00 00 35 00 00 00 39 00 00 Dp.......5...9..
0040 00 39 00 00 00 24 64 34 38 62 36 63 31 33 2d 38 .9...$d48b6c13-8
0050 62 62 34 2d 34 34 39 38 2d 38 65 36 31 2d 32 37 bb4-4498-8e61-27
0060 31 36 35 66 35 66 65 63 35 38 00 165f5fec58.

数据包结构
00 00 00 35 数据包长度
00 00 00 39 将要发送的'下载加积分.Data'数据包的长度
00 00 00 39 将要发送的'下载加积分.Data'数据包的长度
00 00 00 24 标识串长度
64 34 38 ... 35 38 00 标识串

<--TCP!下载加积分.Data(57 Bytes)
00 00 00 0e 00 00 00 0f 00 00 Dp..............
0040 00 2d 00 00 00 0d 51 55 45 52 59 44 4f 57 4e 4d .-....QUERYDOWNM
0050 45 53 53 00 00 00 08 33 38 39 32 33 37 37 32 00 ESS....38923772.
0060 00 00 00 00 72 7e 98 00 00 00 00 00 00 01 54 ....r~........T

数据包结构
00 00 00 0e 未知,固定不变(猜测与版本有关,未经验证)
00 00 00 0f 程序启动时初始化为0.每个用户登陆后下载完第一个文件+5,第一个以后的文件+1.换其他用户登陆,也是下载完第一个文件+5,后面的+1.用户注销后再登陆的情况下下载完第一个也+5
00 00 00 2d 以下数据的长度
00 00 00 0d "QUERYDOWNMESS"的长度
51 55 45 52 59 44 4f 57 4e 4d 45 53 53 "QUERYDOWNMESS"
00 00 00 08 用户id("38923772")的长度
33 38 39 32 33 37 37 32 用户id("38923772")
00 00 00 00 00 72 7e 98 所下载完的文件的hash
00 00 00 00 00 00 01 54 未知,但不像是随机
--下载文件后加积分END

注销迅雷
<--TCP!来源验证.Data(53 Bytes)
00 00 00 35 00 00 00 2b 00 00 .........5...+..
0040 00 2b 00 00 00 24 31 32 63 39 32 61 34 62 2d 34 .+...$12c92a4b-4
0050 64 36 66 2d 34 61 62 64 2d 61 66 65 62 2d 37 31 d6f-4abd-afeb-71
0060 37 63 39 39 33 62 32 62 35 34 00 7c993b2b54.

数据包结构
00 00 00 35 此数据包长度
00 00 00 2b 将要发送的'下载加积分.Data'数据包的长度
00 00 00 2b 将要发送的'下载加积分.Data'数据包的长度
00 00 00 24 标识串长度
31 32 63 ... 35 34 00 标识串

<--TCP!发送注销信息.Data(43 Bytes)
00 00 00 0e 00 00 00 05 00 00 ................
0040 00 1f 00 00 00 0b 51 55 45 52 59 4c 4f 47 4f 55 ......QUERYLOGOU
0050 54 00 00 00 08 32 32 39 30 30 31 35 37 00 00 00 T....22900157...
0060 00 .

数据包结构
00 00 00 0e 未知,固定不变(猜测与版本有关,未经验证)
00 00 00 05 程序启动时初始化为0,第一次用户注销后+5,其余每次有用户注销则+4
00 00 00 1f 以下数据的长度
00 00 00 0b 标识"QUERYLOGOUT"的长度
51 55 45 52 59 4c 4f 47 4f 55 54 标识"QUERYLOGOUT"
00 00 00 08 用户id的长度
32 32 39 30 30 31 35 37 用户id
00 00 00 00 空
--注销END

其中上面列出来的第一个数据包中密码hash看似是md5,直接把我的密码的md5算出来对比了一下,不一样,那就跟一下吧,打开od,立马定位到这里

215C4D60 > $ 55 push ebp
215C4D61 . 8BEC mov ebp, esp
215C4D63 . 6A FF push -1
215C4D65 . 68 85C65E21 push <loc_215EC685> ; SE handler installation
215C4D6A . 64:A1 0000000>mov eax, dword ptr fs:0
215C4D70 > . 50 push eax
215C4D71 . 64:8925 00000>mov dword ptr fs:0, esp
215C4D78 . 81EC B8080000 sub esp, 8B8
215C4D7E . 53 push ebx
215C4D7F . 56 push esi
215C4D80 > . 57 push edi
215C4D81 . 8BD9 mov ebx, ecx
215C4D83 . 8965 F0 mov dword ptr ebp-10, esp
215C4D86 . 895D E0 mov dword ptr ebp-20, ebx
215C4D89 . 8B75 08 mov esi, dword ptr ebp+8
215C4D8C . 33C0 xor eax, eax
215C4D8E 89 db 89
215C4D8F . 45 inc ebp
215C4D90 > . FC cld
215C4D91 . 8945 EC mov dword ptr ebp-14, eax
215C4D94 . 8973 24 mov dword ptr ebx+24, esi
215C4D97 . 8A06 mov al, byte ptr esi
215C4D99 . 84C0 test al, al
215C4D9B . C645 FC 01 mov byte ptr ebp-4, 1
215C4D9F . 0F85 8C010000 jnz <loc_215C4F31>
215C4DA5 . 8D8D 3CF7FFFF lea ecx, dword ptr ebp-8C4
215C4DAB . E8 90E80000 call <sub_215D3640>
215C4DB0 . B9 08000000 mov ecx, 8
215C4DB5 . 33C0 xor eax, eax
215C4DB7 . 8DBD 7CFFFFFF lea edi, dword ptr ebp-84
215C4DBD . 8B53 24 mov edx, dword ptr ebx+24
215C4DC0 . F3:AB rep stos dword ptr es:edi
215C4DC2 . 66:AB stos word ptr es:edi
215C4DC4 . AA stos byte ptr es:edi
215C4DC5 . 8B7A 38 mov edi, dword ptr edx+38
215C4DC8 . B9 32000000 mov ecx, 32
215C4DCD . 2BCF sub ecx, edi
215C4DCF . 33C0 xor eax, eax
215C4DD1 . 8D7C3A 3C lea edi, dword ptr edx+edi+3C
215C4DD5 . 8BD1 mov edx, ecx
215C4DD7 . C1E9 02 shr ecx, 2
215C4DDA . F3:AB rep stos dword ptr es:edi
215C4DDC . 8BCA mov ecx, edx
215C4DDE . C645 FC 02 mov byte ptr ebp-4, 2
215C4DE2 . 83E1 03 and ecx, 3
215C4DE5 . F3:AA rep stos byte ptr es:edi
215C4DE7 . 8B53 24 mov edx, dword ptr ebx+24
215C4DEA . B9 32000000 mov ecx, 32
215C4DEF . 33C0 xor eax, eax
215C4DF1 . 8B7A 02 mov edi, dword ptr edx+2
215C4DF4 . 2BCF sub ecx, edi
215C4DF6 . 8D7C3A 06 lea edi, dword ptr edx+edi+6
215C4DFA . 8BD1 mov edx, ecx
215C4DFC . C1E9 02 shr ecx, 2
215C4DFF . F3:AB rep stos dword ptr es:edi
215C4E01 . 8BCA mov ecx, edx
215C4E03 . 83E1 03 and ecx, 3
215C4E06 . F3:AA rep stos byte ptr es:edi
215C4E08 . 8D46 3C lea eax, dword ptr esi+3C
215C4E0B . 8D8D 3CF7FFFF lea ecx, dword ptr ebp-8C4
215C4E11 . 50 push eax ; 用户密码
215C4E12 . E8 D9E80000 call <sub_215D36F0> ; 跟入

跟入后来到这里

215D36F0 >/$ 56 push esi
215D36F1 |. 8BF1 mov esi, ecx
215D36F3 |. E8 28000000 call <sub_215D3720>
215D36F8 |. 84C0 test al, al
215D36FA |. 75 09 jnz short <loc_215D3705>
215D36FC |. 6A 01 push 1
215D36FE |. 8BCE mov ecx, esi
215D3700 |. E8 4B0C0000 call <sub_215D4350>
215D3705 >|> 8B4424 08 mov eax, dword ptr esp+8
215D3709 |. 8BCE mov ecx, esi
215D370B |. 50 push eax
215D370C |. E8 AF0B0000 call <sub_215D42C0> ; 跟入
215D3711 |. 5E pop esi
215D3712 . C2 0400 retn 4

跟到这里

215D42C0 >/$ 53 push ebx
215D42C1 |. 55 push ebp
215D42C2 |. 56 push esi
215D42C3 |. 8B7424 10 mov esi, dword ptr esp+10
215D42C7 |. 8BD9 mov ebx, ecx
215D42C9 |. 57 push edi
215D42CA |. 8BFE mov edi, esi
215D42CC |. 83C9 FF or ecx, FFFFFFFF
215D42CF |. 33C0 xor eax, eax
215D42D1 |. F2:AE repne scas byte ptr es:edi
215D42D3 |. F7D1 not ecx
215D42D5 |. 49 dec ecx
215D42D6 |. 8BD1 mov edx, ecx
215D42D8 |. 8BC2 mov eax, edx
215D42DA |. 8BEA mov ebp, edx
215D42DC |. C1E8 06 shr eax, 6
215D42DF |. 83E5 3F and ebp, 3F
215D42E2 |. 895424 14 mov dword ptr esp+14, edx
215D42E6 |. 85C0 test eax, eax
215D42E8 |. 76 19 jbe short <loc_215D4303>
215D42EA |. 8BF8 mov edi, eax
215D42EC >|> 8BCB /mov ecx, ebx
215D42EE |. E8 EDF4FFFF |call <sub_215D37E0>
215D42F3 |. 8B4B 64 |mov ecx, dword ptr ebx+64
215D42F6 |. 83C1 40 |add ecx, 40
215D42F9 |. 4F |dec edi
215D42FA |. 894B 64 |mov dword ptr ebx+64, ecx
215D42FD |.^ 75 ED jnz short <loc_215D42EC>
215D42FF |. 8B5424 14 mov edx, dword ptr esp+14
215D4303 >|> 8B7B 68 mov edi, dword ptr ebx+68
215D4306 |. B9 10000000 mov ecx, 10
215D430B |. 33C0 xor eax, eax
215D430D |. F3:AB rep stos dword ptr es:edi
215D430F |. 8B7B 68 mov edi, dword ptr ebx+68
215D4312 |. 8BCD mov ecx, ebp
215D4314 |. 8BC1 mov eax, ecx
215D4316 |. C1E9 02 shr ecx, 2
215D4319 |. F3:A5 rep movs dword ptr es:edi, dword p>
215D431B |. 8BC8 mov ecx, eax
215D431D |. 83E1 03 and ecx, 3
215D4320 |. F3:A4 rep movs byte ptr es:edi, byte ptr>
215D4322 |. 8B4B 68 mov ecx, dword ptr ebx+68
215D4325 |. C1E2 03 shl edx, 3
215D4328 |. C60429 80 mov byte ptr ecx+ebp, 80
215D432C |. 8B43 68 mov eax, dword ptr ebx+68
215D432F |. 8BCB mov ecx, ebx
215D4331 |. 8950 38 mov dword ptr eax+38, edx
215D4334 |. C740 3C 00000>mov dword ptr eax+3C, 0
215D433B |. E8 A0F4FFFF call <sub_215D37E0> ; 这里就是关键的md5了
215D4340 |. 8BCB mov ecx, ebx
215D4342 |. E8 89000000 call <sub_215D43D0>
215D4347 |. 5F pop edi
215D4348 |. 5E pop esi
215D4349 |. 5D pop ebp
215D434A |. B0 01 mov al, 1
215D434C |. 5B pop ebx
215D434D . C2 0400 retn 4

返回到最早跟入的那里继续

215C4E17 . 8D8D 3CF7FFFF lea ecx, dword ptr ebp-8C4
215C4E1D . E8 7EF40000 call <sub_215D42A0>
215C4E22 . 6A 20 push 20 ; /maxlen = 20 (32.)
215C4E24 . 8D8D 7CFFFFFF lea ecx, dword ptr ebp-84 ; |
215C4E2A . 50 push eax ; |src 这里是刚才md5后的字符串
215C4E2B . 51 push ecx ; |dest
215C4E2C . FF15 D4015F21 call dword ptr <&MSVCRT.strncpy> ; strncpy 保存一遍
215C4E32 . 83C4 0C add esp, 0C
215C4E35 . 8D8D F4F9FFFF lea ecx, dword ptr ebp-60C
215C4E3B . E8 00E80000 call <sub_215D3640>
215C4E40 . 8D95 7CFFFFFF lea edx, dword ptr ebp-84
215C4E46 . 8D8D F4F9FFFF lea ecx, dword ptr ebp-60C
215C4E4C . 52 push edx
215C4E4D . C645 FC 03 mov byte ptr ebp-4, 3
215C4E51 . E8 9AE80000 call <sub_215D36F0> ; 对第一次md5的结果再次md5
215C4E56 . B9 08000000 mov ecx, 8
215C4E5B . 33C0 xor eax, eax
215C4E5D . 8DBD 7CFFFFFF lea edi, dword ptr ebp-84
215C4E63 . F3:AB rep stos dword ptr es:edi
215C4E65 . 66:AB stos word ptr es:edi
215C4E67 . 8D8D F4F9FFFF lea ecx, dword ptr ebp-60C
215C4E6D . AA stos byte ptr es:edi
215C4E6E . E8 2DF40000 call <sub_215D42A0>
215C4E73 . 6A 20 push 20 ; /maxlen = 20 (32.)
215C4E75 . 50 push eax ; |src
215C4E76 . 8D85 7CFFFFFF lea eax, dword ptr ebp-84 ; |
215C4E7C . 50 push eax ; |dest
215C4E7D . FF15 D4015F21 call dword ptr <&MSVCRT.strncpy> ; strncpy 到这里为止密码的hash就出来了



SKYPE协议分析

10-23 12:45 来源: 作者: 【大 中 小】 评论:0 条 浏览:778
1、概述
  Skype是由Kazaa于2003年发明的基于P2P技术的VoIP客户端,用户可以通过Skype通过互联网进行语音和文本的传输。Skype的通讯协议是不公开的,而且通讯内容是加过密的,哥伦比亚大学的Baset和Schulzrinne完全在实验的基础上对Skype的通讯机制进行分析,通过分析得出的结论主要有三个:
   (1)Skype的通话质量较MSN和Yahoo的即时通信工具要好;
  (2)可以无缝的在NATs和防火墙后使用;
  (3)安装使用起来非常简单。
  2、Skype的网络结构
  Skype的节点有两种:客户端(ordinary node)和超级节点(supernode,SN)。客户端必须链接到超级节点,并且在Skype的中央服务器登录。中央服务器保存用户的用户名和密码,完成登录的认证工作。图1中的小黑点是客户端,大黑点是超级节点(用于为其它客户端提供登录跳板及广播服务),灰色的点是Skype的登录服务器。
  Skype可以看作是一个叠加在互联网之上的网络。与以往MSN等IM工具最大的不同在于其除了用户登录,其余工作基本不依赖中央服务器。 Skype在穿透防火墙通讯时完全使用了Peer toPeer,而没用到中央服务器。每一个客户端都维护一个可以到达的主机列表(host cache,HC),包括其IP地址和端口号。
          Skype的网络结构 
  用户下载安装完Skype后,Skype客户端会发送一段HTTP 1.1的请求到中央服务器,告诉它我装完了一个什么样的版本,服务器会返回一个200 OK的信息。客户端会进行登录初始化工作,针对三种不同类型的网络情况有三种不同的登录方式:
  (1)直接有公众网的IP
  (2)在内部网,可以通过TCP访问外部网络
  (3)在内部网,但只能通过有限的几个端口(例如80和443)访问外部网络
  Skype在登录的时候会先使用UDP请求HC中的IP,如果不行,就用TCP请求HC中的IP及端口,如果还不行。就用TCP请求HC中的IP及80端口,如果又不行,就再请求HC中的IP及443端口。如果这时候还不行,那就登录不了了。整个过程中传输的数据量大概在8k-10k,持续的时间在3至35秒。
  3、Skype的主要组成部分
  3.1 端口
  在Skype的连接属性对话框中可以设置监听的端口号,在安装的时候Skype会随机的选择一个端口作为监听的端口,这一点与HTTP协议等不同,Skype没有默认的服务端口。同时,它还会打开对80和443端口的监听。80是常见的HTTP服务默认端口,而443则是HTTPS服务的默认端口。
  3.2 主机列表
  这里的主机指的是可以提供跳板及广播服务的SN的IP地址和端口号,这是Skype最重要的部分之一,HC中至少要有一个可用的主机地址和端口号。通常它被存储在注册表里的HKEY_CURRENT_USER/SOFTWARE/Skype/PHONE/LIB/CONNEC-TION/HOSTCACHE中。一般情况下,在Skype运行两天后,HC中的SN地址及对应的端口号会达到约200个。
  3.3 编解码器
  Skype采用了iLBC、iSAC和一个保密的编解码器,能够对50-8,000Hz范围内的语音信号进行编码。Global IPSound已经实现了iLBC和iSAC编解码器,其网站表明了Skype是他们的合作伙伴。由此来看Skype应该是使用了Global IPSound的编解码器实现的语音通讯。
  3.4 好友列表
  Skype的好友列表没有保存在服务器上,而是保存在本地的注册表中,并进行了加密。这就使得用户如果更换了另外一台电脑之后需要重新构建好友列表。
  3.5 加密
  Skype使用AES(Advanced Encryption Standard)加密标准,这也是美国政府使用的一个加密标准。Skype采用了256比特加密,可能的密钥有1.1×1077个。
  3.6 NAT与防火墙
  Skype应该是使用了STUN和TURN协议来检测所处的NAT及防火墙环境。Skype定期的刷新这些信息,这些信息也是存储在注册表中的。与另外一个点对点文件共享系统Kazza不同,普通客户端无法阻 止自己成为SuperNode(SN),就是说它随时可能被征用成为别人登录服务和广播服务的提供者,就是类似于BT中的种子提供者的角色。
4Skype的主要功能
  Skype的功能主要可以分为:初始化,登录,用户搜索,呼叫建立与终止,媒体传输和状态消息。
  4.1 初始化
  第一次安装后,Skype会发送一段HTTP 1.1的请求给中央服务器,包括关键字“installed”以及所装Skype的版本号。以后的每次登录Skype都会向中央服务器发送一小段包含关键字“getlatestversion”的HTTP 1.1请求,检查是否有新版本的Skype。

  4.2 登录
  登录是Skype最重要的功能,如图2所示。在这个过程中,Skype终端到登录服务器上验证用户名密码,广播给在线上的好友及其它节点,检查 NAT和防火墙的类型,发现拥有公网IP地址的在线Skype节点,这些新发现的节被用于在所在SuperNode无法使用后继续保持本机与Skype网络的连接。如果HC中所有的节点地址均不可用的话,登录失败。通过分析这些登录失败的过程,我们可以得出一个完整的Skype登录过程:
       Skype的登录过程 
  先发送UDP数据包,如果5秒后没有响应,就用TCP,发送登录请求到目标节点的80端口;如果仍然失败,就通过TCP发送登录请求到443端 口,等待6秒钟,如果仍然失败就显示无法登录。整个的登录过程可以重复4次。连接的对象是保存在本机中HostCache中的节点列表。
  4.3 用户搜索
  S kype使用全球索引(Global Index,GI)技术进行用户搜索,在72小时内登录过的用户,无论是处在公众网还是私有网络中都能找到。客户端可以通过发送TCP包向SC发送请求,也可以通过UDP包向其他SC发送查询请求。SC将结果发回客户端。
  4.4 呼叫建立与终止
  Skype采用了32kbps的语音编码以保证语音质量,其信令通过TCP传递,而语音数据则通过TCP和UDP进行传输,信令和语音数据使用不同的端口号。Skype能够向好友列表中的用户发送呼叫请求。为了保证信令传输的可靠性,信令始终是通过TCP进行的。如果双方都是在公众网中,有独立的公用IP,那么主叫用户和被叫用户通过challenge-response机制直接进行数据交换。如果有一方位于私有网络或者是防火墙之后,那么私有网络一方需要首先同公众网中的至少一个SN建立TCP链接,然后由SN进行数据转发。如果双方都位于私有网络中,那么双方的数据都需要SN进行转发。
  4.5 媒体传输和状态消息
  如果双方都位于公众网中,双方可以使用UDP包直接进行数据交换。Skype的语音数据包的大小一般是67bytes,正好是UDP包的净荷。对于100M bps的以太网来说,每秒可传送140个语音数据包。一般来说,上下行语音传输所需的平均带宽为5kbps。如果有其中一方或者双方都位于私有网络中,就需要通过TCP同SN进行数据交换,由SC充当媒体代理服务器的角色,此时一个语音数据包的大小一般为69 bytes。在可能的情况下,Skype会优先选择UDP协议进行通信。
  5、结束语
  Skype是第一个利用P2P技术进行语音通信的VoIP工具,能够提供较好的通话质量。Skype能够透过防火墙进行无缝通信,安装使用也很简单。随着互联网的不断普及。VoIP技术已经取得了越来越多的应用。有的运营商甚至开始和Skype合作提供语音服务,这是一个新的趋势。如何在新技术不断普及的同时保证运营商在传统通信网络中的核心地位,是一个值得研究的课题。

原创粉丝点击