【Electron 应用安全测试基础】Electron 框架介绍

news/2025/1/14 19:17:43/文章来源:https://www.cnblogs.com/o-O-oO/p/18671433

免责声明

⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权!

一、引言

跨平台桌面应用开发的演进带来了一系列独特的挑战,主要体现在如何确保在 Windows、macOS 和基于 Linux 的系统等不同操作系统上功能和用户体验的一致性。从技术角度来看,实现这种一致性是保持应用平稳和令人满意的用户体验的关键,这自然需要开发者掌握多种技术并为每个平台维护独立的代码库。
随着时间的推移,出现了多种框架来帮助开发者克服这些挑战。其中一个值得关注的解决方案是 Electron 框架。它为简化跨平台开发流程并解决多样化运行环境固有的复杂性提供了灵活的平台。
近年来,Electron 框架的流行度显著上升,其被广泛应用于各种知名应用程序中,如 Notion、Microsoft Teams 和 Slack 等。这种广泛的使用间接证明了 Electron 在简化跨平台开发工作流程以及应对多种操作环境挑战方面的高效性。

1.1 什么是 Electron

那么,什么是 Electron?简单来说,Electron 是一个开源框架,专为构建桌面应用而设计。它允许开发者使用常见的 Web 技术(如 JavaScript、HTML 和 CSS)来创建桌面应用,而无需学习新的编程语言。这意味着已经熟悉 Web 开发的开发者可以无缝过渡到使用 Electron 构建桌面应用程序。

1.2 它是如何工作的?

基本上,Electron 应用的流程始于主进程(Main Process),该进程由 Node.js 运行时启动,通常基于 package.json 文件中的配置开始运行。主进程负责应用的后端操作,例如创建窗口和管理系统级交互。

随后,主进程会创建渲染进程,每个渲染进程都会运行一个 Chromium 实例。这些进程负责前端工作,渲染 HTML、CSS 和 JavaScript 等网页内容,用于显示应用的用户界面。
为了实现主进程与渲染进程之间的通信,Electron 使用了进程间通信 (IPC)。在这一阶段,渲染进程可以请求主进程执行需要与操作系统原生集成的操作,而出于安全原因,渲染进程本身被限制无法直接执行这些操作。
注意:想要全面了解和探索 Electron 框架,可以访问以下链接:Electron 官方文档[1]。
现在,在了解了 Electron 框架的基本概念之后,让我们继续下一部分,构建第一个简单的“Hello-World”应用程序。

二、 构建第一个简单的“Hello-World”应用程序

正如我们所知,为了能够进行高效的安全测试,我们需要对测试对象的基本原理有深入的了解。因此,在本节中,我们将尝试使用 Electron 创建一个简单的“Hello-World”应用程序(它将显示一个一级标题大小的简单文本,并弹出一个简单的警告对话框)。

2.1 准备开发环境

1、安装 Node.js

首先,我们需要在开发环境中安装 Node.js。

为什么需要安装 Node.js 呢❓简单来说,Electron 框架依赖于 Node.js,这是一个 JavaScript 运行时环境,允许我们在服务器端运行 JavaScript。通过 Node.js,我们可以编写不仅在浏览器环境中运行的 JavaScript 代码,还可以在服务器端运行的代码。这使得我们能够创建支持多种功能的服务器端应用,比如文件管理、访问数据库以及处理 HTTP 请求。
在 Electron 的上下文中,Node.js 用于运行主应用进程。这使我们能够访问操作系统功能,从而使用 Web 技术创建功能强大的桌面应用程序。

要下载 Node.js,可以访问其官方网站:https://nodejs.org[2]。在那里,我们可以下载适合自己操作系统的安装程序。下载完成后,按照提供的安装说明,即可在计算机上完成 Node.js 的安装。
为了确保 Node.js 已成功安装,可以通过终端/命令提示符执行以下命令:

2、设置项目目录

与创建任何应用程序一样,在第二步中,我们需要为我们的 Electron 项目创建一个新的目录。

