说出来大伙儿可能不信哈。
前几天线条君拿开源逆向工具 REA,把 2006 年的千千静听 4.6.9 整个拆开,本来是去抓它偷隐私的。
结果拆完发现,这哥们儿老实得让人心疼。。。
事情是这样的。这段时间做怀旧选题,线条君把千千静听 4.6.9 装进了虚拟机,2006 年 12 月 18 日构建,Alen Soft 出品。都 2026 年了,这安装包双击就能跑,启动音乐一响,人直接回到网吧包夜的位置。
(别问为什么当年在网吧下的歌文件名全是乱码,问就是时代。)
先说说为什么拆它
大伙儿还记得这软件当年最神的功能吗。
自动搜歌词。本地随便一个乱码文件名的 MP3,拖进去三秒对上歌词,还带逐字卡拉 OK,在网吧里跟开挂一样。
但大伙儿想一个事,搜歌词,意味着它连着网,意味着有数据在往外传。
那问题来了。它传歌词的时候,顺手传没传点别的?
老播放器连网,大家懂的都懂。上报你的听歌记录?传歌单?机器码呢?线条君怀着这套预期,直接上了 REA。
怎么个拆法,三步。字符串快扫圈出可疑范围,函数反编译看细节,最后拿证据链把结论钉死。每一句话都得有函数和字符串对得上号,不让它蒙混过关。
REA 上场,先验明正身
第一个小惊喜来得很快。
根目录那个 tt469.exe,REA 一跑,函数计数停在 8。
8 个函数的播放器?糊弄鬼呢。这数字一看就是 UPX 壳(顺带一提,壳和真身这组对比,让 REA 的函数计数表意外兼职了壳检测器。。。)。
真身是安装目录里的 TTPlayer.exe,没加壳。rea analyze 跑完,7,015 个函数,1,764 条字符串。七千个函数什么概念,够一个播放器从放歌管到卡拉 OK,这就是 2006 年的工程量。
然后字符串快扫直接把网络行为圈出来了。1,764 条里跟网络沾边的就一簇,lrc、asp、freedb、mailto,等于它自己把涉案范围交代了。点开就是反编译,函数级细节再丢给 Ghidra 复核。整个审计的主线,基本就是围着 REA 这份报告转的。
REA 是啥,开源逆向工具,GitHub 上 35 万星,MIT 协议,人人可白嫖。
三句口供,句句干净
审讯正式开始。七千个函数过完,这位当事人一辈子只对服务器说过三句话。
第一句口供,报版本。定期连一个更新接口 ttp_ver.asp,带上版本号,做更新检查。这本身没什么,但它的 User-Agent 写的是 MSIE 6.0。
一个播放器,出门查个版本,还要假装自己是 IE6(也没准人家就是觉得这么写联网顺一点)。。
线条君愿称之为 2006 年的出门化个妆。
第二句口供,问歌词。歌词搜索定位到 CLrcSearchDlg::Run,请求打向千千静听自家的歌词服务器。就问歌词,别的没问。
第三句口供,交歌词。上传接口 lrcup.asp,POST 明文四个字段,artist、title、album、lyrics,GB2312 和 BIG5 双编码角注。
然后是最有意思的细节。发送端用户名那一栏,是空白虚线。
数据齐全,但不留名。连 freedb 的 CDDB 握手串,都是自报 anonymous@anonymous.com。
懂行的兄弟们应该已经品出味儿了。这是把活儿干了,但拒绝留档案。。。
线条君在这儿等着抓大新闻呢
按剧本,接下来该出大新闻了。线条君特意去翻了导入表,就等着逮住那个上报用户名的函数。
GetUserName,没有。GetComputerName,也没有。
整个程序压根没这两个函数。读用户名?不读。读机器码?不读。翻遍七千个函数,一无所获。
扑空了,扑得还挺彻底。
那为什么还说它「老实」?因为它老实得相当全面。注册表只读 Software\Winamp,注意,这是读邻居 Winamp 家的键,自己家的配置一个不写,全放在 .ttpl_cfg、.ttvi_cfg、.skn 三个随身文件里,拽着就能走,绿色免安装。
2006 年的绿色软件纪律,比现在某些登录才能看的工具体面多了。
就,还挺戳的。
主线之外,全是时代彩蛋
审讯记录里还夹了不少私货,大伙儿品品。
十六进制里躺着一条测试地址 http://129.168.0.1/1.mp3。局域网 192.168 手滑写成 129,然后这个 typo 在成品里躺了二十年,没炸过,因为压根没人访问得通。
一大片 0xCC,调试垫料,用 GBK 解开就是老玩家会心一笑的「烫烫烫」。
Update.txt 里记着 4.6.6 版本(2006 年 2 月)「与 KooWo 合作音乐指纹」。大伙儿品品,初代听歌识曲,比手机上那套早了快十年。
PE 版本块,© 2003-2006 Alen Soft,旁边还端端正正写着「防伪标志」四个字。那个年代的程序员,是真的会在版权信息旁边写防伪标志的。。。
错误反馈走邮件,收件地址 ttplayer@21cn.com。一个早就没人收信的邮箱,往里寄信永远不会有回音。
笔录归档
最终笔录如下。这位当事人一辈子只说三句话,报版本、问歌词、交歌词。不报用户名,不报机器码,不写注册表,歌词投稿连署名栏都空着。
放在今天任何一款「智能」软件旁边,这份口供清新得不像话。
线条君最后合上 Ghidra 的时候想了半天,结论就一个。它不是不想认识你,它是那会儿的软件压根没这个习惯。那个年代没有收集用户的地基,它想记账也没处记。
现在呢,大伙儿手机里随便一个 App 要的权限都比它多。二十年前你只能听它的,现在你随时可以拆开它,REA 开源、Ghidra 免费,工具平权了啊,兄弟们。
哦对了,官方早就没了,但到现在还有大伙儿自建的歌词服务器在给老版本续命,二十年前装的千千静听,今天挂上社区服务器照样三秒搜到歌词。。。官方死了,社区还活着。
完整审计过程剪成了视频,就发在主页,四分半钟看完一场二十年前的审讯。
(案例已提交到 REA 仓库讨论区,想看原始记录的可以去 GitHub 搜 morluto/rea。)
热门跟贴