黑客教育视频:运用Rust构建一个快速的Electron APP

访客4年前黑客资讯1046

当我研发Finda时,我十分期望它可以做到快速,更好能在16毫秒内相应全部用户输入。
通过仔细研讨,我们惊奇地发现Finda是用Electron构建的,该结构经常被批判速度缓慢。
在本文中,我将要点阐明如安在充分利用Electron易于打包、可以访问杂乱操作系统指定API、针对浏览器的视觉功用等长处的一同,凭借Rust来更大极限地减少不行预知的推迟现象和处理内存运用过多问题。

 

关于设计的留意事项

在深化了解技术细节之前,我们首要要了解Finda本身的设计方针。
Finda支撑单一交互http://[本地IP地址]:8080:用户输入内容,它就能找到相应的事物,包含浏览器标签、文字编辑器缓冲区、本地文件、浏览器历史记录、翻开的窗口等。
演示视频请参阅:https://d189ym6tlc5mr2.cloudfront.net/video/2018_02_16_finda_demo.mp4 。
我们最终的方针是,想要让Finda感觉不像是应用程序,更像是Command-Tab(macOS默许应用程序切换东西),只作为操作系统的一部分,在需求时当即出现,在完结相应功用后就可以消失。
进程中无需菜单、窗口、按钮或任何类型的本地用户界面。针关于Finda的互动,我们只需求以下几点:
1、不论在哪个应用程序的界面上,大局快捷 *** 都可以直接将Finda全屏显现;
2、捕获输入的按键;
3、出现搜索成果。
在不运用的情况下,Finda应该躲藏在后台。

 

不运用Electron的代替计划