为此,我们只需创建一个目录,并为我们的项目命名(例如:my-electron-app),然后进入该目录。
3、初始化项目
在设置项目目录之后,下一步是通过创建一个 package.json 文件来初始化项目。该文件实际上是项目的清单,包含重要的元数据和配置。
实际上,我们可以通过在项目目录中的终端或命令提示符运行以下命令生成此文件:npm init -y
执行该命令后,将自动生成一个带有大多数参数默认值的 package.json 文件,如下所示:

{"name": "my-electron-app","version": "1.0.0","description": "","main": "app/main.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"keywords": [],"author": "","license": "ISC"
}

以下是每个参数的通用说明:
name: 代表我们的项目或包的名称,它在 npm 注册表中唯一标识我们的项目。在此示例中,项目名称为 “my-electron-app”。

version: 项目或包的版本号。它有助于跟踪项目的更改,并确保可以管理和下载不同版本。

description: 项目或包的简短描述。它可以帮助其他人了解项目的目的和功能。

main: 项目的主文件或入口点。它是项目启动时首先执行的 JavaScript 文件。在本示例中,主文件设置为 “main.js”,位于 app 目录中。需要注意的是,app 目录并不是必须的,它只是为了更好地组织项目结构的推荐做法。实际上,我们可以根据自己的喜好使用不同的目录名称。

scripts: 一个可以通过 npm 执行的脚本列表,通常用于运行测试、构建或启动应用程序等任务。
但是,对于 Electron 应用程序来说,主入口点通常是一个名为 “main.js” 的文件,因此我们需要调整此值以匹配 Electron 项目的结构。

在这种情况下,scripts 的值需要更改为:

"scripts": {
"start": "electron ."
},

通过这一调整,我们之后可以通过运行 npm start 命令启动应用程序,该命令将以 main.js 文件作为主入口点启动 Electron 应用程序。
keywords(关键字): 关键字主要用于对项目或包进行分类,方便他人轻松找到该项目。

author(作者): 项目作者的姓名或身份,可以是个人的名字,也可以是负责该项目的组织名称。

license(许可证): 项目所使用的许可证,规定了他人如何使用、修改和分发该项目。
总结来说,这些参数的值并不是固定的,而是可以根据我们的开发需求进行调整。
以下是修改后的 package.json 示例,其中调整了 scripts 部分:

{"name": "my-electron-app","version": "1.0.0","description": "","main": "app/main.js","scripts": {"start": "electron ."},"keywords": [],"author": "","license": "ISC","devDependencies": {"electron": "^29.1.2"}
}

4、 安装 Electron

在安装了 Node.js 并创建了项目目录后,下一步就是安装 Electron。如前所述,Electron 是一个框架,它允许我们使用 HTML、CSS 和 JavaScript 等 Web 技术构建跨平台桌面应用程序。
因此,要安装 Electron,我们可以通过终端使用 npm(Node Package Manager),它随 Node.js 一起捆绑提供。在安装时,我们有几种选择,但这里将重点介绍两种常见的安装方式:
A、全局安装(Global installation): 如果我们希望 Electron 在整个系统范围内可用,并能从任何目录中访问,可以执行以下命令:

npm install electron -g

此命令将 Electron 全局安装在我们的操作系统上,使我们可以从任何位置访问 Electron CLI(命令行界面)。全局安装确保我们能够创建新的 Electron 项目并运行其他与 Electron 相关的命令,而不受特定项目目录的限制。
B、本地安装(Local installation): 然而,如果我们希望 Electron 仅在特定的项目目录中可用,并将其作为开发依赖项对待,可以使用以下安装命令:

npm install electron - save-dev

这个命令将 Electron 安装为我们项目的开发依赖。这意味着 Electron 将被包含在项目的 package.json 文件中的“devDependencies”部分。采用这种方式,当应用程序发布时,Electron 会自动被排除,确保仅在需要开发时才安装。
简而言之,通过将 Electron 作为开发依赖进行管理,我们可以简化部署过程,并确保我们的应用程序可以轻松地分发并在其他机器上运行,而无需单独安装 Electron。
总结一下,以下是两种安装模式的区别:

无论根据现有考虑选择哪个选项,在这一步中,重要的是确保 Electron 已经被安装。
【注意】:在这个流程中,我们将使用 --save-dev 标志来安装 Electron。如果仔细观察,采用这种方式安装 Electron 会将 devDependencies 参数添加到 package.json 文件中。

