千千静听 4.6.9 拆完了。rea analyze报告 7,015 个函数、1,764 条字符串,全部过完,它对服务器说过的话只有三句。报版本,问歌词,交歌词。用户名一次没报过,机器码一下没碰过,注册表里自己的键一个没写。
这个结果我事先没料到。
为什么拆它
事情起于一个怀旧选题。我把 4.6.9 装进虚拟机,2006 年 12 月 18 日构建,Alen Soft 出品。二十年前的安装包现在双击就能跑,启动音乐一响,整个人回到网吧包夜的位置。
装完冷静下来,问题跟着就来了。这软件当年最神的功能是自动搜歌词,本地一个乱码文件名的 MP3,三秒对上歌词,还带逐字卡拉 OK。搜歌词意味着联网,联网意味着有数据在往外传。传歌词的时候,它顺手传没传别的,这是我想知道的。老播放器连网的嫌疑清单大家都熟,听歌记录,歌单,机器码,逐条核实。
我的预期是能抓到点什么。一个 2006 年的国民级免费软件,靠什么活下来,服务器靠什么养,这些问题在拆开之前都没有答案。
先验明正身
审计工具是 REA,开源逆向工具,GitHub 上 35 万星(github.com/morluto/rea),重活配 Ghidra 12.1.4 复核。样本是公开历史版本的安装包,审计对象是安装版主程序。
根目录的 tt469.exe 先跑一遍,REA 的函数计数停在 8。8 个函数做不成播放器,这是 UPX 壳,真身另有其人。安装目录里的 TTPlayer.exe 没加壳,分析跑完给出上面那组数字,7,015 个函数,1,764 条字符串。顺带一提,壳和真身这组对照,让函数计数表兼职了壳检测器。
方法就三步。字符串快扫圈出可疑范围,反编译逐个看细节,最后把证据链钉死,每条结论都有函数和字符串对得上号。
快扫这步最出效率。1,764 条字符串里跟网络有关的只有一簇,lrc,asp,freedb,mailto,全塞在两千个不到的字符串里,等于它自己把涉案范围圈好了。点开就是反编译,函数级细节再丢给 Ghidra 核对。整个审计的主线工作,基本围着这份报告转。
三句口供
第一句,报版本。它定期连一个更新接口ttp_ver.asp,参数里带版本号,做更新检查。行为本身干净,有意思的是 User-Agent。一个播放器出门查版本,自报家门写的是MSIE 6.0。它假装自己是 IE6。也没准当年的程序员觉得这么写联网顺一点,动机查不出来,事实就是这一条。
第二句是问歌词。歌词搜索定位到CLrcSearchDlg::Run,请求打向千千静听自家的歌词服务器。
第三句,交歌词。上传接口lrcup.asp收四个字段,artist,title,album,lyrics,明文 POST,GB2312 和 BIG5 双编码。整个审计最有意思的细节在发送端。用户名那一栏,是空白虚线。数据给得齐齐整整,但不留名。连 freedb 的 CDDB 握手串都是自报anonymous@anonymous.com。
没干的事
按开头那套预期,这里该出现上报用户名或者机器码的代码。我把导入表翻了个底朝天。GetUserName,没有。GetComputerName,也没有。整个程序压根没这两个函数。
注册表只读Software\Winamp,读的是邻居家的键,自己一个不写。全部配置躺在.ttpl_cfg、.ttvi_cfg、.skn三个随身文件里,拽着就能走,绿色免安装。2006 年的绿色软件纪律,比现在某些登录才能用的工具体面。
所以它没收集用户信息,原因也简单。那个年代的软件,压根没有认识用户的习惯。
时代彩蛋
主线之外的东西更有年代感。
十六进制里躺着一条测试地址http://129.168.0.1/1.mp3,局域网 192.168 手滑写成 129,然后在成品里躺了二十年没炸过,因为压根没人访问得通。一大片0xCC是调试垫料,用 GBK 解开就是老玩家会心一笑的「烫烫烫」。Update.txt 里记着 4.6.6 版本 2006 年 2 月与 KooWo 合作做音乐指纹,初代听歌识曲,比手机上那套早了快十年。PE 版本块里 © 2003-2006 Alen Soft 的旁边,端端正正写着「防伪标志」四个字。错误反馈走邮件,收件地址是ttplayer@21cn.com,一个早就没人收信的邮箱。
合上 Ghidra 之后
顺带一提,官方早已消失,到现在还有玩家自建歌词服务器给老版本续命,老版客户端装上照样能搜到歌词。
二十年前软件和用户的关系很简单,它放歌,你听歌,中间没有账本。那个年代压根没有收集的基建,它想记账也没处记。
今天任何一个软件的行为,都能用同样的方法钉死在证据上。工具是开源的,REA 加 Ghidra,门槛是愿意花一个下午。这份审计的完整记录在 REA 仓库的讨论区,视频版四平台已发,原始材料都在下面。
- 审计记录(原文) github.com/morluto/rea/discussions/5496
- 逆向工具 REA github.com/morluto/rea
- 视频版(B站) bilibili.com/video/BV18pnA62Eb2
- 视频版(YouTube) youtu.be/TCibB-E3nsM
环境与样本。REA 6.4.0,Ghidra 12.1.4,样本为千千静听 4.6.9 公开历史版本,2006-12-18 构建,全程无脱壳需求。