探秘app.asar

2023-11-07

开发过Electron客户端的都知道,在package.json的build节点下,如果设置"asar": true,软件打包时会把程序文件合成为一个app.asar文件。软件安装后,可以在安装目录的resources子目录下找到它。

// package.json
  "build": {
    ...
    "asar": true,
    ...
  }

app.asar看起来是一个压缩包(像.zip或.7z),有些神秘兮兮的。而事实上,它只是一种打包格式,只是把一个个文件拼接起来,并没有做任何压缩。因为一个包里容纳了多个文件,需要对各个文件做索引,加上这些索引信息后,.asar文件大小实际上超过各个文件加起来的总和。有点小意外吧!

.asar的格式不是秘密,可以将它轻松还原。接下来,大家就跟着我一起演练一下吧(也可以到https://github.com/electron/asar 了解更多细节),分两步:

1. 全局安装asar插件:

npm install -g asar

2. 对指定的app.asar文件执行extract命令,格式为:

asar extract "<源路径>\app.asar" “<目标路径>”

以UX设计师常用工具Figma为例(访问网站www.figma.com,注册/登录后点击网页右上角的用户头像,在下拉菜单中选择“Get desktop app”,下载安装即可),执行如下命令:

asar extract "<你电脑上的安装路径>\Figma\app-108.1.0\resources\app.asar" D:\Test1

我们就可以把Figma的app.asar解开,释放到D:\Test1中。再去D:\Test1看一下,太惊喜了——一堆.js源文件呢!而且没有经过任何混淆,有兴趣的同学可以尽情研究一下人家的源代码!再进一步验证一下:app.asar文件大小是1.55MB,而D:\Test1下的所有文件大小是3.55MB,怎么回事?不是说.asar不做压缩吗?没错!回到Figma的安装目录,你会看到一个app.asar.unpacked目录,里面的文件正好是2MB。在执行asar extract命令的时候,它其实会把app.asar.unpacked目录下的文件一起拷贝到D:\Test1下。(小插曲:在演练的时候我踩过一个坑:因为app.asar的安装路径太深了,我先把它拷贝到D盘,然而在执行asar extract命令时报错了,说找不到app.asar.unpacked目录,哦……我明白了!)

接下来,我们再顺便探索一下其他Electron客户端软件吧。比如微软的Teams,对app.asar解包后,我们打开它的主程序入口文件main.bundle.js,看到如下内容:

!function(e,t){for(var n in t)e[n]=t[n]}(exports,function(e){var t={};function n(i){if(t[i])return t[i].exports;var o=t[i]={i:i,l:!1,exports:{}};

源代码显然是被混淆过的,对人类不太友好,直接放弃吧。再来看GitHub Desktop,有趣的是,在它的安装目录下没有app.asar,然后打开main.js,发现跟Teams类似也是做了代码混淆的。再来看一个叫Lofelt Studio的软件,把它的app.asar解包后,打开main.js看到代码也是被混淆过的,再打开package.json可以发现它是基于React框架开发的,通过webpack编译打包出来的.js文件自然就是这种效果啦。如果大家还意犹未尽的话,https://www.electronjs.org/apps 还有更多Electron App,说不定能探到宝哦!

本文即将收尾,我猜,大家心里可能还有个疑问:.asar既不做加密,也不做压缩,那它还有什么价值呢?没错!使用asar打包不是必需的,就像GitHub Desktop那样。而使用asar打包,网传也有一些好处,比如:如果我们的程序依赖的某些资源路径很深,而在Windows上对资源路径的长度是有限制的,路径过长就会加载失败,使用asar打包就能绕开这个问题;另外,程序运行时加载一个总的.asar文件,比起加载一堆零散的小文件,可以避免磁盘的频繁寻址,在性能上会有一些收益——我觉得,有道理~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

探秘app.asar 的相关文章

随机推荐

  • 操作系统复习知识点(第三章)

    处理机调度 1 高级调度 中级调度 低级调度 高级调度 根据某种算法 把外存上处于后备队列中的那些作业调入内存 作业调度 中级调度 为了提高内存利用率和系统吞吐量 使那些暂时不能运行的进程不再占用内存资源 将它们调至外存等待 把进程状态改为
  • HDU--1233:还是畅通工程 (并查集 & 最小生成树Prim)

    1 题目源地址 http acm hdu edu cn showproblem php pid 1233 2 简单思路 先对村庄距离从小到大排序 然后使用并查集的查找 一边查找一边加上村庄之间的距离 从而得到可以走通所有村庄的最短距离 3
  • 根据年月日计算星期几的函数

    大部分日期计算正常 2014 04 01 星期2 计算出来的星期不正确 原因 计算出来的 w可能出现负值 求负数的余数需要特殊处理 需要按数论的计算方式求余数 网上很多代码存在此问题 少数日期计算不正确 解决 负数先转为正数求余 然后求补
  • Android源码编译环境搭建

    一 前言 Google自 2021 年 6 月 22 日起 不再支持在 MacOS 上进行Android平台开发 某些芯片厂家提供的Android SDK不支持低版本的Ubuntu 16 04 LTS及以下 故本篇文章以Ubuntu18 0
  • GNU AWK

    awk awk官方给出的是 pattern scanning and processing language即模式扫描处理语言 我们CentOS一般用的是GNU AWK 官方给出的语法有五种 我们只举例前两种使用格式 下面是语法 gawk
  • 使用java geotools进行坐标转换

    java geotools支持不同的坐标系之间进行转换 只需要转换的时候指定坐标系即可 pom依赖文件如下
  • 现在的00后,实在是太卷了

    现在的小年轻真的卷得过分了 前段时间我们公司来了个00年的 工作没两年 跳槽到我们公司起薪18K 都快接近我了 后来才知道人家是个卷王 从早干到晚就差搬张床到工位睡觉了 最近和他聊了一次天 原来这位小老弟家里条件不太好 一大家子指望他一个人
  • Vulnhub入门实战-Wakanda

    下载链接 描述 1 探测主机的IP地址 2 使用nmap查看靶机开放端口 开放了4个端口 老样子先从http下手 3 进去发现没什么可以点的 于是进行目录扫描 状态码都是200 但是size为0 所以返回的都是空页面 查看主页源代码 发现一
  • Scrapy----Scrapy架构及工作流程

    原文链接 Scrapy Scrapy架构及工作流程 一 Scrapy架构图 scrapy的架构图如下 红色箭头表示工作流程 二 Scrapy的组成 Scrapy Engine Scrapy Engine主要用来协调数据流在Scrap各个组件
  • [蓝桥杯][2014年第五届真题]兰顿蚂蚁

    题目 题目链接 题解 DFS 没什么难的吧 可能实现的时候用时长短 代码简洁程度不同而已 代码 include
  • 《响应式Web设计实践》学习笔记

    第1章 无处不在的Web 1 4 成为响应式的 Ethan Marcotte利用三种已有工具 媒介查询 media queries 流动布局 fluid grids 和自适应图片 scalable images 创建了一个在不同分辨率屏幕下
  • 每日一道基础编程题目(牛客网)--基础编程篇(NO.1)

    文章目录 1 每日一道基础编程题目 牛客网 前言 题目引入 结语 1 每日一道基础编程题目 牛客网 前言 从今天起 我会日更一些编程题目 比较基础的 适合期末复习的题目 分享给大家 和大家一起进步 题目引入 首先我们先看一下这个代码 这个的
  • 邻桌为何一天就学完了SQL基础语法,数据分析必学的SQL,满满硬货

    因为开学原因 导致好久没有更新博客了 谁家大学生一周五天早八 今天这篇分享数据库操作和 SQL SQL 全称是 Structured Query Language 翻译后就是结构化查询语言 是一种数据库查询和程序设计语言 用于存取数据以及查
  • Eclipse SVN 更新报: “is too old(format10,createdbySubversion1.6)”解决方法

    原因 版本太低导致 更新一下就可以了 方法 项目上右键 Team upgrade
  • android 模拟点击localinstrumentation,android通过Instrumentation来模拟键盘点击操作

    android app Instrumentation好像原来是用来做测试的 可以用来模拟很多activity的操作 主要代码如下 package com qefee testinstrumentation import android a
  • 常用git和repo命令

    常用git和repo命令 文章收集了最近使用的一些repo和git命令 下图是个人理解的git文件状态转换图 更详细的Pro git 文档 更准确的应该是这样 相关概念 名称 意义 repo 谷歌用Python脚本写的调用git的一个脚本
  • 自动化测试_49自动化测试中最常见的Selenium异常

    自动化测试 开发人员将始终在编写代码时牢记不同的场景 但是在某些情况下 实现可能无法按预期工作 相同的原则也适用于测试代码 该代码主要用于测试现有产品的功能 发现bug并使产品100 无缺陷 正确地说 真理总是比小说更陌生 当您执行Sele
  • matlab 杨氏双缝干涉实验

    目录 一 算法原理 二 代码实现 三 结果展示 本文由CSDN点云侠原创 原文链接 如果你不是在点云侠的博客中看到该文章 那么此处便是不要脸的爬虫 一 算法原理 杨氏双缝干涉实验是利用分波振面法获得相干光束的典型例子 如图1 所示 在普通单
  • 系列:7、 Kubernetes 安全性

    Kubernetes 安全性 我们将讨论 Kubernetes 安全性 当我们在使用 Kubernetes 时 出于安全原因 我们有时会希望限制网络的访问或限制某些用户查看或运行某些命令等 为此 我们必须使用不同的 Kubernetes 概
  • 探秘app.asar

    开发过Electron客户端的都知道 在package json的build节点下 如果设置 asar true 软件打包时会把程序文件合成为一个app asar文件 软件安装后 可以在安装目录的resources子目录下找到它 packa