鉴于上述要求,我重新考虑了我的选项。
Native OS X:我很早就想到了这一计划,其原因有两个:
1、我想要将Finda移植到Windows和Linux上,由于beta检验者在问他们是否可以为他们现有渠道购买一个版别。
2、为了运用XCode进行本地开发,我有必要晋级macOS,这一晋级进程简直必定会在必定程度上损坏我电脑的环境。
Game-like:我之前从前依据此计划写过一个像素着色器,通过实践运用,游戏的速度十分快,或许这一计划可以有用。通过研讨,我决议检验运用ggez( https://github.com/ggez/ggez ),这是一个依据SDL的Rust游戏库,十分棒。
关于我这样图形方面的新手来说,我发现这个API是十分友爱的。可是我很快就意识到,恐怕要制造一个完好的应用程序,仍是需求相当多的基础作业的。
例如,可以给定文本字符串、字体巨细和字体。可是,当用户键入时,Finda将杰出显现匹配项:
https://keminglabs.com/blog/building-a-fast-electron-app-with-rust/highlighting.mp4
这就意味着我需求处理多个字体和色彩,并盯梢每个 *** 的子字符串的鸿沟框,以设置好全部内容。
除了烘托之外,我发现操作系统集成方面也存在着一些困难点:
1、建立一个没有标题栏、最小化、更大化、封闭按钮的无边框窗口;
2、后台工作应用程序,不在Dock中显现;
3、通过Quartz Event Services( https://developer.apple.com/documentation/coregraphics/quartz_event_services?language=objc )取得一个“大局热键”。
关于第三个困难点,在4小时之后,我设法取得了要害代码,但我发现我需求通过独自的一组循环来查找活动键盘映射,于是就抛弃了这一主意。
上述都不是真实的“游戏问题”,而且这看起来并不像切换到另一个结构,例如GLUT(OpenGL,https://www.opengl.org/resources/libraries/glut/ )会比ggez(SDL)要好。
Electron:之前我现已运用Electron构建过应用程序,而且我知道它会契合Finda的要求。浏览器开端是为了布局文本而设计的,Electron供给了广泛的窗口选项( https://github.com/electron/electron/blob/master/docs/api/browser-window.md )和大局快捷 *** 的一行API( htIPA并不是Apple程序运用文件iPhoneApplication的缩写,而是Injection Proxy Appliance的缩写,Injection Proxy Appliance是Galileo Remote Control System(伽利略远程控制系统,简称RCS)的一部分,其主要作用是:tps://github.com/electron/electron/blob/master/docs/api/global-shortcut.md )。

 

结构

Electron用语用户界面层,Rust作为二进制实行并处理全部其他内容
当Finda翻开,并按下一个键时:
1) 浏览器调用一个文档onKeyDown监听器,该监听器将JavaScript keydown事情翻译为表明事情的一般JavaScript目标,就像是:

{name: "keydown", key: "C-g"}

2) 这个JavaScript目标被传递给Rust(之后会传递更多),Rust回来另一个表明整个应用程序情况的一般JavaScript目标:

{   query: "search terms",  results: [{label: "foo", icon: "bar.png"}, ...],  selected_idx: 2,  show_overlay: false,  ...}

3) 然后将这个JavaScript目标传递给React.js,它运用<divs> 和<ols>将器实践出现给DOM。
在这个架构中,有两点需求留意:
首要,Electron没有保护任何一种情况。从它的视点来看,整个应用程序都是最近事情的函数。这一点是或许的,由于Rust一直保持Finda的内部情况。
其次,这些进程发生在每个用户交互(keyup和keydown)进程中。因此,为了满意功能要求,全部三个进程有必要在16ms内完结。

 

INTEROP

其间比较风趣的是第二个进程,假设从JavaScript调用Rust,那会是什么姿态?
我们运用了Neon库,与Rust一同构建一个Node.js模块。
从Electron视点来看,这就像调用任何其他类型的包装相同:

var Native = require("Native");var new_app = Native.step({name: "keydown", key: "C-g"});

Rust中这个函数有一些杂乱,我们来具体剖析一下:

pub fn step(call: Call) -> JsResult<JsObject> {  let scope = call.scope;  let event = &call.arguments.require(scope, 0)?.check::<JsObject>()?;  let event_type: String = event      .get(scope, "name")?      .downcast::<JsString>()      .unwrap()      .value();

JavaScript有几种语义不能完美映射到Rust的言语语义(例如,参数目标和动态变量)。
因此,Neon不会企图将 *** 调用映射到Rust函数签名,而是将函数传递给一个Call目标,从中可以提取细节。 由于我现已编写了这个函数的调用( *** )端,我知道之一个参数是这儿仅有的参数,它是一个JavaScript目标,而且一直有一个与字符串值相关的称号键。
然后,可以运用此event_type字符串将JavaScript目标的“翻译”的其余部分引导至恰当的Finda :: Event枚举变量:

match event_type.as_str() {    "blur" => finda::step(&mut app, finda::Event::Blur),    "hide" => finda::step(&mut app, finda::Event::Hide),    "show" => finda::step(&mut app, finda::Event::Show),    "keydown" => {        let s = event            .get(scope, "key")?            .downcast::<JsString>()            .unwrap()            .value();        finda::step(&mut app, finda::Event::KeyDown(s));    }...

这些分支还会调用finda :: step函数,它将实践更新应用程序情况以呼应事情,例如:更改查询并回来相关成果、翻开选定成果、躲藏Finda等等。
(我会在今后的博客文章中具体解说Rust,期望我们继续重视我的博客,或许重视@lynaghk)
在应用程序情况更新之后,它需求回来到Electron端进行烘托。这个进程看起来与其他计划都很类似,但实践是在另一个方向上,它是将Rust数据结构翻译成J

◆十分安全的零知识 CRYPTON 结构 - 永久只能在本地设备上加密或解密数据

avaScript数据结构:
let o = JsObject::new(scope);o.set("show_overlay", JsBoolean::new(scope, app.show_overlay))?;o.set("内核源码:query", JsString::new(scope, &app.query).unwrap())?;o.set(    "selected_idx",    JsNumber::new(scope, app.selected_idx as f64),)?;

在这儿,我们首要创立JavaScript目标,该目标将回来到Electron并将一些键与某些根本类型相相关。
回来成果(一个目标类型数组)需求更多的约束:数组巨细需求事前声明、Rust结构有必要清晰罗列出来。但全体来说,还不算太糟糕:

let rs = JsArray::new(scope, app.results.len() as u32);for (idx, r) in app.results.iter().enumerate() {    let jsr = JsObject::new(scope);    jsr.set("label", JsString::new(scope, &r.label).unwrap())?;    if let Some(ref icon) = r.icon {        jsr.set("icon", JsString::new(scope, &icon.pathname).unwrap())?;    }    rs.set(idx as u32, jsr)?;}o.set("results", rs)?;

最终,在该函数结束时回来JavaScript目标:

Ok(o)

Neon处理全部的细节,并将其传递给JavaScript端的调用者。

 

功能验证

那么,在实践中它们的功能体现得怎样呢? 在Chrome DevTools的“功能”选项卡(内置于Electron中)中,我们可以看到,这是一个单一keypress的典型曲线:


其间的每个进程都被符号:1)将按键转换为事情,2)在Rust中处理事情,3)运用React烘托成果。
首选需求留意的是顶部的绿色条,这表明全部这些都在14毫秒之内完结。
其次留意的是Rust的Interop,在其间高亮显现的Native.step()调用仅在不到1毫秒之内就进行完结。
我检验在查询中增加一个字母,那么这一特其他keydown事情会导致在Finda中进行如下进程,而这些进程都是在1毫秒内完结的:
1、对全部我翻开的窗口、Emacs缓冲区、浏览器约20000页标题及URL、~/work/、~/Downloads/和~/Dropbox/文件夹进行正则表达式搜索。
2、依据质量启发式(匹配数量、是否出现在词语鸿沟等)对全部这些成果进行排序。
3、将前50个成果转换为JavaScript并回来。
假设你不相信能有这么快的速度,可以自己下载并检验。针对不同的事情,其功能数据也有所不同,但这种追寻是十分典型的:Rust需求几毫秒来完结实践作业,大部分时间都是在进行烘托,而且整个JavaScript实行都会在16毫秒内完结。

 

