steven026 发表于 2022-7-15 22:56:17

本帖最后由 steven026 于 2022-7-16 00:03 编辑

cxxjackie 发表于 2022-7-15 21:13
给你举个简单的例子:

这个getType只是个判断类型的函数,但因为他用到了call,只需对call针对性劫持就 ...
GGNB,让我恍然大悟
我刚才试了一下,能通过劫持Array.prototype.push暴露对象,进而修改闭包内的变量
const oldpush=Array.prototype.push
Array.prototype.push=function(...args){
    if(args && args["_rootLView"]){
    console.log(this,...args)
      window.game=args["_rootLView"]
    }
    return oldpush.apply(this,args)
}

另外想问一下哥哥针对这类不调用原型方法直接给对象赋值的有办法劫持吗?
class abc{
constructor(){
this.a={}
}
}
const aaa=new abc()
aaa.a=123

cxxjackie 发表于 2022-7-16 12:26:46

steven026 发表于 2022-7-15 22:56
GGNB,让我恍然大悟
我刚才试了一下,能通过劫持Array.prototype.push暴露对象,进而修改闭包内的变量



class的本质是function的语法糖(js的类都是function实现的),理解了这一点就好劫持了,可以用另一个function来“改造”这个class:
const realClass = abc;
abc = function() {
    const obj = new realClass(...arguments);
    console.log(obj);
    return obj;
};
当外部new这个假的abc时,实际new了两次,第二个new会被自动忽略,从而实现了new原class相同的效果。不过这一切的前提是取得abc的引用,如果abc也在闭包内就不太好搞了。由于实例的constructor属性指向类,即aaa.constructor === abc,可以设法在aaa之前取得另一个实例的引用,从而取得abc,当然说起来容易做起来难,闭包当然没有这么好破,还是要具体问题具体分析。

推荐阅读:https://www.w3school.com.cn/js/pro_js_object_defining.asp
(class关键字是ES6引入的,这篇文还没有收录,但原理相通。)

steven026 发表于 2022-7-16 15:55:38

cxxjackie 发表于 2022-7-16 12:26
class的本质是function的语法糖(js的类都是function实现的),理解了这一点就好劫持了,可以用另一个fun ...

谢谢哥哥解答,就是闭包内的new class,看来要找其他办法劫持了

rubinTime 发表于 2022-8-13 08:03:19

李恒道 发表于 2022-7-15 20:36
后期会聊的
主要就是通过基础函数劫持来拿一些闭包的东西



今天才发现这条帖子下面还有这么多评论,感觉哥哥可以多讲点劫持方面的东西,哥哥的开发教程关于劫持方面我基本都看过,写的真不错,每次看到就是感觉还可以这样,感觉可以做很多事情,实际上一实战我就不知道怎么用了

李恒道 发表于 2022-8-13 14:41:42

rubinTime 发表于 2022-8-13 08:03
今天才发现这条帖子下面还有这么多评论,感觉哥哥可以多讲点劫持方面的东西,哥哥的开发教程关于劫持方面 ...

{:4_115:}多练就好了
最近有点懈怠
好像好久没写了...
有空继续分析下docuemnt的问题然后搞webpack的正向和编译代码解读了
哥哥到时候可以看看

rubinTime 发表于 2022-8-13 15:15:43

李恒道 发表于 2022-8-13 14:41
多练就好了
最近有点懈怠
好像好久没写了...


好的,谢谢哥哥,劳逸结合,也别给自己搞得太累
页: 1 [2]
查看完整版本: 闭包练习(ClosurePractices)