卧槽!迅雷的代码竟然被扒了精光!

vscode突然连不上服务器了,以前都可以的,并且ssh等其它方式是可以连接到服务器的 过完年回来准备开工干活,突然发现vscode连不上服务器了,奇了怪了,年前都可以的,看了一下报错,如下,发现原来是code-server执行不起来。需要glic2.28而实际上的是2.27,嗯哼,原因找到了。当然它并没有解决我的问题,但是却让我发现了问题所在,我在win10系统命令窗口中输入,因为我服务器不能动,所以采用了另外一种方案,给vscode降低版本,想想就扯淡,百度了一下,搜索到一篇文章具有很大参考价值,vscode官方解决方案,然后在服务器中执行, 阅读详情

点击关注下方公众号,架构师全套资料 都在这里52d20a3f55066e14790e32580ad76894.png

0、2T架构师学习资料干货分享

上一篇:一个悄然成为世界最流行的操作系统

大家好,我是互联网架构师。

来源:juejin.im/post/6890344584078721031

背景

之前扒过飞书的源码,从代码设计架构层面里里外外学习一把,飞书还是挺 “大方” 的,源码在客户端和网页端都一览无余,不过好像新版本已经看不到了。相关的文章由于在内网技术论坛发过了不便于再发出来(泄露内部资料会被查水表的),因此这次周末抽时间换一个鸟窝来掏一掏。

一不小心发现迅雷的客户端竟然也是基于 Electron 开发的,那代码就好扒拉了。(先吐槽一下这新版本的某 lei 为什么要抄钉钉的界面,这些年某 lei 都不知道自己要干什么了,每个版本都招人嫌)。

5d7a4d0a26de680418bcf4d25f8173ff.png

拆解篇

1、一点背景知识说明

基于前端技术栈 Electron 构建的桌面应用,本质上都是加载本地前端资源文件,而这些文件通常是用 asar 格式(类似 windows iso 镜像)的方式进行打包,然后运行时再通过挂在到内存实现前端资源文件 js/css/html/img 等文件的读取。

这么说 asar 想办法挂载就可以随意阅读源码了吗?不是的。同时 asar 会提供一套通过加密方式防止任意解压,飞书就是这么做的,直接通过 asar extract 的方式无法解包出来。但是由于 node 端和 rust 构建的二进制文件如果打包到 asar 会导致无法链接到这些二进制文件,因此需要从 asar 中独立出来,因而导致有部分 js 文件仍然裸露在外面。不过即便没有任何 js 是暴露的仍然是有办法爆破的。

啊,跑偏了,先不谈飞书,今天的主菜是迅雷。

那迅雷的前端资源文件是怎么管理的呢?

39c57cea1397ccccab358c35d7990331.png

是在下想多了,不好意思,迅雷梅川酷子,都摊着在那呢,根本没用 asar 打包 / 加密。

2、开撬

既然 js 都暴露了,也没什么好绕的,直接植入代码吧。我们都知道 Electron 是有 render 进程和 Node 进程的,接下来这一步需要猜猜看哪个文件是负责 render 主进程的?

好吧不用猜,名字都非常人类可读,就 main-renderer(主窗口渲染进程)。打开找到 html 文件(js 也可以)插入如下这串。

4e4f4d5b5baa2e21a0151d2d0e532a4c.png

双击启动,调试窗口出来了,可以大致看到整体页面结构了。

ab8b9af3abd5794e81504178ae1ec6db.png

然后看了一下,迅雷的悬浮小圆圈和主窗口,分别用一个 BrowserWindow 来实现。另外搜索公众号互联网架构师后台回复“2T”,获取一份惊喜礼包。有趣的是那个小圆圈窗口其实并不小,鼠标悬停出来的那个浮窗也是它的一部分,为了让小圆圈在屏幕的任何位置都可以看到悬浮窗,所以整个小圆圈的 BrowserWindow 是大约 4 倍的悬浮窗口大小。

0523c2aff3ac2937d40175d20927b2ee.png

独立窗口的检视界面 - 窗口实际是 4 倍 浮窗大小,灰色部分全都是这个 “小” 浮窗所使用的 BrowserWindow 区域。

d592017b272f84ac65376c08fc4becf1.png

3、一点防御措施

从代码来看,nodejs 进程只有一个文件 main.js ,是 webpack 的构建产物,看源码这里的 BrowserWindow 的 webPreference 参数是把 devTools 禁用掉的,导致直接在命令行里敲 openDevTools 是不能检视任意窗口的。

41c404d416b9ebef2a91868788b48f63.png