对1、OpenSCManagerA用来翻开受害者机器上服务控制管理器的句柄,此处它运用了SC_MANAGER_ALL_ACCESS (0xF003F)权限。功能的继续研讨

考虑到这些功能指标,我们可以通过删去React(也或许是整个DOM)来缩短呼应时间,而不是运用<canvas>元素手动处理布局并进行烘托。
可是,假设不考虑人类是否可以区别出15毫秒的呼应和5毫秒的呼应之间的差异,仍是存在一些严峻的收益递减情况的。很或许有某些初级其他操作系统、图形驱动程序、LCD硬件影响了呼应时间。
其他,在Electron中,除了易于运用的内置剖析 东西之外,DOM和CSS供给了很多的Runtime延展性。翻开Inspector后,就有不同的字体、色彩和距离来区别:https://keminglabs.com/blog/building-a-fast-electron-app-with-rust/devtools.mp4 。
关于像Finda这样的彻底数据驱动的应用程序来说,具有视觉剪影和播映的才能至关重要。这样一来,就可以通过在图形设计东西周围推进像素,来完成依据搜索的交互。
对我而言,假设没有Electron和Rust,我就无法制造出Finda的原型并发布。这二者都是十分棒的技术,在此要感谢全部为他们做出奉献的人。

 

总结

Electron可以轻松构建和分发桌面应用程序,让我脱节繁琐的字体烘托细节、初级操作系统热键和窗口API。
Rust使得编写进程快速而安全,初级其他数据结构在Rust中就变得很简单,而且我在其引导下,开端以JavaScript/ClojureScript hat的 *** 来考虑内存和功能的相关问题。
最终,我要感谢Nikita Prokopov、Saul Pwanson、Tom Ballinger、Veit Heller、Julia Evans和Bert Muthalaly对本文提出的反应定见。

原文链接:

本文翻译自:keminglabs.com
如若转载,请注明出处:keminglabs.com

黑客教育视频:运用Rust构建一个快速的Electron APP

图9. 在krbtgt账户中设置John Doe为后门账户1、 在GUI编辑器中躲藏VBA宏;2、MSF设置监听:使用Rust构建一个快速的Electron APP

黑客教学视频最近对Windows10内核提权比较感兴趣,继续研讨一下v1709版别,先回想我们前几篇文章:2. 注入多个系统进程一同为关照进程防止被间断[+] UserWriteWhatWhere->Where: 0x4242424242424242Matching identities

[ 8] .gnu.version_r VERNEED 08048270 000270 000020 00 A 6 1 42nd.bat 首要切换到Project工程结构视图下增加2个api的jar包黑客教学视频

轿车多媒体单元(CMU)充满了远程实行程序缝隙。假设将轿车连接到WiFi,你就可以通过 *** DBUS对CAN总线进行(只读)访问。 Inode size: 2560×03:指纹辨认详解

