Electron加密与安全

Electron加密与安全

引言

​ 目前网络上主要流传的加密就只是网页文件打包成asar和JS混淆加密,以及用addon的方式,这几种方式的话,基本就没有什么破解难度。针对的官方asar的打包,这种方式就仅仅是将众多的文件以原文的形式放在一个文件中,不存在任何的加密手段;JS混淆加密这种方式仍然是可以通过看代码的方式来分析出原本的逻辑;addon的方式只要找到调用的接口那么很容易就会被干掉。我们这里讨论的话题当然也是和以上的几种方式有关,不过更深入的就是,我们在这种基础之上作出更多的保护措施。

​ 本篇只讨论加密和安全的细节,不涉及到具体的源码和实现。因为这些东西已经应用到了项目中,不能直接放出来也不能说的太清楚,不过详细的思路我会说清楚,有兴趣的同学可以借助这个思路继续深入;且因个人水平有限,还有很多的方向没有顾及,欢迎我们一起讨论。

QQ群: 931238114(群名为:ReactOS学习交流)

目的

​ 本篇讨论的核心主题是重新编译Electron,在Electron里面加入JS的解密代码的思路;网上已经有大佬在很久之前讨论过这个话题的(参考:https://www.v2ex.com/t/493344,https://www.jishuwen.com/d/2AI3/zh-hk)。我们这里的思路要比这个帖子里面的思路要深入一些,这个帖子里面说的方式是C++和node.js端都写解密函数的方式。

​ 这个方式有一个缺陷就是,nodejs的解密代码没办法得到安全保证。虽然磁盘上的文件加密了,但是如果通过浏览被编译在electron.exe里面的nodejs代码,那么这个方式会直接崩掉。我们的目的肯定不是说让我们的程序不可被破解,而是尽可能增加破解的门槛和难度。

思路

​ Electron的源码加密和安全是多方面的,不仅仅是只加密源码这一块,还牵涉到加密之后阻止查看源码的部分。因此这里主要就分成两部分加密和安全。

加密部分

​ 我们现在都知道electron的源码是没有加密的,electron在保护源码的路上做的就只是将文件打包成asar,而且还在electron的nodejs端写了大量的重载一类的东西来支持这个asar,那么很显然我们并不能绕过asar这个环节,我们最好的方式就是我们自己对asar的内容进行加密,然后在Electron中进行文件解密操作。

文件加密思路:

  • 选择对称加密算法,方便解密时文件内容对齐
  • 在生成asar时,在文件头时不做处理,在写入实际文件内容时进行加密

EXE解密思路:

  • EXE中存在三个地方对ASAR的进行读取,分别是:

    • 通用asar读取类
    • asar JOB类
    • node 端读取类

    针对以上三处进行解密了之后,就已基本上已经处理完了所有的读取文件的方式,包含js端对asar的读取;\

加密方式选择:

​ 推荐AES对部分文件进行加密,只需要对重要的文件进行加密即刻;大范围的加密虽然提升了安全性,但是程序的性能会严重下降。

安全部分

​ 加密部分完成以后,那么就需要考虑如何提高破解的成本问题了。Electron程序需要分成三个部分来进行处理,分别如下:

  • Electron进程本身
  • Node Inspector
  • DEV Tools
Electron进程本身安全处理
  1. 使用VMP对解密代码进行VM保护
  2. 使用VM对程序本身进行VM
  3. 不使用第三方解密算法,例如,不使用OpenSSL库进行解密,推荐直接嵌入一个解密算法;
禁用Node的Inspector

​ Node的Inspector可以直接调试node进程的源码,使用VSCode进行主进程调试的时候就是使用的这个模式,如果哪怕已经对文件加密了,那么仍然可以通过VSCode调试查看到JS源码,所以需要从根源上禁止启动Inspector.在NODE.js里面禁用Inspector意义不大,因为断点可以断在你的判断代码之前。哪怕修改node.js的创建代码也没有意义,因为node.js的代码是直接编译进进程本身的,除非同样也加密,然后再取出。不过相对更麻烦。

  1. 通过参数的形式判断是否需要启动inspector,判断参数的代码也用VMP进行保护;
  2. 物理阉割inspector, 修改toolchain.ninja,或者修改electron_node.ninja直接,或者直接修改源码的方式将inspector砍掉,这样谁都不用调试了。只是相对编译麻烦;
禁用DevTools

​ 禁用DevTools的代码为了防止有人修改未加密代码强行开启开发者工具的。

  1. 移除devtools.pak, 一般情况下,devtools.pakresources.pak中,可以通过修改toolchain.ninja,在编译resources.pak时移除devtools.pak
  2. 监听devtools窗口的创建和启动,(为了防止第一步中破解者直接通过换一个resources.pak就让DevTools重载的问题),监听devtools-opened事件,参考链接:https://www.gznotes.com/how-to-protect-electron-app-source-code/
  3. 在主进程中检查resources.pak的校验值,防止文件被替换。

技能要求

  • 能写C++程序(用于写加密代码)
    • 加密算法,解密算法(推荐使用AES进行加解密,速度很快)
  • 编译和修改Electron源码(用于引入加密函数)
    • 编写解密函数
    • 禁用Inspector
    • 检查非法启动参数
  • 能写NODE.js或者JS
    • 用于修改electron的JS端,使其适应Electron的加密;
    • 修改官方的asar打解包工具,使其在打包时,将加密之后的数据写入到asar文件中;

Electron版本选择的话,我个人建议最好从4.0开始,因为4.0开始的版本采用的是gn的方式,配置比之前的简单,而且编译的速度要比这之前的快。国内下载Chromium源码比较困难,折腾几天搞不定都是正常的。

Electron编译选项开关

使用以下配置或参数,可以极大减小electron的文件体积, 32位4.2.9版本的electron,从76.1M到62M左右


1. gn args:
is_debug = false
target_cpu = "x86"
enable_nacl = false
is_component_build = false
is_component_ffmpeg=false
symbol_level = 2
blink_symbol_level=2
enable_basic_printing = false
enable_resource_whitelist_generation=false
debug_devtools = false
#enable_plugins  = false
enable_pdf = false
enable_webrtc = false
enable_plugin_installation =false
enable_spellcheck = false
use_browser_spellchecker = false
enable_print_preview = false
enable_web_speech = false
#enable_extensions  = false         // used by electron.
#enable_electron_extensions = false
enable_task_manager = false
enable_themes = false
win_pdf_metafile_for_printing  = false
enable_service_discovery = false
enable_wifi_bootstrapping  = false
enable_webvr  = false
enable_notifications  = false
disable_ftp_support = true
#enable_electron_extensions = false
enable_fake_location_provider = false
enable_message_center = false
enable_nacl_nonsfi = false
enable_native_notifications = false
enable_one_click_signin = false
#enable_openvr = false
enable_session_service = false
enable_tts = false
enable_vr = false
enable_windows_mr = false
#pdf_is_standalone = true
pdf_use_skia_paths = false
pdf_use_skia = false
pdf_is_complete_lib = false
pdf_enable_xfa_tiff = false
pdf_enable_xfa_png = false
pdf_enable_xfa_gif = false
pdf_enable_xfa_bmp = false
pdf_enable_xfa = false
pdf_enable_v8 = false
pdf_enable_click_logging = false
pdf_bundle_freetype = false
rtc_build_examples = false
rtc_build_tools = false
#toolkit_views = false
treat_warnings_as_errors = false
start_daemons_for_testing = false
is_unsafe_developer_build = true
angle_enable_custom_vulkan_cmd_buffers=false
angle_enable_d3d11=true
angle_enable_d3d9=true
angle_enable_vulkan=false
angle_enable_gl=false
angle_enable_gl_null=false
angle_enable_essl=false

3.1 replace `/Oy- ` = ` ` (use grepWin)
replace `/GS ` = ` ` (use grepWin)
3.2 Set from `/O2 `   to    `/Ox /Os /GS- /GF /GR- /Oy `.(use grepWin)
3.3 Set from `/O1 `   to    `/Ox /Os /GS- /GF /GR- /Oy `.(use grepWin)

5. Disable dynamic address for electron.exe
link flag : 
1. change fixed address from `/FIXED$:NO` to  `/FIXED`.
2. change dynamic address from `/DYNAMICBASE` to `/DYNAMICBASE$:NO`

参考链接

附上一些实用链接:

GN-Build Instructions: https://github.com/electron/electron/blob/master/docs/development/build-instructions-gn.md

减少Electron体积的:https://zhuanlan.zhihu.com/p/64070741

GN编译配置 :https://blog.csdn.net/Vincent95/article/details/78477597

windows electron-4.0.5编译指南:https://blog.csdn.net/bjrxyz/article/details/90347292

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章