IPTV包分析

上次我们讲了如何抓取IPTV包,这次我们就来分析一下这些数据包。我们希望可以通过对IPTV包分析来获取下面这些非常有用的信息:1)与DHCP鉴权相关的信息;2)IPTV直播源地址;3)IPTV回看源地址。这次的分析过程我们都将在Windows系统下完成,而且主要会用到WiresharkNotepad++这两个软件工具,如果你的电脑还没有安装这两个软件的话,你需要事先下载并安装好。

注:这次的分析是有一定的局限性的,因为不同的地方、不同的IPTV提供商其“握手”方式、直播源格式等都可能不一样,所以这次分析主要还是提供一种方法,具体实践时你还需要根据自己的实际情况加以灵活应用。

一、获取与DHCP鉴权相关的信息

1、先用Wireshark程序打开前面抓取的IPTV包:

IPTV包分析-1

2、筛选DHCP协议,找出IPTV机顶盒与光猫第一次“握手”时的信息:

IPTV包分析-2

3、选中“DHCP Request”这一行,即“握手”时两条红行之间的这一行,然后点开”Dynamic Host Configuration Protocol (Request)”这一行的下拉箭头,就会发现DHCP鉴权时的所有信息都在里面了:

IPTV包分析-3

4、新建一个空的文本文档,然后将下面的一些信息复制后保存起来,以备后用。

1)Client MAC Address,即机顶盒的MAC地址;

2)DHCP Server Identifier,即Option 54,例如:10.242.96.1;

3)Host Name,即Option 12,是一串很长的字符串,通常是明文传输,所以直接记录就行;

4)Vendor class identifier,即Option 60,是以密码形式传输的一长数据串。选中“Vendor class identifier: ”这一行,点击鼠标右键,点“复制”,再点“…as Hex Stream”复制内容后在文档中保存。

注:有些地方的DHCP”握手“的方式可能更复杂,还会涉及Option 59、Option 61等等,如有必要也一并把它们都记录下来。

5、用IPTV单播地址播放时,我们还必须获取其它需要DHCP鉴权的IP地址。

通常来说,拿到以上DHCP鉴权信息后,我们只要在路由器上做好相应设置,就可以抛开IPTV机顶盒设备,在其它像电脑、手机、网络机顶盒上播放IPTV的组播信号了。但是播放IPTV单播地址时,仅仅以上信息还是不够的,我们还必须获取其它需要DHCP鉴权的IP地址,否则会因为交互过程无法完成,导致单播信号无法传输。

IPTV包分析-4

如何提取其它的IP地址?如上图所示,筛选http协议,然后在列表中选择记录那些与IPTV机顶盒有信息交互的服务端IP地址,例如:122.229.17.132;220.191.136.23;115.233.41.139;115.233.200.101等,统统记录下来,在后续的实际应用中我们设置时要用到这些地址。

二、获取IPTV直播源地址

1、先利用Wireshark程序提取出IPTV直播源列表信息

Wireshark打开IPTV数据包后,按http协议先进行筛选,然后点”查找“按钮,即像放大镜一样的一个图标,在新出现的查找栏中选择”分组列表“、”宽窄“、”字符串“,再输入”getchannellist“进行查找:

IPTV包分析-5

我们再选中从服务器返回机顶盒信息的那一行,即定位行的下一行,然后选中程序中间显示界面栏中的”Line-based text data: text/html (915 lines)“这一行,点击鼠标右键,点击”显示分组字节…“,我们就可以看到完整的直播源列表信息了(注:需要将显示码从“ACSII”变更为”UTF-8“,否则中文字符无法正常显示):

IPTV包分析-6

将所有与直播源列表相关的信息选中后复制备用。

2、通过Notepad++程序整理出IPTV直播源地址

打开Notepad++程序,新建一个文档窗口,然后将上面复制的内容粘贴到新文档中:

IPTV包分析-7

我们可以仔细来看一下里面的直播源信息,它还是非常规整的,有频道名称,有频道地址。频道地址里面igmp://后面显示的是组播地址,rtsp://后面显示的是单播地址,有很长一段,但我们只需要前面到.smil为止的信息即可:

IPTV包分析-8

因为信息都非常规整,所以我们可以采用正则表达式的方法非常方便的提取到所需要的内容。目前直播源地址文件通常采用m3u和txt两种格式,所以我们在提取时也会分别生成这两种文件。

1)提取IPTV组播地址