当然了,这里即便是混淆过了也没关系,毕竟还是明文,把 1 改成 0,把它打开就好(双叹号 /true/1 啥都行,开心就好)。不过由于迅雷的窗口实在是太多了,下载弹窗是独立窗口,选择文件夹是独立窗口,各种广告窗口也是,需要改的配置点很多,这里就不列了,总共有 10 个窗口,这个配置点按需打开(批量替换也行,谨慎操作就行)。

进程结构

呃…… 然后要干啥…… 好像也没什么好看的了,代码是混淆过的,也没有 map 文件。而且前端部分的代码也没什么技术含量可以说的,哪个 web 页面都那样。那看看进程分工吧。

1、进程树

在进程树里可以看出来,几乎全部的进程都是 Thunder.exe,可见 Thunder.exe 作为进程派发入口(类似 server 的网关,而并不直接是业务本身),用户启动的时候传参是 --StartType:DesktopIcon,随后它唤起了两组进程,一组是 Electron main 进程,main 进程唤起相关的 renderer;然后是下载的 SDK 服务 DownlaodSDKServer。

那么迅雷的进程关系差不多是清楚了:多个 Electron 窗口,对应一个 DownloadSDK。

9b7f01e81b3cd3d75f178f870bd8dbf1.png

2、通信方式

那么 Electron 的进程(甭管 main-process 还是 renderer-process,统称 electron 进程) 和 DownloadSDK 是如何通信的呢?

进程间通信一般都是依靠 ipc 管道的形式来实现。不过迅雷似乎没按套路来,它的 DownloadSDK 是控制台程序,意味着很有可能是通过 stdio 的方式来进行交互的(后续证明不是)。

通过观察进程打开的句柄,看到很诡异的一个现象:DownloadSDK 并没有打开任何 ipc 管道,反倒是前端进程打开了一个。

91dddef68be40d92c9d8a0211584e7fb.png

3、前端的 ipc

而 Electron 打开的这个 handler 进程名称,查了一下,竟然全是 Electron 进程使用的,而且是所有进程。

7fb11b195f948a3b8b7880b4f7db3528.png

那么不妨做出一个大胆的推测:前端多窗口之间是靠自建的 ipc 通道实现的,而 ipc 是 1 server 对 N client 的方式,那么 server 很有可能就是在主窗口上的,也就是前文看到那个及其明显的 main-renderer 进程,通过控制台查看,确实如此,nodejs 的 net 方式创建了一个 server,并且将一个叫做 __xdasIPCServerInstance 的对象暴露在全局环境供前端 js 调用,也即 jsapi。

246ee451c2fa2018c05574526d94f9ce.png

而小窗口并不存在上述 server 实例,而相对应的有一个 client 实例。

48ade11141b399f540d8d0719c9aa528.png

4、和 DownloadSDK 的通讯方式

这样看起来就很奇葩了,前端进程之间是通过自建的 ipc 管道通信的,但是并没有跟 DownloadSDK 有任何通信管道,难道它俩是心有灵犀无言自通?啊这…… 程序员是唯物主义的!

那怎么查它到底是怎么跟前端进程交互的呢?既然前端暴露了 server sdk instance,那意味着 DownLoadSDK 肯定是以一种 proxy 的方式暴露在这上面作为 jsapi 的。另外搜索公众号互联网架构师后台回复“2T”,获取一份惊喜礼包。可以拿【创建一个下载任务 api】来顺藤摸瓜。看了主窗口的 server instance 一下果然有这个方法:createTask ,应该就是前端用于创建下载任务用的 api。

1f321cf681349dd2510f12ffdea6cfef.png

chrome 浏览器里查代码不方便,转战 vscode 看源码,搜索 createTask 这个函数的声明位置,看到这一段(篇幅控制,此处删减了部分代码)。

