Hacker News 中文摘要

RSS订阅

Someone on Torrent Sites Kept Fucking with My Sonarr

我在网络附属存储(NAS)上跑着 arr 套件(arr stack),仪表盘突然警告:新一集《南方公园》(South Park)卡在队列,提示谁会在 2026 年上这种当。有人把《南方公园》剧集名加 .exe 传上 tracker,挂着 2,392 个做种者。Sonarr 照抓,随后每 90 秒尝试导入;qBittorrent 两秒后标记完成,total_downloaded: 0。我拉黑并清掉任务,又故意重下。它是真正的可移植可执行文件(PE)、x64 图形用户界面(GUI),真程序仅 118 KB,另 886 MB 是尾部垃圾,版本信息写着 Freeware Developers.。

正文

我在 NAS 上跑着常见的 *arr 套件。平时一般都没问题,直到我在仪表盘上看到一条警告。

新的《南方公园》一集卡在队列里,附带的消息是:

“都 2026 年了,到底是谁还真会被这个骗到????”

让我把话说清楚。

有人拿《南方公园》的剧集名,在后面加个 .exe,传到公共 tracker 上,还挂着 2,392 个做种者,???

谁会把剧集做成 EXE 啊????

而 Sonarr 当然把它抓下来了。然后它就卡在那儿,每 90 秒他妈的就试着导入一次:既没有像“过去的好日子”那样,弄个假 .mkv 再在旁边放个“codec installer”的文件夹,就只是个 exe。认真的吗。

qBittorrent 在添加后两秒就把它标成了“已完成”,total_downloaded: 0,所以磁盘上其实什么都没落下来。不知道为什么。也不在乎。谢了 qBit。

我在 Sonarr 里把它拉黑了,这会把它从 qBittorrent 里清掉,也阻止它再去抓同一个垃圾菜鸟恶意软件。

然后我故意又下了一遍。因为现在我火了,我想知道里面到底是什么。

这是个真的 PE 文件,x64 GUI。真正的程序只有 118 KB。

另外 886 MB 是粘在文件末尾的随机垃圾。为什么?因为很多扫描器一看到这么大的文件就直接放弃了。

版本信息写着:

“Freeware Developers.”——鬼才信。

我把开头那 118 KB 切下来,丢进 IDA,因为我可不想把 1 GB 的垃圾塞进任何工具里。然后整个东西被下面这种东西糊满了:

对一个全局变量做 XOR,再异或回去,什么都不做。重复几百次。

它存在的唯一目的就是让反编译输出看起来像一坨屎,而且它还真做到了,恭喜。

把这些全剥掉,逻辑其实就六步:

  1. 打开它自己的文件。
  2. 读取最后 64 字节。
  3. 用这些字节找到并解密藏在垃圾数据里的载荷。
  4. 手工把它作为 PE 映射到内存里。
  5. 把 PEB->ImageBaseAddress 指向它。
  6. 跳进去执行。

全程不碰磁盘。就为了这六个步骤,加了这么一堆混淆。

文件最后 64 字节就是全部配置:

| 偏移 | 大小 | 说明 | | --- | --- | --- | | 0x00 | 32 字节 | 密钥,与 .data 中一个 32 字节掩码做 XOR | | 0x20 | 12 字节 | ChaCha20 nonce | | 0x2C | 4 字节 | 载荷大小 ^ fnv1a(掩码) | | 0x30 | 4 字节 | (标志 | 填充 << 8) ^ fnv1a(掩码) | | 0x34 | 8 字节 | 载荷大小 ^ fnv1a(掩码) | | 0x3C | 4 字节 | fnv1a(掩码) |

这是 ChaCha20。它把常量藏在全局变量里拼出来,但拼出来仍然是 expand 32-byte k。见过 ChaCha20 的人,你藏不住 ChaCha20。

flags = 3 会开启反调试检查(PEB->BeingDebugged、调试端口查询,老一套)和反沙箱评分。只要触发其中任何一个,它就悄悄退出。

沙箱只会看到一个普通程序打开个文件然后离开。

挺好。只不过密钥就明明白白躺在文件里。(????)你甚至都不用运行它:

接着弹出第二个 PE:929 KB,MSVC,C++20,自带 zlib。

搞了这么多反分析狗屁,结果十几行 Python 就能把混淆剥掉。

字符串加密,导入表被砍到只剩 CRT,所有东西都在运行时解析。

然后 WinMain 直接以明文按名称列出每一个模块:

