Skip to content

Releases: a1175815821/MegaDownloader-Revival

v2.4.5

Choose a tag to compare

@github-actions github-actions released this 02 Sep 14:33

本版本为全面代码审查后的系统性修复: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;改 Using
  • MD5Utils.MD5CalcString:补 Using
  • DescompresorController ×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.txtplantilla botones.psd;删除孤儿文件 postbuildevent.xml
  • DPI 配置统一 PerMonitorV2;移除未部署的 Unsafe 程序集重定向
  • 硬编码英文消息(10 处)接入语言系统,新增 en-US/zh-CN 条目

Full Changelog: v2.4.4...v2.4.5

v2.4.4

Choose a tag to compare

@github-actions github-actions released this 31 Aug 16:25

新功能:子文件夹链接下载

  • 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

Choose a tag to compare

@github-actions github-actions released this 26 Aug 13:31

Full Changelog: v2.4.2...v2.4.3

v2.4.2

Choose a tag to compare

@github-actions github-actions released this 19 Aug 13:17

Full Changelog: v2.4.1...v2.4.2

v2.4.1

Choose a tag to compare

@a1175815821 a1175815821 released this 14 Aug 18:47

v2.4.1 - 修复:下载完成但显示错误(用户实测确认)

症状:文件下载到 100% 时直接弹错误,.part 文件不重命名;手动去掉 .part 后缀后文件可正常使用,证明文件实际已完整下载。

根因:v2.2.0 引入的 MEGA MetaMAC 完整性校验存在系统性误报:

  1. 单文件公开链接必然误报:公开链接的 FileKey 仅 16 字节(4 words,只有 AES 密钥本身),不含 MetaMAC;而校验函数要求至少 8 words(32 字节,含 nonce + MetaMAC),不满足直接判定失败 → 状态错误、不重命名。只有文件夹 API 返回的 32 字节 node key 才真正含 MetaMAC,误报集中在最常见的单文件链接场景
  2. 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_UPDATE2.4.1
  • docs/version.xml2.4.1.0

Full Changelog: v2.4.0...v2.4.1

Full Changelog: v2.4.0...v2.4.1

v2.4.0 - 全面 Bug 修复

Choose a tag to compare

@a1175815821 a1175815821 released this 13 Aug 20:08

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.AgregarPaquetebgwComprobarMaxConexiones 两处 Mutex 加 Try/Finally
  • 下载 worker 未 DisposeFileDownloader.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 注释掉的 DecryptFilecipherData
  • 删除 Conexion 注释的 GetAppID 和无调用的 LeerNodo

版本号

  • Assembly / FileVersion → 2.4.0.0
  • InternalConfig VERSION_MEGADOWNLOADER / VERSION_UPDATE2.4
  • docs/version.xml2.4.0.0

Full Changelog: v2.3.0...v2.4.0

v2.3.0

Choose a tag to compare

@github-actions github-actions released this 13 Aug 04:38

Full Changelog: v2.2.1...v2.3.0

Full Changelog: v2.2.1...v2.3.0

v2.2.1

Choose a tag to compare

@github-actions github-actions released this 09 Aug 14:22

Full Changelog: v2.2.0...v2.2.1

v2.2.0

Choose a tag to compare

@github-actions github-actions released this 19 Jul 17:05

Full Changelog: v2.1.0...v2.2.0

v2.1.0

Choose a tag to compare

@github-actions github-actions released this 19 Jul 15:49

Full Changelog: v2.0.0...v2.1.0