我们的技术分析分为三部分,第一部分介绍了一个基本结构,这两个版本的QQ浏览器都会通过这个结构向QQ服务器传输数据。第二部分分析了被采集的个人用户数据,以及安卓版的软件更新过程。第三部分分析了相应的Windows版功能。安卓和Windows版的QQ浏览器都使用了一种WUP请求与QQ服务器通讯。WUP请求是一种二进制格式,可以包含不同类型的值,例如,整数,浮点数,列表,字符串和递归结构。有时候,这些请求首先要经过加密,然后再嵌入到一个HTTP POST请求的主体中,最后,随着这个HTTP POST请求发送到目的URL。我们写了一个Python脚本来解密并解析这些请求,从而将其转换成人类可读格式。在这个脚本的代码中,还包含了在接下来解密数据时需要用到的其他脚本。Q-GUID,Q-UA和Q-UA2字段出现在WUP请求的HTTP标头中。在接下来介绍WUP请求时,如果某个字段的对应值出现在了WUP请求的有效载荷中,我们就用这个字段来代指一个相应的实例。在HTTP标头中,这些字段都不会经过加密,但是,当这些字段出现在WUP请求中时,其格式会发生变化。Q-GUID字段中填充的值是在初始化时,通过一个WUP请求从QQ服务器上获取的,并且在接收到这个值后,浏览器就会保留这个值,并且将其添加到后续请求的HTTP标头中,没有加密。在很多WUP请求的有效载荷中,也包含有这个值。下面就是一个Q-GUID:caed22d728efa6127d53bc0412f888cbGUID可能表示的是“全局唯一标示符”,是一个128位数字,通常是随机生成的。Q-UA和Q-UA2值中包含有与QQ浏览器版本和硬件平台相关的硬编码信息。虽然,UA很可能指的是“User Agent”,并且包含有与HTTP user agent字符串相似的信息,但是其格式却不同于QQ浏览器在HTTP标头中使用的user agent HTTP字段。我们分析的安卓版QQ浏览器是6.3.01920版本,下载于http://mb.qq.com/。在启动后,或执行了某些事件时,比如,浏览网页或检查更新,浏览器就会向http://wup.imtt.qq.com:8080/发送WUP请求。这些请求使用了下面的这种加密方式。对于每个加密的WUP请求,会根据下面的Java代码来生成一个AES秘钥:#!java int i = 10000000 + n