在Notepad++程序界面点击”替换(R)…”按钮,采用如下正则表达式

^\s+<script>.+?ChannelName=”(.+?)”,.+?ChannelURL=”igmp://(.+?)\|rtsp://.+?”.+?</script>\s+$

>> 需要生成m3u格式直播源文件,则替换成:

#EXTINF:-1,\1\nrtp://\2

IPTV包分析-9

>> 需要生成txt格式直播源文件,则替换成:

\1,rtp://\2

注:细心的朋友可能已经发现,我把原直播源信息中的组播地址从“igmp://”换成了“rtp://”,原因很简单因为在实际测试发现直接用igmp://无法播放,用rtp://则可以,而不同的地方需要换的协议可能还不一样,大家可以多试试就会发现正确的了。

2)提取IPTV单播地址

在Notepad++程序界面点击”替换(R)…”按钮,采用如下正则表达式

^\s+<script>.+?ChannelName=”(.+?)”,.+?ChannelURL=”.+?\|(.+?)\?rrsip=.+?”.+?</script>\s+$

>> 需要生成m3u格式直播源文件,则替换成:

#EXTINF:-1,\1\n\2

>> 需要生成txt格式直播源文件,则替换成:

\1,\2

IPTV包分析-10

提取完成后,分别按不同格式进行保存即可使用。

三、获取IPTV回看源地址

目前的IPTV机顶盒除了看直播节目外,大多也提供了回看功能,像电信和移动,都提供一星期的节目回看功能,那我们怎么来获取IPTV的回看地址呢?首先你需要在抓取IPTV包时,在机顶盒上操作一下你想提取回看源地址的节目的回看功能,例如你想提取CCTV1的回看源地址,你可以在抓取时回看一下CCTV1的节目。如果你想提取多个节目的回看源地址,那你就需要操作多个节目的回看功能。

抓取包完成后,我们还是用Wireshark程序先把包文件打开。按http协议先筛选,然后在查找栏中选择”分组列表“、”宽窄“、”字符串“,再输入”get_tvod_info“进行查找:

IPTV包分析-11

在定位信息的下一行,即服务器返回的信息中就包含回看源的地址。选中返回信息行,然后在程序中间界面里选择“Line-based text data: text/html (20 lines)”这一行,然后鼠标点击右键,点“显示分组字节…”就可以看到具体的信息了:

IPTV包分析-12

稍微看一下我们就会明白,抓取时我们曾经回看了CCTV1的新闻30分节目,其回看源地址mediaUrl后面是很长一串字符,但其实我们只需要取前面的部分就可以了,例如:“rtsp://115.233.41.137/TVOD/88888913/224/3221228078/10000100000000060000000002460690_0.smil?playseek=20201205120000-20201205123600”。而且在实际应用中,你可以将playseek后面的时间端随意设置,当然要符合在一星期之内,例如你想回看2020年12月13日CCTV1的早上6:15到6:30的节目,你只需要将回看源地址修改为:“rtsp://115.233.41.137/TVOD/88888913/224/3221228078/10000100000000060000000002460690_0.smil?playseek=20201213061500-20201213063000“。在Potplayer播放器中输入以上地址(不含双引号),测试回看节目完全正常!!

IPTV包分析-13

再点“查找”可以到下一个回看源,同样的方法可以提取其回看源地址(回看节目是CCTV2的第一时间):

IPTV包分析-14

继续点“查找”又可以到下一个回看源,重复上面的操作,一直到所有的回看源地址提取完成。

如果想在电脑端方便回看或录制节目,建议可以编写一个小程序,通过选择回看的电台,回看的时间段,就可以直接实施播放及录制节目的功能。

20201226补充:经过多个回看源的提取,再与单播地址对照,发现还是有规律可循的,不需要一个一个回看源提取,当然有些电台只有直播源没有回看源,到时直接删除或跳过即可。现在就以CCTV1HD为例,来说明一下回看源地址与单播地址之间的关系:

单播地址:rtsp://115.233.41.137/PLTV/88888913/224/3221228078/10000100000000060000000002460690_0.smil

回看源地址(20201226早上6点-7点):

rtsp://115.233.41.137/TVOD/88888913/224/3221228078/10000100000000060000000002460690_0.smil?playseek=20201226060000-20201226070000

回看地址只需将单播地址中PLTV目录修改为TVOD,再加上回播的时间端,其它数据与单播地址是完全一致的。