2.2 创建应用程序

1、创建主应用程序
在配置好必要的设置后,下一步是为我们的 Electron 项目创建主应用程序文件。这个文件作为我们 Electron 应用程序的入口点,在这里我们定义应用程序的行为和功能。
那么,我们该如何操作呢?首先,我们需要创建一个名为“main.js”的文件,如子节 2.1.3 中所提到的,并将其放置在“app”目录下。

之后,我们可以使用喜欢的文本编辑器打开 main.js 文件,并开始编写简单的代码来创建将加载 index.html 文件的应用程序窗口。
【注意】:这段 main.js 代码通常包括 Electron 的初始化、创建窗口、处理事件和其他应用程序逻辑。

const { app, BrowserWindow } = require('electron');
const path = require('path');function createWindow() {const win = new BrowserWindow({width: 800,height: 600,webPreferences: {nodeIntegration: true}});win.loadFile(path.join(__dirname, '../index.html'));
}app.whenReady().then(createWindow);

那么,这段代码是什么意思呢?
首先,我们从 Electron 中导入了必要的模块,包括 app 和 BrowserWindow。
接下来,我们尝试定义一个函数 createWindow(),用于为我们的 Electron 应用程序创建一个新的浏览器窗口。
在 createWindow() 函数中,我们创建了一个新的 BrowserWindow 实例,并指定了窗口的宽度、高度和网页偏好设置。
最后,我们尝试使用 loadFile() 方法将一个 HTML 文件(例如:index.html)加载到新创建的窗口中。
确保我们也在项目目录中创建了 index.html 文件,因为它在上述代码中被引用。
因此,随着 main.js 文件的创建和初始应用程序逻辑的定义(例如:浏览器窗口和加载文件),我们已经为 Electron 应用程序奠定了基础。我们现在可以继续编写额外的代码,以根据需要构建应用程序的功能。

2、创建并编写 index.html 内容
最后,我们到达了构建这个简单 hello world 项目的最后一步,即添加 index.html 文件中的内容。这个 HTML 文件将作为我们 Electron 应用程序的用户界面,定义用户看到的内容以及与之交互的部分。
注意:我们还会看到这一步如何展示 Electron 如何利用常见的 Web 技术,如 JavaScript 和 HTML,来创建桌面应用程序,而不需要开发者学习新的编程语言。
为了实现这一点,简单地创建一个名为 index.html 的新文件,并将其放置在项目的根目录中(而不是放在 app 目录中)。
在我们的例子中,目录将是 “my-electron-app”。

<!DOCTYPE html>
<html>
<head><title>Example of Electron App</title><script>window.onload = function() {alert("Hello World");};</script>
</head>
<body><h1>Welcome in our first Electron App!</h1><p>This is just a sample paragraph.</p>
</body>
</html>

在这个例子中,我们提供了一个基本的 HTML 结构,包含一个标题和一个段落。此外,我们还包含了一个 JavaScript 函数,当文档加载时触发一个警告消息,简单地演示了 JavaScript 如何与 Electron 环境进行交互。是的,我们可以根据应用程序的具体需求修改 HTML 文件的内容。
一旦我们在 "index.html" 文件中创建了内容,我们就完成了简单 Electron hello world 应用程序的设置。随着 Node.js 安装、项目目录配置、package.json 初始化、Electron 安装以及主应用程序文件的创建,我们现在准备执行我们的 Electron 应用程序,并在 Electron 窗口中查看显示的 hello world 消息。

2.3、 运行和构建应用程序

1、运行 Electron 应用程序
要运行我们的 Electron 应用程序,我们需要确保仍然在项目目录中(在本例中是 my-electron-app)。
之后,我们执行以下命令:

npm start

这个命令将根据 package.json 文件中指定的配置启动 Electron 应用程序。默认情况下,npm start 命令将在 package.json 文件的“scripts”部分中查找一个名为 “start” 的脚本(回顾一下我们在子节 2.1.3 中调整的参数),并执行它。
如果之前的步骤都已正确执行,我们现在应该能够看到 Electron 应用程序正在运行,并且应用程序窗口显示了 index.html 文件中指定的内容,如下图所示:

2、 构建和分发应用程序
在经历了各种步骤之后,有些人可能会想知道这个应用程序是如何分发的,以及它是如何到达最终用户的。
当涉及到分发 Electron 应用程序时,我们需要确保应用程序为不同的操作系统和架构正确打包。这当然是为了确保用户可以轻松地在他们的设备上安装和运行应用程序,而不管他们的操作系统是什么。
例如,在 Windows 上,Electron 应用程序通常打包为可执行安装文件(例如 .exe.msi)。对于 Linux 发行版,Electron 应用程序可能会根据使用的包管理器打包为不同的格式(如 .deb.rpm 包)。与此同时,在 macOS 上,它们通常会打包成 macOS 应用程序包——通常是 .dmg 文件格式。
请注意,在本文中,我们将重点讨论为 macOS 构建应用程序。然而,在 Windows 或 Linux 上构建时生成的输出不会有显著区别。
那么,如何实现呢?为了创建这个 macOS(或任何其他操作系统)应用程序包,我们需要使用 Electron Builder,这是一个用于打包和分发 Electron 应用程序的工具。通过 Electron Builder,我们可以配置应用程序打包过程的各个方面,例如应用程序名称、版本、图标和分发格式。
首先,我们需要在项目中将 Electron Builder 安装为开发依赖。我们可以通过在终端或命令提示符中运行以下命令来完成:

npm install electron-builder --save-dev

【注意】:运行命令后,electron-builder 参数将自动出现在 package.json 文件的“devDependencies”部分。

一旦安装了 electron-builder,我们需要通过在 “scripts” 部分下添加 “package-mac” 和 “build” 脚本来重新配置 package.json 文件。基本上,这个脚本定义了我们 Electron 应用程序的构建配置选项。
以下是我们最终 package.json 文件的示例:

{"name": "my-electron-app","version": "1.0.0","description": "A simple Hello-World application","main": "app/main.js","scripts": {"start": "electron .","package-mac": "electron-builder --mac"},"keywords": [],"author": "YoKo Kho from HakTrak Cybersecurity Squad","license": "ISC","devDependencies": {"electron": "^29.1.4","electron-builder": "^24.13.3"},"build": {"appId": "com.yoko.my-electron-app","productName": "My Electron App","directories": {"output": "dist"}}
}

关于现有参数的其他说明如下:

appId”指定应用程序的唯一标识符。

productName”定义应用程序的显示名称。

directories”部分指定了打包后的应用程序将放置的输出目录。
配置好 electron-builder 后,我们可以通过运行以下命令启动打包过程:

npm run package-mac

这个命令将根据 package.json 文件中指定的配置,启动专门针对 macOS 的打包过程。打包过程完成后,我们将会在指定的输出目录(在本例中是“dist”)中找到打包后的应用程序文件。

随着 Electron 应用程序成功打包,我们现在拥有了一个可执行文件,可以分发给用户。用户可以在他们的设备上安装并运行该应用程序,从而享受应用程序的功能。
好了,我们几乎已经完成了这一部分。希望到目前为止,读者们已经对基于 Electron 的应用程序有了一个大致的了解。在下一部分,我们将开始探讨如何检测 Electron 应用程序的技术讨论,并概述常见的测试方法,这些方法通常用于测试这些 Electron 应用程序。

References

[1] Electron 官方文档: https://www.electronjs.org/docs
[2] https://nodejs.org: https://nodejs.org/

原创 白帽子左一

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/869211.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

07jdk7u21原生利用链

JDK7u21 反序列化的关键在于找到可以动态方法执行的代码:例如CC链中的Transformer,CB链中的PropertyUtils#getPropertyJDK7u21中动态方法执行的点,AnnotationInvocationHandler#equalsImpl中的hisValue = memberMethod.invoke(o)。 private Boolean equalsImpl(Object o) {i…

英语语法(介词和连词)

认识介词 例子: 例子: 识别介词 时间介词 at 精确的时间 by 不缺定的时间 for 持续的时间 in 固定的时间 on 某一天的时间 since 开始时间 until 直到 空间介词 at 指一个点 by 近的意思 from 从别处到这里 in 一个封闭的区域 off 离开 on 开启 out 方向 远离…