createTask(e, t) 
{return n(this, void 0, void 0, function* () {          
.....          }
switch (e) {
   case h.DownloadKernel.TaskType.P2sp:         
...case h.DownloadKernel.TaskType.Bt:             
...case h.DownloadKernel.TaskType.Emule:             
...case h.DownloadKernel.TaskType.Group:              
...case h.DownloadKernel.TaskType.Magnet:             
...default:              
  i = !1;}
  return(            
... _.fireTaskEvent(h.DownloadKernel.TaskEventType.TaskCreated, [          );        });      }

没跑了,证实了我前面的猜想,这个 __xdasIPCServerInstance 就是 download sdk 封装到前端的 proxy。

继续查,这个 fireTaskEvent 是怎么处理的,阅读代码过程繁琐按下不提,就看这两段代码 (有删减整理)。

// 片段一
(e.getDownloadSdkVersion = function () {
let e = a.join(__rootDir, "../bin/SDK/DownloadSDKServer.exe");
return v.getFileVersion(e);
}),
// 片段二
y = l.default(o.join(__rootDir, "../bin/ThunderHelper.node"));
let F = "/ssdkver " + u.DownloadKernelManager.getDownloadSdkVersion();
B.push(F)
y.shellExecute(0, "open", o, B, H, "SW_SHOW");

很显然,DownloadSDK 是通过一个 ThunderHelper.node 的 nodejs addon 模块来启动、通信的。

我们知道,nodejs 可以通过 ffi 等方式实现内存共享,以达到两个进程不需要通过 pipe/sock 等管道就达到通信的目的。而通过工具观察 Thunder.exe 的唤起关系、句柄关系,两者的关系就更加一目了然了:ELectron 前端进程加载 DownloadSDK 进程,并且通过 \Sessions\5\BaseNamedObjects\xx@22123720|SendShareMemory 这种内存通道来实现的通信,句柄一一对应上了。

082983ab0a5fa74ca8b54f92ef825c9d.png

总结

扒拉了半天,扒完了有点空虚是怎么回事?

以上是纯粹技术挖掘,没有破坏到迅雷的核心机密,仅做学习交流使用哈~

迅雷下载引擎SDK 这是我再三考虑之后才决定把资源共享出来,由于资源分数太少,我曾经删除过一次。我工作的原因,一度需要用到大量资源下载,曾经的迅雷COM组件用过,但无法达到无人值守,需要人工干预。曾经我的一个同事就天天盯着迅雷长达半年,终于在迅雷官方关闭SDK申请之前被我找到了这个可用的SDK,至今我们的系统中主力传输仍用的这个引擎,我是用C#调用的。我相信网路上依然有这个资源,只不过非常难寻了。我们曾经一度计划给迅雷写信,希望通过商务沟通或购买的方式能给我们提供这个SDK。但对方不予理会。现在我分享出来,但文档中不包含示例,是纯引擎文件;示例我会在公布。所以需要下载的你请谨慎考虑是否要用到,我不希望该资源被泛滥。所以我设置的分数比较高。 立即下载

相关推荐

迅雷下载工具(java

支持多线程下载,界面以及功能类似迅雷。内附源代码和用java生成的.exe文件。欢迎下载。

AT命令集

AT命令集AT命令使计算机或终端与调制解调器通讯。通讯软件是你与调制解调器间的交接口方法,请阅读这一章您可以按照自己的需要设置您的调制解调器 装入通讯软件包并进入终端或交互模式后,就可以发出工业标准AT指令了,(请参阅通讯软件手册)。所有命令行必须由ASCII字符“AT”开始并由 <Enter> 结束。除了A/指令和推出(缺省为+++)。这些将在后面讨论。字母"AT"用以提醒...

andytian1987的博客 333

迅雷下载引擎SDK(C#版Demo)

请原谅我把该资源设置了这么高的分数,因为实在是花了我不少时间才得到,请理解和尊重我的劳动成果。这份DEMO就是针对资源《迅雷下载引擎SDK》写的一个调用示例。并非我项目的代码,我自己的系统已经把这个资源构建成了主力传输的核心。不方便共享。代码中包含的仅是如何调用迅雷引擎及完成下载,其余的就小伙伴自行发挥了;特别提示:该版本的SDK仅支持http协议的资源下载。部分https的资源也可以下载,不支持迅雷或BT协议的资源;

python下载电影包_我是如何使用python控制迅雷自动下载电影的?

写了一个脚本爬取了阳光电影的豆瓣高分电影,需要用迅雷帮我一部一部的自动下载好,供我无聊时观看.为什么要一部一部的下?因为中国移动送了我一张无限流量卡,结果才用了5个G我就被限速到 100kb/s 了,不能忍 不能浪费.遂生出用来给电脑开热点下电影的想法.100kb的网速也只能一部一部下了.完事开头难,我需要知道是否能用命令行控制迅雷下载电影,百度了下,OK,没问题然后思考了一下,画了个流程图下载流...

weixin_35843410的博客 2726

DownloadSDKServer.exe 是什么,DownloadSDKServer.exe 内存占用高怎么办

详细文章地址: http://www.xiazaiba.com/jiaocheng/9313.html

轻风细雨_林木木 2万+

卧槽迅雷代码结构被了精光

那么不妨做出一个大胆的推测:前端多窗口之间是靠自建的 ipc 通道实现的,而 ipc 是 1 server 对 N client 的方式,那么 server 很有可能就是在主窗口上的,也就是前文看到那个及其明显的 main-renderer 进程,通过控制台查看,确实如此,nodejs 的 net 方式创建了一个 server,并且将一个叫做 __xdasIPCServerInstance 的对象暴露在全局环境供前端 js 调用,也即 jsapi。既然 js 都暴露了,也没什么好绕的,直接植入代码吧。

m0_74931226的博客 1644

Win系统svchost进程流量偷跑,如何永久杜绝?

关闭Background Intellgent Transfer Service服务以防止操作系统利用闲置带宽下载系统内容

m0_37176248的博客 9201

卧槽迅雷代码结构竟然被了精光!

点击上方“码农突围”,马上关注这里是码农充电第一站,回复“666”,获取一份专属大礼包 真爱,请设置“星标”或点个“在看”来源:juejin.im/post/6890344584078721031# 背景之前过飞书的源码,从代码设计架构层面里里外外学习一把,飞书还是挺 “大方” 的,源码在客户端和网页端都一览无余,不过好像新版本已经看不到了。相关的文章由于在内网技术论坛...

欢迎关注公众号:【码农突围】,回复9999,可以获取一份LeetCode刷题笔记 270

代码安全检视方法有_卧槽迅雷代码结构竟然被了精光!

公众号关注“GitHubDaily”设为 “星标”,每天带你逛 GitHub!作者:jiawen链接:juejin.im/post/6890344584078721031# 背景之前过飞书的源码,从代码设计架构层面里里外外学习一把,飞书还是挺 “大方” 的,源码在客户端和网页端都一览无余,不过好像新版本已经看不到了。相关的文章由于在内网技术论坛发过了不便于再发出来(泄露内部资料会被查...

weixin_36360511的博客 185

卧槽,入职 3 天就“偷”代码,备份 6300 个 Python 脚本,不讲武德啊

code小生一个专注大前端领域的技术平台公众号回复Android加入安卓技术群贾浩楠 发自 凹非寺量子位 报道 | 公众号 QbitAI一名刚刚入职特斯拉的工程师,工作干了才十多天,就...

weixin_38754349的博客 170

突发!Spring Cloud 爆高危漏洞。。赶紧修复!!

点击关注公众号,回复“2T”获取2TB学习资源!互联网架构师后台回复2T有特别礼包上一篇:卧槽迅雷代码竟然被了精光!Spring Cloud 突发漏洞Log4j2 的核弹级漏洞刚...

emprere的博客 535

网盘界的灭霸!一个工具打通50+存储,手机电脑秒变超级资源库

AList是一款逆天网盘管理神器,可聚合20+国内外主流网盘(百度云、阿里云、Google Drive等),支持在线播放视频、文档预览、批量转存等。通过WebDAV可将云盘挂载为本地硬盘,还提供加密分享、访客上传等黑科技功能。使用Docker三行命令即可部署,适合追剧党、打工人多场景使用。开源免费,但需注意账号安全风险。(字数:149)

weixin_44626085的博客 564

开脑洞 | 走夜路之遇见僵尸,程序猿怎么办?

网易视频云网易视频云是网易倾力打造的一款云服务产品,提供稳定流畅、低时延、高并发的视频直播、录制、存储、转码及点播等音视频的PAAS服务,在线教育、远程医疗、娱乐秀场、在线金融等各行业及企业用户只需简单的开发即可打造在线音视频平台。   凌晨1点, 拖着疲惫的身躯,带着熬夜的黑眼圈和修完Bug的小开心。 程序猿走在回家的小路上。 凉风袭来,朦胧间,看到前方也有一个略显佝偻的身影。 这个

vcloud_163的博客 687

造轮子 之 悔青肠

研究GUI已经有段时间了,从13年大一刚开始学习编程就深深地被漂亮的界面所吸引,以至于至今还是个屌丝。当时觉得360好炫酷啊!QQ好炫酷啊!迅雷好炫酷啊!。。。!然而我当时还是一个只会使用VB的小白,做出来的东西low之又low,但是激情四射啊,自己通宵做了一个又一个的垃圾*-*,还感觉很牛叉的样子,现在想想很是怀念啊!。言归正传,大概在14年的时候看群里的一个网友发了一个看上去特表漂亮的界面,哇...

u013494756的博客 175
上一篇: 程序员写三十行代码,被应届生怼:我能三行搞定!也配叫程序员?
下一篇: 这首歌,竟然是AI生成的,太狠了...
互联网架构
博客等级 码龄7年 609粉丝 · 18原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值