一个有趣的事情,现代浏览器挂载函数到window可以实现自定义IE时代的旧ActiveX控件
← 返回列表

当前位置: 作者:huaxiong · 2026-06-26 09:34:34

#1 huaxiong · 2026-06-26 09:34:34
stalltrix

以前的IE时代,可是有很多这种写法的
```js
var xhr = new ActiveXObject("Microsoft.XMLHTTP")
xhr.open("GET", "/api")
xhr.send()
```

其中ActiveXObject是不是感觉很熟悉,小到XHR异步请求,大到flash插件,甚至ActiveXObject("WScript.Shell")这种挂马等直接浏览器执行shell的危险指令都是ActiveX。




不过现在不同了,现代浏览器都不存在ActiveXObject这些对象了,历史的问题被解决了。

但是形成了另一种有趣的玩法,由于浏览器不存在ActiveXObject这个名称的对象,同时用户可以自定义未命名的函数对象。

比如我们定义,这个函数可以叫做ActiveXObject。


```
window.ActiveXObject = function(name) {
if (name === "Microsoft.XMLHTTP") {
return new XMLHttpRequest()
}
throw new Error("ActiveXObject not supported: " + name)
}

```


于是现代浏览器就能使用我们的ActiveX。你看看下面的写法熟不熟悉?

```
var xhr = new ActiveXObject("Microsoft.XMLHTTP")
xhr.open("GET", "/api")
xhr.send()
```

并且在现代浏览器中,还能正常运行

甚至你还可以定义一些以前的危险COM组件(当然现在都是模拟,其实都不危险了)

```
var fso = new ActiveXObject("Scripting.FileSystemObject")
var ws = new ActiveXObject("WScript.Shell")
```

以前写入文件到硬盘再shell启动,这可是web挂马的常见操作。


不过现在web环境也变得很多了,沙盒化完善倒是不用担心以前的问题了。不过这种现代方法,写出过去经典的感觉,不过其实感觉相当于把新车换上老外壳,扮猪吃老虎之类的,哈哈
#2 gmking · 2026-06-26 09:43:21
stalltrix
这种感觉我懂,是不是相当于配新电脑,虽然买了新配件新显卡组装,但是却装上旧机箱,旧显示器外设之类的。让外表看上去像是垃圾旧配电脑。
#3 高ping战士 · 2026-06-26 09:54:11
stalltrix
哈哈,DIY玩家日常操作,是怕买新电脑被对象发现吗。于是外设朴实无华,内设精益求精。
#4 duso · 2026-06-26 10:06:43
stalltrix

> 外设朴实无华,内设精益求精

外射朴实无华,内射精益求精
#5 独孤求败 · 2026-06-26 10:21:54
stalltrix
不过说不定真的可以装逼,把明显的代码用AX方法来写,别人一看:“啊什么上古代码”这种扮猪情节。

不过除了装逼外,没有想到其他用途。兼容老代码??或许现在都没必要了吧
#6 帅哥 · 2026-06-28 13:57:06
stalltrix
我突然想到以前一件事,IE有一个叫做attachEvent("onclick", handler)这个对象。后来标准化把这个方法抄去了实现另一个叫做addEventListener的对象。刻意不兼容的标准。

不过也可以按照楼主的思路补全经典对象
```js
Element.prototype.attachEvent = function(name, handler) {
const event = name.replace(/^on/, "")
this.addEventListener(event, handler)
}
```
#7 鸟云 · 2026-06-28 14:48:54
stalltrix
哈哈,各位真是奇思妙想,按照这个思路连上古时代的vbs都能在浏览器上跑了,直接读取<script>标签的内容,然后手写vbs解析器。让vbs可以操作dom。

手写了一个草稿,你们试试


```html
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>vbscript test</title></head><body>
<h2>vbscript test</h2><div id="output">waiting...</div>

<script id="code" type="text/vbscript">

dim x = 10

If x > 5 Then
MsgBox "big"
End If

Sub changeDom()
Set dom1 = document.getElementById("output");
dom1.innerHTML="changed by vbs";
End Sub

Function echoMsg(msg)
MsgBox msg
End Function

changeDom
echoMsg("msg123")
</script>

<script>
try{new Function(document.getElementById("code").textContent.replace(/\r/g,"").replace(/^\sfunction\s+([^(]+)\(([^)])\)\s$/gim, "function $1($2){").replace(/&/g,"+").replace(/sub\s+(\w+)\(\)/gi,"function $1(){").replace(/end sub/gi,"}").replace(/if\s+(.+)\s+Then/gi,"if ($1) {").replace(/else/gi,"} else {").replace(/end if/gi,"}").replace(/dim /gi,"var ").replace(/set /gi,"let ").replace(/msgbox\s+(.+)/gi,"alert($1)").replace(/^\s(\w+)\s*$/gm,"$1()").replace(/\nend function/gi,"\n}\n"))();
}catch(e){alert("runtime error",e);}
</script></body></html>
```




发现没有,中间的这段的vbs代码基本上能完全运行,甚至还能操作html的dom

```vbs
dim x = 10

If x > 5 Then
MsgBox "big"
End If

Sub changeDom()
Set dom1 = document.getElementById("output");
dom1.innerHTML="changed by vbs";
End Sub

Function echoMsg(msg)
MsgBox msg
End Function

changeDom
echoMsg("msg123")
```
#8 风长旧客 · 2026-06-28 14:58:29
stalltrix
卧槽,没想到睡觉前还能刷到这么怀念的内容。vbs在浏览器中跑几乎是20年前的老回忆了。没想到还能这么玩,跑到现代浏览器中

注册

或使用第三方注册

登录

没有账号? 立即注册
技术
闲聊
开发
正在提交...