electron源码保护

electron 程序发布后,如果未对程序做保护,则极容易受到破坏,比如被轻松破解密码,或者被修改程序,所以必须对程序做一些安全防护。虽然没有100%的安全防护,但是提升破解难度,直至破解代价超出了范围,还是能起到作用的。

注:以下列举了一些措施,可以根据情况选择,也可以组合使用

注:以下一些方式,借鉴了网上一些博主的片段,由于浏览太多网页,记不住原作者了,在此请原谅,并感谢!

一,敏感信息加密

比如账号密码,如果存储在本地文件中,密码需要加密存储

二,代码混淆

代码混淆只是加深破解难度,但是防护系数并非很高,源码中的一些常量或某些函数名,可能不会被混淆。对于破解者还是有办法找到关键代码,进行破坏。

代码混淆库有很多,这里以webpack-obfuscator为例:

1,安装

npm install webpack-obfuscator --save-dev
npm install javascript-obfuscator --save-dev

2,配置

const WebpackObfuscator = require('webpack-obfuscator')
webpack.config({
plugins:[
     new WebpackObfuscator({
       compact: true,
       controlFlowFlattening: false,
       deadCodeInjection: false, /// 随机的死代码块(增加了混淆代码的大小)
       debugProtection: false, // 此选项几乎不可能使用开发者工具的控制台选项卡
       debugProtectionInterval: false, // 如果选中,则会在“控制台”选项卡上使用间隔强制调试模式,从而更难使用“开发人员工具”的其他功能。
       disableConsoleOutput: true, // 通过用空函数替换它们来禁用console.log,console.info,console.error和console.warn。这使得调试器的使用更加困难。
       identifierNamesGenerator: 'hexadecimal', // 标识符的混淆方式 hexadecimal(十六进制) mangled(短标识符)
       log: false,
       renameGlobals: false, // 是否启用全局变量和函数名称的混淆
       rotateStringArray: true, // 通过固定和随机(在代码混淆时生成)的位置移动数组。这使得将删除的字符串的顺序与其原始位置相匹配变得更加困难。如果原始源代码不小,建议使用此选项,因为辅助函数可以引起注意。
       selfDefending: true, // 混淆后的代码,不能使用代码美化,同时需要配置 cpmpat:true;
       stringArray: true, // 删除字符串文字并将它们放在一个特殊的数组中
       stringArrayEncoding: ['base64'],
       stringArrayThreshold: 0.75,
       unicodeEscapeSequence: false// 允许启用/禁用字符串转换为unicode转义序列。Unicode转义序列大大增加了代码大小,并且可以轻松地将字符串恢复为原始视图。建议仅对小型源代码启用此选项。
     }, []),
]
})

三,asar文件防解压

对于electron程序,一般来说,如果攻击者想做一些破坏,那么他可能会通过修改源码的方式来进行,而electron程序打包的格式一般就是asar文件,这是一种归档文件,可以较容易解压,然后重新打包。基于这种思路,防护方式就是破坏asar归档文件内容,比如修改文件偏移值,或者加入一些不存在的文件来使asar文件本身无法被解压。

1,安装

npm install --save-dev asarmor

注:如果本地安装有冲突,可以全局安装后使用

2,使用

此模块需在electron asar文件生成后使用,可以在electron-builder的afterSign钩子里使用

2.1 创建脚本文件

 const asarmor = require('asarmor')

 exports.default = async ({ appOutDir, packager }) => {
     try {
         const asarPath = path.join(packager.getResourcesDir(appOutDir), 'app.asar')
         const archive = await asarmor.open(asarPath)
         archive.patch()
         archive.patch(asarmor.createBloatPatch(1314))
         console.log(`applying asarmor patches to ${asarPath}`)
         await archive.write(asarPath);
     } catch (error) {
         console.error(error)
     }
 }

2.2 注册到钩子

四,字节码

此方式是破解难度最高的方式,即便asar文件被解压,或者通过devtool进入了调试模式,看到的仅仅只是字节码,因此大大提升了破解难度。

1,安装

npm install electron-bytenode-webpack-plugin --save-dev

2,配置