其他每个字符串都有自己的解密函数:

两个常量 XOR 成密钥,外加 IV、密文、长度。sub_140080F40 是 AES,S 盒还藏在 RC4 后面,因为只加一层加密显然不够炫。

在第一个上试了标准模式:AES-128-CTR。每个字符串一个密钥,共 672 处调用。

我可不打算手撸。

于是我把所有调用点从 IDA 里抠出来,在 Unicorn 里只模拟每次调用前的几条指令,从寄存器里拿到密钥、IV 和密文,再用 Python 解密。672 处里有 601 处解出来是干净的。

剩下的埋在更大的函数里,但我真的一点都不在乎,601 个已经够用了。

  • 浏览器:Chrome、Edge、Brave、Opera、Opera GX、Vivaldi、Firefox。密码、Cookie、自动填充,还带针对 Chrome 新 app-bound 加密的代码。
  • 加密钱包:Exodus、Electrum、Atomic、Guarda、Coinomi、Ledger Live、Trezor Suite、Wasabi、Sparrow、Monero、Zcash、Armory,以及各类扩展钱包。
  • 密码管理器:KeePass、KeePassXC、Bitwarden、1Password、NordPass、RoboForm、Windows 凭据管理器。
  • 账号:Telegram、Discord token、Steam、Roblox Cookie、Minecraft 账号、Authy。
  • 开发相关:.ssh、.aws、.azure、gcloud、.kube、.docker。
  • 远程访问:AnyDesk、TeamViewer、WinSCP、FileZilla、mRemoteNG、RDCMan。
  • 其他:Outlook、Thunderbird、VPN 配置、OBS 设置、便笺,以及你桌面上的文档。

它连便笺(Sticky Notes)都偷,到底图什么????

所有东西用自带的 zlib 打包,然后传走。

没有硬编码服务器,而是解密出:

一个 YouTube 频道、一个 GitHub gist、两个方括号,还有一个明显是拿键盘乱敲出来的密钥。

那个 YouTube 频道叫 “bubblegym”,创建于 2026 年 9 月 14 日:

Base64 解码,再和那串乱敲的密钥 XOR,就能拿到地址:

而那个地址竟然也硬编码在二进制里当作备用???

我猜 dead drop(死信箱)的意义在于,你可以换服务器,而地址不用写进恶意软件里。

但你还是把地址写进恶意软件了,那又何必去 Gist 和 YouTube 上取呢????

域名注册于 9 月 14 日,和那个“游戏频道”同一天。10 月 6 日构建,10 月 8 日挂上种子。

如果你用公共索引器跑 Sonarr 或 Radarr,这玩意儿一定会找上你。Sonarr 又不能运行 exe,所以问题不在它。

问题在于你的室友、你爸妈,或者凌晨三点的你,在下载文件夹里双击了它。(千万别运行那个菜鸟恶意软件)

五分钟设置:

  • qBittorrent:把 *.exe、*.scr、*.lnk、*.bat、*.cmd 加到“排除文件名”里,它就会直接拒绝下载这些文件。
  • Sonarr / Radarr:看到这类东西时,用“从客户端移除”拉黑。
  • Prowlarr:如果某个 tracker 老是发这种垃圾,就给它降级或者直接删掉。

至于做这个东西的人:你大概花了好几周,或者海量 token,搞 ChaCha20、AES-CTR、运行时 API 哈希、反沙箱评分、Chrome app-bound 加密绕过,结果就为了做个烂大街的脚本小子恶意软件。

去找个工作吧。

评论

讨论整体像一场“老手教育新手”的现场:多数人认为伪装成影视剧的 EXE 木马是 BT 盗版长期存在的噪音,靠过滤扩展名、调整 Sonarr/qBittorrent 设置或改用私有 tracker、Usenet 就能解决。分歧在于,少数人把问题归咎于 *arr 生态过于复杂、Windows 默认隐藏扩展名纵容了诈骗,以及文章疑似由 LLM 生成、技术分析被反混淆技巧带偏。

认为假 EXE 木马是 BT 盗版长期存在的正常风险,过滤扩展名即可

  • 在 qBittorrent 等下载器里排除 .exe、.scr、.zip 等类型,或让客户端在发现可执行文件时删种;这类伪装成影视剧的木马从 BT 诞生起就有,公共 tracker 被 EXE 淹没早已不是新闻,既然选择盗版,遇到 scam 并不意外;最近只是看起来变多,本质仍是老骗术。(较多人) > “欢迎来到盗版世界,你显然是新手;这种事已经存在一阵子了,骗子总有新花招。”(@bastard_op)