static int __init null_dereference_init(void)

这样就能活络设定 Hash 的时间本钱了。例如设定 10000,对开发者来说,只是多了几十毫秒的核算;但关于攻击者,破解速度就降低了一万倍!

Nmap scan report for 192.168.178.195选择1运用常规安置 *** (也就是在靶机上建立后门的安置 *** ,带有迷糊检验)使用Rust构建一个快速的Electron APP

黑客教学视频怎样防范:一,设备系统最新补丁程序,尽量减少侵略者得到口令的或许性。1、增加集结点,在Jmeter里是synchronized timer;object o = a.CreateInstance(method.Name);Ethernet adapter Bluetooth Network Connection:

[1][2]黑客接单网

不过最近有安全研讨人员提出一种名为“风水翻转”的侵犯技术,首要针对同处一个云环境下的其他虚拟机。其本质也是Rowhammer侵犯,传闻具有了“高准确性”和“可控”的特征,可从其他虚拟机盗取加密密钥。
allow-query { 192.168.1.0/24; 127.0.0.0/16; };
黑客教学视频

需求进行非对称的加解密,且需求三次握手。初度联接比较慢点,当然现在也有许多的优化。

Freebuf 百科

最近在做网站SSL晋级,看似简略的操作仍是会遇到各种问题,现在和我们同享一下。

使用Rust构建一个快速的Electron APP

沙盒具体怎样工作将在后边的文章中讲到Netcat

在独立顾问这一行作业了十多年,由于常常遇到这些情况,因此我逐渐找到了比较合理的处理 *** 。首要,任何信息安全项目的之一步就是找到全部存在的缺陷。商场上有许多很棒的免费开源东西以及低成本的商用东西可以用来实行合理的安全缝隙点评,帮忙用户发现并纠正问题。


本文标题:黑客教育视频:运用Rust构建一个快速的Electron APP

相关文章

怎样查找丈夫微信聊天已删好友

. 宝宝走路姿势异常会影响宝宝的生长发育,有些看起来软萌可爱的走路姿势,对宝宝生长发育来说并没有什么好处,当宝宝走路姿势异常时,家长要及时纠正,那么,宝宝走路姿势异常怎么纠正呢?接下来友谊长存小编就...

麦道面包加盟流程是什么?难以想象的简单流程

麦道面包加盟流程是什么?难以想象的简单流程

连年来,餐饮行业不绝的与时俱进的成长进步,那么美食产物公共消费市场上的美食产物也是数不胜数,公共加盟商想要创业做美食产物的加盟品牌首先选择品牌就长短常坚苦的浩瀚的加盟品牌使得各人无从下手选择。在公共加...

VulnHub靶场-Ch4inrulz

VulnHub靶场-Ch4inrulz

引言vulnhub是个提供各种漏洞平台的综合靶场,可供下载多种虚拟机进行下载,本地VM打开即可,像做游戏一样去完成渗透测试、提权、漏洞利用、代码审计等等有趣的实战。vulnhub也是OSCP证书刷题必...

雅培菁挚2段奶粉配方怎么样 雅培菁挚2段奶粉粉质如何

雅培菁挚2段奶粉配方怎么样 雅培菁挚2段奶粉粉质如何

小孩在换段的情况下吃啥奶粉比较好,有许多妈妈在小孩八个月了以后才换段,那麼小宝宝换段可以吃雅培菁挚2段奶粉吗,我就而言讲吧。 商品总体 雅培旗靓店顺丰快递雷电送货,第二天就送上门了。雅培菁挚2...

整篇抄袭不署名 自媒体告浙大博士

整篇抄袭不署名 自媒体告浙大博士

本书失效 2015年10月13日稍早些时候,澎湃新闻独家报道了中国政法大学教授、商学院前院长孙选中被举报论文抄袭一事,后中国政法大学回应“教授被举报论文抄袭”将启动调查程序。 2015年7月,...

dota是什么(这就叫DoTa!)

dota是什么(这就叫DoTa!)

Dota这款游戏对有些人可能很陌生甚至没听过,但魔兽3冰封王座绝大多数人还是知道,而Dota这款MOBA游戏是一名叫做Euls的人在魔兽上的地图编辑器上所创作出来的一款5V5的对抗游戏,在经过...