const BytenodeWebpackPlugin = require('electron-bytenode-webpack-plugin')
webpack.config = ({
plugins:[
    new BytenodeWebpackPlugin({
      compileAsModule: false,
      keepSource: true
    })
]
})

3,应用

先编译,再打包。通过node .electron-vue/build.js编译后,将原有的入口函数内容替换为bytenode加载字节码:

'use strict';

const fs = require('fs');
const path = require('path');
const v8 = require('v8');

v8.setFlagsFromString('--no-lazy');

const pathName = path.join(__dirname, '../dist/electron/index_bundle.js');

try {
  (async function () {
    try {
      // 将原来的js文件里面的内容替换成下面的内容
      fs.writeFileSync(pathName, 'require("bytenode");require("./index_bundle.jsc");', 'utf8');
    } catch (e) {
      console.error(`run_bytenode_err: ${e}`);
    }
  }());
} catch (e) {
  console.error(`run_bytenode_err: ${e}`);
}

然后再用electron-builder打包。(可以自行编写一行命令的scripts)

注:由于使用了bytenode加载字节码源码,所以打包时,必须把bytenode也一并打包

注:以上方式是由于本人项目框架的一些原因,导致用了这些步骤,现在网上已经有集成好的框架,不用这样自己搞些步骤

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis:使用代码整合

文章目录 MyBatis:Day 04框架1. 依赖:pom.xml2. 外部配置文件:db.properties3. 核心配置文件:mybatis-config.xml4. 实体类5. 接口:xxxMapper.java6. 实现类:xxxMapper.xml7. 测试 MyBatis:Day …

利用C#实现动态替换桌面快捷方式对应的应用程序

公司有一个特殊的业务可能会用到这个,至于什么业务就不展开了。本文的内容作为备用方案。 实现思路: 1 获取当前exe程序运行的全路径 2 获取桌面的所有快捷方式 3 遍历快捷方式,获取快捷键方式对应程序的运行路径,并与当前…

Java编程中的20种常见异常及其原因,你知道多少

本文介绍了在Java编程中可能遇到的20种常见异常,包括空指针异常、类未找到异常、数组下标越界异常等,并简要解释了每种异常发生的原因。这些异常可能由于编程错误、运行时资源不足或权限受限等多种原因触发,了解它们有助于更高效地进行程序调…

黑马程序员Dubbo快速入门,Java分布式框架dubbo教程

分布式系统中的相关概念 (一)互联网项目架构目标-特点 (二)互联网项目架构目标-目标 (三)集群和分布式 (四)架构演进 Dubbo概述 (一)dubbo概述 1、dub…

针对Vue前后端分离项目的渗透思路

引言 在目前的开发环境下,越来越多的厂商选择 Vue.js 来实现前端功能的编写,且成熟的前端框架已经可以实现后端代码实现的功能,导致后端目前只负责提供 Api 接口和文档,方便前端的同时去调用。本文主要介绍如何针对这类前后端分离…

java版鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统源代码

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展,企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性,公司对内部工程管…

java紫砂壶交易购物系统 mysql

网络紫砂壶可充通过色彩、图片、说明、设置动画加强了产品了宣传,大大达到了陶瓷业的“色型”要求。实现产品管理方便,起到立竿见影的效果,不用因为更改菜色而重新印刷。只要在后台鼠标轻轻一点,全线马上更新。采用B/S模式&#x…

mybatisPlus初识

文章目录 什么是mybatisplus依赖入门案例自动填充乐观锁悲观锁乐观锁 mybatisPlus实现乐观锁批量查询根据指定条件查询 什么是mybatisplus mybatisplus是mybatis的增强工具&#xff0c;支持多种类型的数据库。 依赖 <dependency><groupId>com.baomidou</group…

快速了解车联网V2X通信

自动驾驶拥有极其巨大的潜力&#xff0c;有可能改变我们的出行方式。它不仅有望永远改变车辆的设计和制造&#xff0c;还会永远改变汽车的所有权乃至整个交通运输业务。要实现全自动驾驶的目标&#xff0c;开发人员需要开发极为复杂的软件&#xff0c;软件中融入的人工智能(AI)…

从一到无穷大 #7 Database-as-a-Service租户隔离挑战与解决措施