认为这是 *arr / Sonarr 配置问题,属于“技能问题”

  • Sonarr 可在索引器的失败下载设置里加入 Executables,自动把含 EXE 的种子标为失败、拉黑并重搜,qBittorrent 也可在检测到可执行文件时删除任务;Sonarr v4 让绕过更容易,配合 Trash Guides 配置质量 profile,或用 Cleanuparr、qbittorrent-sentinel 类脚本扫描移除含 EXE 的种子即可免疫。抱怨是因为没调好,而不是新问题。(较多人) > “技能问题,把 Sonarr 配置好再说。”(@internet2000)

建议改用私有 tracker 或 Usenet 来避开公共种子的假资源

  • 加入一个像样的通用私有 tracker,几乎不会再遇到 EXE 假资源,同时种子更多、标签更准,不会再把假 4K 下成 480p;Usenet 上迄今没人看到同类问题,很多人发现它之后就不愿再折腾 BT,公共 tracker 的泛滥说明攻击正瞄准公开来源。(较多人) > “只要进个不错的通用私有 tracker,你就再也不会遇到这个问题,还能下到种子更多、标签更好的资源。”(@ShowalkKama)

抱怨 *arr 生态过度复杂,怀念浏览器加下载器的旧时光

  • 过去只要浏览器、BT 客户端和 VLC,顶多再有个 RSS;现在要凑齐一堆以 *arr 结尾的软件,它们各自只解决一部分需求,本身还不是 BT 客户端,和 tracker 配合也不可靠,逼得大家又花钱订 Usenet,像回到 1990 年代;有人反问大家难道不在 Linux 上跑 *arr,并希望有托管服务替所有人拦掉这种垃圾。(少数人) > “以前只需要浏览器、BT 客户端和 VLC,现在却要九个不同 *arr 软件,还没有一个真正是 BT 客户端。”(@aftbit)

认为 Windows 默认隐藏扩展名与 Defender 不作为纵容了诈骗

  • Windows 默认隐藏文件扩展名,让用户把 exe 当成 mkv 运行,被认为是对犯罪者的“故意支持”;也有人觉得 Defender 应该加入启发式规则来拦截这类窃密木马,而不是只靠用户把设置调到不能随便运行 exe。(少数人) > “我们得‘感谢’微软故意支持罪犯,让 Windows 默认隐藏文件扩展名。”(@machomaster)

质疑原文是 LLM 生成的水文,作者既没配好环境也没认真逆向

  • 多名读者认为文章是“Claude 生成的水文”,作者用 LLM 写了文章甚至逆向分析并试图掩盖;这么短的内容本应自己写,有人嘲讽标题该改成“我甚至懒得让 LLM 配置我的服务器”,代表社区对 AI 水文叠加上基础配置失误的反感。(少数人) > “这玩意儿该改名叫‘我甚至懒得让 LLM 去配置我的服务器’。”(@sporedro)

少数人称赞文章逆向精彩、肯定作者反编译

  • 有人感谢作者把这个“怪物”反编译出来,认为这是一次很棒的阅读体验;即便讨论被配置之争主导,技术分析本身仍被部分人认可。(少数人) > “这是一篇很棒的阅读体验,谢谢,我很喜欢。”(@hoppp)

有价值的补充

  • 这类攻击可能与 ITorrent 被入侵有关:该站的种子一度被替换成只含一个简单 EXE 的假种子,还用目录图标和约 800M 填充数据伪装成正常资源。(@rbran)
  • 反复 XOR 全局变量并不是单纯为了让反编译器输出变乱,而是为了在不信任 sleep() 或时间 API 的前提下,通过制造 CPU 负载来耗尽沙箱的分析时长。(@SCHiM)
  • 恶意软件把地址放在 Gist 和 YouTube 上,不是为了隐藏,而是保留可更换的冗余;硬编码一个“替罪”地址还能为攻击者争取时间,让第一次执法下架不至于立刻波及备用设施。(@LoganDark)
  • 连 Sticky Notes 被抓取都不是玩笑,可能借此捞到加密钱包恢复密钥。(@Havoc)
  • 有人提出反直觉脑洞:未来可能出现专门利用反汇编器(如 IDA)漏洞的恶意代码,谁试图静态分析就会反被控制。(@JoshTriplett)