Releases: a1175815821/MegaDownloader-Revival
Release list
v2.4.5
本版本为全面代码审查后的系统性修复:36 项确认问题全部处理,涵盖崩溃修复、功能正确性、HTTP 协议合规、资源泄漏与安全加固。
🛡️ 全局异常兜底
此前整个应用没有任何未处理异常兜底——任何 UI 线程异常直接弹 .NET 崩溃对话框并终止进程,后台线程异常更是让进程无声消失。现在:
My.UnhandledException:异常写入日志后不退出,用户有机会保存状态AppDomain.UnhandledException:后台线程异常至少留下日志线索
🐛 修复:列表刷新闪退(高频崩溃源)
下载状态/百分比/预估时间/进度文本 4 个 AspectGetter 的 Catch 块会弹英文堆栈再 Throw——而 AspectGetter 在每一行重绘时执行,一行弹一次窗,关掉后崩溃。改为只记日志并返回安全占位值。
🐛 修复:其余用户可见错误
| 症状 | 根因与修复 |
|---|---|
| 打开 ELC 点"取消"报 "The path is not valid" | 取消时仍以空串调用 AddDLC;现在静默退出 |
| 单文件点 Reset 很快又变回 Error | Fichero 分支漏调 ResetearDescarga(),残留 .part 与错误状态;补齐与包分支一致 |
| 首次运行强制配置可被"取消"绕过 | 密码框被填占位符 ***** 恒非空,校验永不可达;占位符现视为"未设置" |
| Web 超时保存 61-99 重开变空再被改 5 | 载入边界 >60 与保存边界 0-99 不一致;统一为 0-99 |
| 队列文件损坏导致启动即崩 | CDate(strFecha) 区域性相关且无 Try;改 Date.TryParse 双文化解析,坏值跳过 |
| 后台弹窗藏到主窗体后面像卡死 | DoWork 线程直接 MessageBox.Show;改走 SafeShowError 编组回 UI |
| VLC 启动失败无任何反馈 | 返回值被忽略且无 Try;两处调用方现检查返回值 |
| 拖入非 ELC/DLC 文件被静默丢弃 | 现在给出提示 |
| 未选中条目点"打开目录"报空路径错误 | 空路径直接退出 |
🐛 修复:功能正确性缺陷
| 位置 | 修复 |
|---|---|
DescompresorController.vb |
缺分卷 RAR 假成功:IsComplete=False 时静默跳过且不置异常,上游报"解压成功";现显式抛错。重复 Code 卡"正在解压":静默跳过仍返回 True;现更新既有队列条目 |
FileDownloader.vb |
UI 冻结最长 16.5 秒:分块失败退避的 Thread.Sleep 忙等跑在 UI 线程;移到线程池。"Must specify size" 掩盖真实错误:Size=0 时跳过收尾块。Dispose 从不释放 Mutex/MutexFile/trigger:现确定性释放 |
Configuracion.vb |
Web 密码解密失败的空 Catch:保留密文当密码导致登录永远失败且无线索;现记日志并清空 |
Conexion.vb |
FileID 未转义直接拼 JSON/URL;补 JSON 转义 + UrlEncode |
Main.vb |
删除"包+子文件"时 CancellationComplete 双挂导致 Dispose 执行两遍;已被移除的对象直接跳过 |
🌐 HTTP 模块:Range 合规 + CSRF + 限速
- RFC 7233:支持
bytes=-N后缀区间与bytes=N-开放区间;越界返回 416 +bytes */size(此前静默钳位);bytes=0-0单字节探测只取一个对齐块(此前向 MEGA 请求整个文件,带宽放大);尾块截断到 Content-Length(响应体不再超发) ?mega=解析:直接用框架解析的参数值,?p=密码&mega=...顺序不再失败- 流媒体库 CSRF:Delete/Save/OpenVLC/ImportLinks/ExportLinks 现要求 POST + 有效 token(复用 Web 界面的 EnsureCsrf 模式);顺带修复浏览页 OpenVLC 用 GET 调 POST-only 接口的既有失效
- 登录限速:PBKDF2(100k) 在请求线程同步执行,POST 轰炸可打满线程池;现并发上限 4 + 60 秒窗口失败锁定 10 次
💾 资源泄漏
Criptografia.decrypt_key:循环内CreateDecryptor从不 Dispose;改 UsingMD5Utils.MD5CalcString:补 UsingDescompresorController×4 处、ThrottledStreamController×1 处 Mutex 补 Try/Finally- Configuration/PropiedadesDescarga 共 5 处悬停 ToolTip 泄漏;复用单实例
🔒 Stegano(隐写)
- 先写坏再报错:容量校验发生在写盘之后,留下截断的 .jpg;改为内存编码+校验全通过才落盘
- OpenWrite 不清空尾部:覆盖更长的旧文件时新旧字节拼接;
WriteAllBytes截断覆盖 - Uri 校验形同虚设:
RelativeOrAbsolute对 "hello world" 返回 True;限定 Absolute + http/https/file
🧹 维护性清理
- vbproj 删除死引用
TODO\TODO.txt、plantilla botones.psd;删除孤儿文件postbuildevent.xml - DPI 配置统一 PerMonitorV2;移除未部署的 Unsafe 程序集重定向
- 硬编码英文消息(10 处)接入语言系统,新增 en-US/zh-CN 条目
Full Changelog: v2.4.4...v2.4.5
v2.4.4
新功能:子文件夹链接下载
mega.nz/folder/根ID#密钥/folder/子ID现在仅下载指定子文件夹的内容(路径以子文件夹为根重定基),不再下载整个根文件夹mega.nz/folder/根ID#密钥/file/文件ID仅下载指定单个文件- 正则扩展捕获子路径后缀;文件列表按父节点链过滤;下载路径重定基
修复:子文件夹链接下载完成后误报 MetaMAC 错误
根因:每个数据分块的 CBC-MAC 计算使用零初始 IV。而 MEGA 真实算法(SDK SymmCipher::ctr_crypt)的分块 MAC 初值是文件 nonce 复制两份 [n0, n1, n0, n1](key 第 4-5 word)。零 IV 算出的 MAC 与任何真实上传文件的 MetaMAC 都不可能匹配,因此所有带 8 words key(内嵌 MetaMAC)的下载必然报错;单文件公开链接(4 words key,跳过校验)不受影响,导致问题此前被掩盖。
修复:分块 MAC 初值改为 [nonce, nonce],逐行比对 SDK macsmac/ChunkedHash 源码确认对齐。同时移除"分块边界前缀匹配"宽容逻辑,与 SDK 一致:读完整个文件后一次性完整比较;任何位置的真实损坏仍然硬失败。
9 项安全加固
| 位置 | 修复 |
|---|---|
StripNullCharacters |
重写为 Replace(vbNullChar, ""),消除位置偏移错误 |
| AES 加解密 | 失败返回 Nothing;持久化点加密失败时跳过写入、保留旧值 |
| AES 密文格式 | 新增随机 IV 格式,与旧格式自动双向兼容 |
| MetaMAC 失败处理 | 抛异常并重置分块重试(配合算法修复,不再误报) |
| PSK 输入校验 | 含非 ASCII 字符(>255)时记日志返回 Nothing |
| Web 密码存储 | 随机盐 + PBKDF2(100k 轮)派生,替换无盐 MD5 |
| Streaming 密码比较 | 恒定时间比较 FixedTimeEquals,防时序侧信道 |
ClientConnected 反射 |
静态缓存 + null 检查 + Try/Catch,失败降级为假设已连接 |
Full Changelog: v2.4.3...v2.4.4
v2.4.3
v2.4.2
v2.4.1
v2.4.1 - 修复:下载完成但显示错误(用户实测确认)
症状:文件下载到 100% 时直接弹错误,.part 文件不重命名;手动去掉 .part 后缀后文件可正常使用,证明文件实际已完整下载。
根因:v2.2.0 引入的 MEGA MetaMAC 完整性校验存在系统性误报:
- 单文件公开链接必然误报:公开链接的 FileKey 仅 16 字节(4 words,只有 AES 密钥本身),不含 MetaMAC;而校验函数要求至少 8 words(32 字节,含 nonce + MetaMAC),不满足直接判定失败 → 状态错误、不重命名。只有文件夹 API 返回的 32 字节 node key 才真正含 MetaMAC,误报集中在最常见的单文件链接场景
- 8 words key 的边界规则差异也可能误报:MEGA 客户端历史上的 MAC 分块边界规则有版本差异,不匹配不等于文件损坏(大小精确校验是更强证据)
修复(两层防护):
| 位置 | 修复 |
|---|---|
Criptografia.VerifyMegaMetaMac |
4 words 公开链接 key 记日志说明"无 MetaMAC 可验证"并跳过,不再误判失败 |
FileDownloader.downloadFile |
8 words key 的 MetaMAC 不匹配降级为日志警告并继续完成重命名;文件大小精确校验(不匹配仍报错)保留为主要完整性防线 |
升级说明
- 旧版本中已报错但
.part完整的任务:升级后重试即可正常完成 - 升级后下载完成将正常重命名并显示"完成"状态
版本号
- Assembly / FileVersion →
2.4.1.0 - InternalConfig
VERSION_MEGADOWNLOADER/VERSION_UPDATE→2.4.1 docs/version.xml→2.4.1.0
Full Changelog: v2.4.0...v2.4.1
Full Changelog: v2.4.0...v2.4.1
v2.4.0 - 全面 Bug 修复
v2.4.0 - 全面 Bug 修复
基于对 v2.3.0 全项目代码的逐文件核查,修复 21 项经确切代码证据确认的 bug,涵盖用户可感知报错、死锁/资源泄漏、并发缺陷、异常吞噬、安全债务与死代码。
一、用户层面可感知的报错(4 项)
- 后台线程弹 MessageBox 卡死下载:
FileDownloader.bgwDownloader_DoWork的 Catch 块不再在线程池线程上调用MessageBox.Show,改为通过ReportProgress(FileDownloadFailedRaiser)上报失败,由 UI 线程统一呈现 - 关闭期间跨线程 MsgBox 崩溃:
Main.vb三处BackgroundWorker.DoWork异常分支不再直接MsgBox,新增SafeShowError辅助方法,检查IsDisposed/IsHandleCreated并通过Invoke切回 UI 线程 - 7z multipart 解压崩溃:
DescompresorController两处NotImplementedException改为NotSupportedException带友好消息;DescompresionFinalizada事件扩展传递错误消息,用户可在错误状态中看到具体原因 - 兜底完成漏做 MD5 校验/解压:
Fichero.ActualizarDatosDescarga的兜底状态修正不再仅翻转状态,改为调用完整downloader_Completed流程(含 MD5 校验和自动解压),避免"显示完成但未校验完整性"
二、死锁与资源泄漏(4 项)
- Mutex 无 Try/Finally 死锁:
Main.AgregarPaquete和bgwComprobarMaxConexiones两处 Mutex 加Try/Finally - 下载 worker 未 Dispose:
FileDownloader.Dispose中循环释放listDownloaders里的所有 worker - bgArranque worker 泄漏:
Fichero.Dispose新增释放bgArranque(下载启动 worker) - ELCForm 300ms 忙轮询:改为
AutoResetEvent事件驱动,无任务时零 CPU 消耗
三、并发与逻辑缺陷(2 项)
- AJAX 响应并发污染:
StreamingLibraryModule._RespuestaAjax改为AsyncLocal(Of String) - FlushFinalBlock 异常吞噬:
ServerEncoderLinkHelper.Cipher解密路径的空 Catch 改为日志
四、异常吞噬(3 项)
- FlushToDisk 磁盘错误被吞 → 日志
- 服务器错误响应读取失败被吞 → 日志
- 解压取消异常被吞 → 日志
五、安全与技术债务(5 项)
- DPAPI entropy 硬编码:改为从程序集标识 SHA256 派生,保留 legacy entropy 解密旧数据
- ZIP 密码硬编码 "passZIP":改用 DPAPI,解密先 DPAPI 后回退旧 AES 兼容旧队列文件
- OptionalPassword 死字段:删除
- RandomNumberGenerator 未释放:用
Using包裹 - 日志无 UTC 时间戳:改用
DateTime.UtcNow,新增 30 天日志保留清理策略
六、死代码清理(2 项)
- 删除
Criptografia注释掉的DecryptFile和cipherData - 删除
Conexion注释的GetAppID和无调用的LeerNodo
版本号
- Assembly / FileVersion →
2.4.0.0 - InternalConfig
VERSION_MEGADOWNLOADER/VERSION_UPDATE→2.4 docs/version.xml→2.4.0.0
Full Changelog: v2.3.0...v2.4.0
v2.3.0
Full Changelog: v2.2.1...v2.3.0
Full Changelog: v2.2.1...v2.3.0