一文读懂如何创建食品加工和包装 SOP

在食品行业中,确保产品的安全性和质量是至关重要的。为了实现这一目标,建立一套详尽且高效的标准操作程序(SOP)对于食品加工与包装环节来说不可或缺。本文将引导您深入理解如何高效创建食品加工与包装SOP,并巧妙融入helplook工具,以提升流程管理的精确性和效率。一、明确…

高性能、零内存分配的Go日志库--Zerolog

简介 Zerolog 是一个高性能、零内存分配的 Go 日志库。 它为不需要垃圾回收的延迟敏感型应用程序提供结构化日志记录功能。 您可以以完全零分配的方式使用,这样在初始化记录器对象后,堆上不会再分配其他对象,从而防止触发垃圾回收。 Zerolog 包提供了一个专用于 JSON 输出的…

Jar Analyzer:JAR包分析工具

工具介绍 一个JAR包分析工具,批量分析,SCA漏洞分析,方法调用关系搜索,字符串搜索,Spring组件分析,信息泄露检查,CFG程序分析,JVM栈帧分析,进阶表达式搜索,字节码指令级的动态调试分析,反编译JAR包一键导出,一键提取序列化数据恶意代码,一键分析BCEL字节码。 Jar A…

第二十次作业

1、对bluecms进行代码审计,分析复现文件上传、ssti模板注入、文件删除等漏洞 文件上传:ssti模板注入: bluecms采⽤了smarty模板引擎可以在模板中插⼊恶意的代码,从⽽执⾏任意命令。此处可知smarty使⽤的界定符为{#和#},参考smarty官⽅⽂档可知,可以使⽤{#php#}code{#/php…

【JAVA开发】企业Java开发:七款提升开发者工作效率的Java分析工具

一、引言 编写正确的代码至关重要,但同样重要的是理解代码在实际环境中的表现。Java 分析工具在这方面提供了极大的便利,它们可以帮助您深入了解程序的内部运作。虽然进行性能分析可能需要额外的时间投入,但它最终能够为您节省大量调试时间。 Java 分析器提供了关于 CPU 使用…

JS-32 数组方法_shift()/unshift()

shift方法用于删除数组的第一个元素,并返回该元素。注意,该方法会改变原数组 var arr=[字符串,zifuchuan,前端]; arr.shift()//字符串 arr//[zifuchuan,前端] shift方法可以遍历并清空一个数组 var list=[1,2,3,4,5,6]; var item;while(item=list.shift()){ console.log(ite…

【勒索病☠】盘点全球主流Linux平台的勒索病毒

前言 美国网络信息安全公司CrowdStrike在2021年的攻击数据报告中,总结与2020年度相比,2021年度针对Linux系统的恶意软件增加了35%,其实最近几年针对Linux平台下的恶意软件数据一直在不断的增加,这些恶意软件主要包含僵尸网络、挖矿病毒、勒索病毒、远控木马等,随着云计算平…

再谈Redux

2025年再聊前端状态管理似乎是一件不必要的事,毕竟相关文章已堆积得如山如海。但在这些文章或视频内容中,我并没有找到自己喜欢的方案,准确的说是使用方式。所以这篇文章不做技术分析,主要聊聊个人对状态管理的理解,并分享独特的redux使用的方式。 状态管理 先分享一个有趣…

中考英语优秀范文-热点话题-传统文化-005 Our Schools Food Festival 我们学校的美食节

1 写作要求 中国饮食文化博大精深。假如你是李明,上周你校开展了以“品中华美食,传承中华文化”为主题的校园美食节活动。请你根据以下图示提示,用英语给你的英国笔友Mike写一封电子邮件,分享本次活动的过程和感受。 要求: 1 电子邮件的内容必须包括图示中的所有要点,可适…

嵌入Embedding-计算理解语言的钥匙

定义: 将人类语言与数字建立联系的强大方法 嵌入技术的演变: Wod2VecCBOW(Continuous Bag of Words):根据上下文词汇预测目标词汇(情感分析、文本分类、词相似性) Skip-Gram:根据目标单词预测周围单词 在训练Word2Vec模型时,包含词典和词向量模型的训练 词典的构建是训…