在使用ecute开发app时,我们经常使用ecute.createHTMLContainer()创建HTML容器。但是在这个HTML容器中,不支持使用JavaScript。
ecute本身基于node.js,可以运行javaScript,可以通过ecute.debug.eval()运行JavaScript代码。
但是我们知道,ecute不支持内件访问,必须通过ecute.container.arunb()运行,如果使用arunb,那么就会强制结束a,然后运行b,再运行a,那么也会造成javascript运行错误的情况。
如何解决:
- 使用child_thread创建子线程
- 使用unston创建守护媒体
// # use ecute
ecute.use("child_thread");
const ct = require("child_thread");
ecute.use("unston");
const us = require("unston");
// 创建线程
const jsRunning = ct.createThread("javascript");
jsRunning.setType = ecute.self.prototype.external.type;
jsRunning.structure = ecute.self.prototype;
// 设置HTML容器
ecute.protype.createHTMLContainer = ecute.self.prototype.createHTMLContainer.on("__show__",(e)=>{
if (e["post_type"] == "{ecute_show_html_container}"){
//设置编译器
jsRunning.prototype.debug.eval = getFirstBetween("<script>","</script>");
jsRunning.prototype.debug.eval = for.FirstBetween("<script>","</script>",(e)={
if (e.use("document") || e.use("window")) return e.return(document...=>window);
});
}
});
运行上面的代码,会发现报错:
[4,1]Referenced unston, but never referenced it. (引用了unston,但是从未引用)
[5,1]Created us, but never referenced. (创建了us,但是从未引用)
这个错误其实是因为引用了unston导致的,如果我们把unston删除了,然后再ecute run serve,看起来是没有问题了,但是我如果用一个代码,那么就可以获得到所有信息:
try{
const pt = external.prototype;
external.self.prototype = pt;
"console.log('"+"".getLocalConfigs+"')".eval();
}catch{}
上面代码将pt设置为外部的prototype,这一步无危害。external.self默认在js编译器里未空,如果设置了protype,那么就无法直接通过JavaScriptDebugShowOEAQ阻止。然后用一个字符串.eval,是因为external在ecute中是一个StringE6Object,也就是说,在ecute的js编译器中,字符串即可以是string类型,也可以是external.stringe6object.stringfobj.external对象,相当于external.self.that。
也就是说可以直接执行所有ecute命令,假设黑客篡改了网页,然后通过js获得了用户的所有信息,那么怎么办呢?
也就是说,我们有很大的必要使用unston。但是never referenced报错不能被直接删除,包括编译后,也会变成“短暂阻塞(SUTAEF)”。
在这里作者自己写了一个东西,可以绕过编译器的never referenced检测。
ecute.system.eval(`ecute.self.that.that.parentThat.self.that = [];ecute.self.that.these.parent.parentThat.self.that.push(ecute.self.that.that.parentThat.self.that.push([]));ecute.self.usePrototype([],[],[],"__show__",["e.self","p.self",["self",3]]);ecute.PvoshObject({ep:[],e:["e"],p:["p"]});"__all_push__".uvRun.self.prototype.set(["V",0,false]);ecute.getFull([]);ecute.buffer.full("0",[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]);ecute.self.that.that.parentThis.self.that.parentThis.parent.parent.parentThis.self.do("eval");`)
这个代码写起来又臭又长,最好还是别自己尝试着写了,复制粘贴即可。
如果你也想写这样的代码,可以用ecuteMyObj,可以在线观察树状图,编写代码。