使用tcpdump和wireshark来分析XBMC的网络协议

最近需要去福建,怕家里来小偷,因此需要弄点手脚让小偷以为家里有人,所以我想到让客厅里的HTPC到了特定时间后自动播放电影。

首先需要下载Wireshark做协议分析,来分析XBMC遥控app是怎样控制HTPC的,分析方法有这么几种:
1)Wireshark跑在目标机器上捕捉数据,比如可以用ssh -X 的方式开远程X服务器,
2) 利用代理功能让HTPC或者其他设备(比如手机)来拦截所有Web请求,然后在代理服务器上捕捉数据
3)在目标机器上利用tcpdump来捕捉,使用Wireshark做离线分析

第三种方式最灵活,但是对于分析iOS设备却没有任何帮助,对于分析iOS设备可以使用第二种方式通过代理来拦截请求然后使用tcpdump或者wireshark来做捕捉,不过这里我只需要分析HTPC,可以安装tcpdump就直接用tcpdump来处理好了。

tcpdump的文档网上一大堆,我就不用介绍这个命令怎么用了,只用实例来记录一下我这些操作的步骤。

XBMC默认的RPC服务使用的端口8080,这里就暂时只捕捉8080的端口,并将其写入到文件:

$ sudo tcpdump -i eth0 'port 8080' -w xbmc.cap

然后打开手机上的遥控程序,在遥控程序上打开一个电影并播放,然后打开另外的电影并加入到播放队列中,之后关闭tcpdump,将生成的文件xbmc.cap使用Wireshark打开,
通过这里看到的HTTP POST请求,试着重新发一个请求来播放指定文件:

$ curl -X POST -H 'Content-Type: application/json' -d '{"method":"Player.Open","id":-1212376459,"jsonrpc":"2.0","params":{"item":{"position":0,"playlistid":1}}}' 'http://192.168.0.250:8080/jsonrpc'

发现成功了,不过之前加入到播放队列里的其他电影还是在这个播放队列里,试着根据XBMC的API文档中定义的Playerlist.Clear方法来清空一下播放列表看看:

$ curl -X POST -H 'Content-Type: application/json' -d '{"method":"Playlist.Clear","id":1,"jsonrpc":"2.0","params":{"playlistid":1}}' 'http://192.168.0.250:8080/jsonrpc'

播放成功了,再在捕捉到的数据里找下他们怎么调用Playlist.Add的:

$ strings xbmc.cap  | grep Playlist.Add
{"method":"Playlist.Add","id":427540166,"jsonrpc":"2.0","params":{"item":{"movieid":132},"playlistid":1}}

模拟这个请求:

$ curl -X POST -H 'Content-Type: application/json' -d '{"method":"Playlist.Add","id":427540166,"jsonrpc":"2.0","params":{"item":{"movieid":132},"playlistid":1}}' 'http://192.168.0.250:8080/jsonrpc'
{"id":427540166,"jsonrpc":"2.0","result":"OK"}

好了,接下来做个脚本来做以下事项: 清空播放列表,播放一个电影,往播放列表中添加其他电影:

#!/bin/bash
_() {
curl -X POST -H 'Content-Type: application/json' -d "$1" 'http://192.168.0.250:8080/jsonrpc'
echo ""
}
_ '{"method":"Playlist.Add","id":3,"jsonrpc":"2.0","params":{"item":{"movieid":132},"playlistid":1}}'
_ '{"method":"Playlist.Add","id":3,"jsonrpc":"2.0","params":{"item":{"movieid":12},"playlistid":1}}'
_ '{"method":"Playlist.Add","id":4,"jsonrpc":"2.0","params":{"item":{"movieid":32},"playlistid":1}}'
_ '{"method":"Playlist.Add","id":5,"jsonrpc":"2.0","params":{"item":{"movieid":13},"playlistid":1}}'
_ '{"method":"Player.Open","id":2,"jsonrpc":"2.0","params":{"item":{"position":0,"playlistid":1}}}'

然后放到bash里,在自动开机后执行,以后就会自动开机并播放指定的电影,这样夜深的时候小偷也会觉得家里有人了


Last modified on 2014-02-10