昨天晚上朋友说想上PPS看美剧,结果发现欧美剧场没内容了。PPS之前因为版权问题屏蔽了欧美剧场,但是通过补丁还能看到。这次是即使通过补丁找回欧美剧场,里面也没内容。



应朋友要求,简单对PPS进行了一次调试,水平有限,高手勿喷。

查壳,Microsoft Visual Studio .NET 2005 -- 2008 -> Microsoft Corporation。

用OD加载调试,首先想到的是下消息断点。在PPS上试验了一下,应该是在WM_LBUTTONUP时进行的处理。

让PPS先运行起来,查看窗口。



PPS的窗口比较多,用工具找了下频道列表窗口(句柄值为0002049E)类别为树形控件。对其下消息断点(WM_LBUTTONUP)。

点击频道列表中的某项,程序立刻断下来。

776CE0E4 >  6A 10           push    10

此时处于系统user32的领空,Alt+F9返回,可以看到程序来到PowerList.ocx的领空。看来PPS是由这个控件来处理频道列表的。

回溯一下栈,没发现什么明显的有用的东西(也可以F8初略跟一下)。查找一下参考文本字符串,会发现很多与协议有关的东西,这里暂不说明。因此转而重启并bp recv。

PPS还没有完全打开就会断下来,Alt+F9返回,依然是在PowerList领空,可以看到下面的代码。

06244179  |.  FF15 ACD93106 call    dword ptr [<&WININET.HttpSendRequestA>]   ;  wininet.HttpSendRequestA
0624417F  |.  85C0          test    eax, eax
06244181  |.  75 09         jnz     short 0624418C

程序使用了HttpSendRequestA API,在MSDN上查一下其原型。

BOOL HttpSendRequest(
  __in  HINTERNET hRequest,
  __in  LPCTSTR lpszHeaders,
  __in  DWORD dwHeadersLength,
  __in  LPVOID lpOptional,
  __in  DWORD dwOptionalLength
);

注意其第一个参数,Handle returned by HttpOpenRequest,再看一下HttpOpenRequest的原型。

HINTERNET HttpOpenRequest(
  __in  HINTERNET hConnect,
  __in  LPCTSTR lpszVerb,
  __in  LPCTSTR lpszObjectName,
  __in  LPCTSTR lpszVersion,
  __in  LPCTSTR lpszReferer,
  __in  LPCTSTR *lplpszAcceptTypes,
  __in  DWORD dwFlags,
  __in  DWORD_PTR dwContext
);

同样的注意到第一个参数,A handle to an HTTP session returned by InternetConnect,再看下HttpOpenRequest的原型。

HINTERNET InternetConnect(
  __in  HINTERNET hInternet,
  __in  LPCTSTR lpszServerName,
  __in  INTERNET_PORT nServerPort,
  __in  LPCTSTR lpszUsername,
  __in  LPCTSTR lpszPassword,
  __in  DWORD dwService,
  __in  DWORD dwFlags,
  __in  DWORD_PTR dwContext
);

OK,在这里我们能看到lpszServerName。大致流程可以猜想到,用InternetConnect指定连接的服务器,然后通过HttpOpenRequest制造一个Http请求,最后HttpSendRequest。当然,有请求就会有返回,通过多次recv断下来,还可以发现InternetReadFile函数的调用。

对InternetConnect、HttpOpenRequest和InternetReadFile这三个函数下断(此时recv的断点可以禁用了),接下来F9加Atl+F9的过程可以看到很多东西。



InternetConnect的服务器有list1.ppstream.com(获取频道列表)、stat.ppstream.com(统计)等。



HttpOpenRequest请求的文件有/class/50.xml.zip(最近更新)、/class/generas.xml.zip(频道大栏目)等。

仔细跟踪打开一个大栏目的过程还可以发现其获取子栏目列表或者具体视频信息的过程,如/schs/13034.xml.zip为高清影院动作片的视频信息。



通过打了补丁的PPS发现,欧美剧场的ID为192,因此到list1.ppstream.com/class/192.xml.zip下载下来zip文件打开发现,其中的xml中已经没有内容。因此可以判定,之前PPS只是在generas.xml.zip中屏蔽了欧美剧场,这次在其基础上更在欧美剧场的内容列表192.xml.zip上进行了屏蔽。

花了近一个小时写这篇文字,希望能求个邀请码。