文章目录 引言计算侧多租户隔离2DFQSQLVMRetro 其他隔离方法其他 引言 在云环境中租户之间的资源共享对于运营商的成本效益来说非常重要&#xff0c;但是一个主要问题是租户之间的资源隔离&#xff0c;这通常与Qos息息相关&#xff0c;从多租户的角度讲&#xff0c;安全性/性能…

〖Python网络爬虫实战⑲〗- 数据存储之CSV文件

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付…

DolphinScheduler海豚调度教程

DolphinScheduler 教程 &#xff08;一&#xff09;入门指南 简介 关于Dolphin Apache DolphinScheduler是一个分布式易扩展的可视化DAG工作流任务调度开源系统。解决数据研发ETL 错综复杂的依赖关系&#xff0c;不能直观监控任务健康状态等问题。DolphinScheduler以DAG流式…

欧拉奔赴品牌2.0时代,女性汽车真实用户需求被定义?

每年的上海国际汽车工业展览会&#xff0c;不仅是各大汽车品牌的技术“秀场”&#xff0c;也是品牌的营销“修罗场”。今年上海车展出圈的营销事件特别多&#xff0c;热度甚至一再蔓延到汽车行业外&#xff0c;其中欧拉也贡献了不少流量。 据了解&#xff0c;在2023上海车展欧…

ModuleNotFoundError: No module named ‘mmcv._ext‘

mmsegmentation使用pyinstaller打包出现问题 mmsegmentation是商汤开源的语义分割框架&#xff0c;里面包含了大量SOTA模型&#xff0c;十分适合从事语义分割工作的小白学习。 最近想将mmsegmentation打包成exe进行使用&#xff0c;但是遇到了一个问题&#xff0c;在打包的过…

Photon AI Translator 和做产品的一些思考

近 4 个月内我一直在做 Apple 平台的产品&#xff0c;虽然从使用量来说「简体中文」用户是占多数&#xff0c;但我一直有做多语言的支持&#xff1a;英语、简体中文和繁体中文。习惯上 Google 翻译的我&#xff0c;基本上在使用 Xcode 过程中也会一直在浏览器开着 Google Trans…

目标跟踪--卡尔曼滤波 与 匈牙利算法

目前主流的目标跟踪算法都是基于Tracking-by-Detecton策略&#xff0c;即基于目标检测的结果来进行目标跟踪。 跟踪结果中&#xff0c;每个bbox左上角的数字是用来标识某个人的唯一ID号。那么问题就来了&#xff0c;视频中不同时刻的同一个人&#xff0c;位置发生了变化&#x…

《智能手机心率和呼吸率测量算法的前瞻性验证》阅读笔记

目录 一、论文摘要 1.背景 2.方法 3.结果 4.结论 二、论文十问 Q1&#xff1a;论文试图解决什么问题&#xff1f; Q2&#xff1a;这是否是一个新的问题&#xff1f; Q3&#xff1a;这篇文章要验证一个什么科学假设&#xff1f; Q4&#xff1a;有哪些相关研究&#xff…

【算法】冒泡排序

一.冒泡排序 主要思想&#xff1a; 反复交换相邻的元素&#xff0c;使较大的元素 逐渐冒泡到数组的末尾&#xff0c;从而实现排序的效果 实现过程&#xff1a; 1.遍历待排序数组&#xff0c;比较相邻的元素&#xff0c;如果前面的元素比后面的元素大&#xff0c; 就交换这两…

07 Kubernetes 网络与服务管理

课件 Kubernetes Service是一个抽象层&#xff0c;用于定义一组Pod的访问方式和访问策略&#xff0c;其作用是将一组Pod封装成一个服务&#xff0c;提供一个稳定的虚拟IP地址和端口号&#xff0c;以便于其他应用程序或服务进行访问。 以下是Kubernetes Service YAML配置文件的…

transformer and DETR

RNN 很难并行化处理 Transformer 1、Input向量x1-x4分别乘上矩阵W得到embedding向量a1-a4。 2、向量a1-a4分别乘上Wq、Wk、Wv得到不同的qi、ki、vi&#xff08;i{1,2,3,4}&#xff09;。 3、使用q1对每个k&#xff08;ki&#xff09;做attention得到a1,i&#xff08;i{1,2,3,4…