LoginSignup
1
3

More than 1 year has passed since last update.

VBScriptを暗号化(難読化)する方法で気付いた注意点

Last updated at Posted at 2017-07-25

今回の方法

Encode and Decode a VB script
正常なファイルがウイルスとして検知された場合(誤認)の対処方法
MACAFEEでは標準だとVBEになると隔離されてしまう。
また、Script Encoderはエンコードしたものをデコードはできない。基本はもとに戻せないのでバックアップすること。
また、この記事でいうエンコードとは暗号化の意味である。しかし、これは2009年までで、2020年には難読化と訳すべきと思われる。

役立たないVBA版

VBSをVBEに変換する

ドラッグアンドドロップではないのでファイル名は指定である。
Microsoft Scripting Runtimeを参照設定すること。
C:\hoge\test.vbsからC:\hoge\test.vbeを作成します。

VbEncode
Sub VBSEncode()
Dim oEncoder As New Scripting.Encoder, oFilesToEncode, sfile As String, sDest
Dim sFileOut, oFile As file, oEncFile, oFSO As New Scripting.FileSystemObject, i
Dim oStream, sSourceFile

Const sPath = "C:\hoge"
'Set oEncoder = CreateObject("Scripting.Encoder")
'   Set oFSO = CreateObject("Scripting.FileSystemObject")
   sfile = sPath & "\test.vbs"
    Set oFile = oFSO.GetFile(sfile)
     Set oStream = oFile.OpenAsTextStream(1)
    sSourceFile = oStream.ReadAll
    oStream.Close
    sDest = oEncoder.EncodeScriptFile(".vbs", sSourceFile, 0, "")
    sFileOut = Left(sfile, Len(sfile) - 3) & "vbe"
    Set oEncFile = oFSO.CreateTextFile(sFileOut)
    oEncFile.Write sDest
    oEncFile.Close
End Sub

このスクリプトの注意点?

マカフィーに食われてしまうのもそうだが、もっとも重要な点はVBSがANSIテキスト形式であること。が挙げられる。ユニコード形式とかだとうまくいかないときがある。これどこにも書いていないので間違いなのかもしれないが。

歴史

WindowsでWSHスクリプトコードを暗号化する @IT クラウド Windows Server Insider Tech Tips
は2004年の記事であるが。Windows Script Encoder(日本語版)はもうダウンロードできない。
しかしながら
VBScriptの暗号化
では

以前は Windows Script Encoder というツールがマイクロソフトから提供されていたが、現在はWindow OSに標準で暗号化機能が用意されている。scrrun.dllのEncoderオブジェクトを利用してVBScriptを暗号化するスクリプトを作成できる。

とのことである。実際上記のVBAはその機能を利用しているのである。

※20190224補足
VBSをVBEに変換し暗号化する方法
こちらはVBSでドラッグアンドドロップしてVBEに変換する。
この時コードをFilesystemobjectで書いているのを見ても、やはりS-Jisのようだ。

参考リンク

Encode a Script encode.vbs gallery.technet.microsoft.com
スクリプト エンコーダの概要
スクリプト エンコーダの構文
スクリプト エンコードのサンプル
OpenAsTextStream メソッド

スクリプト エンコードのサンプルの補足
<HTML>
<HEAD>
<TITLE>Script Encoder Sample Page</TITLE>
<SCRIPT LANGUAGE="JScript">
<!--//
//Copyright® 1998 Microsoft Corporation. All Rights Reserved.
//**Start Encode**
function verifyCorrectBrowser(){
  if(navigator.appName == "Microsoft Internet Explorer")
    if (navigator.appVersion.indexOf ("5.") >= 0)
      return(true);
    else
      return(false);
}
function getAppropriatePage(){
  var str1 = "Had this been an actual Web site, a page compatible with ";
  var str2 = "browsers other than ";
  var str3 = "Microsoft Internet Explorer 5.0 ";
  var str4 = "would have been loaded.";
  if (verifyCorrectBrowser())
    document.write(str1 + str3 + str4);
  else
    document.write(str1 + str2 + str3 + str4);
}
//-->
</SCRIPT>
</HEAD>
<BODY onload="getAppropriatePage()">
</BODY>
</HTML>

これはメモ帳を開き、まず拡張子をHTML、ANSI形式で保存する。
上記のHTMLをコピペして保存。
Microsoft Internet Explorerまたはedgeで開く。
image.png
インストールされていれば、Explorerのホームタブの開くで切り替えることができる。

設定にもよるが、IEの場合、
image.png
という警告が出る。コードを確認してから許可すること。

スクリプトをエンコードする(発掘)

Encode a Script
Uses the VBScript Encoder object to encode one or more VBScript scripts. Just drag and drop files to encode onto Encoder.vbs, and encoded copies (with a .vbe extension) will be c
Submitted By: Shawn Stugart
Uses the VBScript Encoder object to encode one or more VBScript scripts. Just drag and drop files to encode onto Encoder.vbs, and encoded copies (with a .vbe extension) will be created in the same directory.

VBScriptエンコーダオブジェクトを使用して、1つ以上のVBScriptスクリプトをエンコードします。ファイルをドラッグアンドドロップしてEncoder.vbsにエンコードするだけで、エンコードされたコピー(拡張子は.vbe)はcになります。
評価(4)
提出者: Shawn Stugart
VBScriptエンコーダオブジェクトを使用して、1つ以上のVBScriptスクリプトをエンコードします。ファイルをドラッグアンドドロップしてEncoder.vbsにエンコードするだけで、エンコードされたコピー(.vbe拡張子付き)が同じディレクトリに作成されます。

Option Explicit
Const ForReading = 1
Const TristateFalse = 0
dim oEncoder, oFilesToEncode, file, sDest
dim sFileOut, oFile, oEncFile, oFSO, i
dim oStream, sSourceFile

set oFilesToEncode = WScript.Arguments
set oEncoder = CreateObject("Scripting.Encoder")
For i = 0 to oFilesToEncode.Count - 1
    set oFSO = CreateObject("Scripting.FileSystemObject")
    file = oFilesToEncode(i)
    set oFile = oFSO.GetFile(file)
    Set oStream = oFile.OpenAsTextStream(ForReading, TristateFalse)
    sSourceFile=oStream.ReadAll 
    oStream.Close 
    sDest = oEncoder.EncodeScriptFile(".vbs",sSourceFile,0,"") 
    sFileOut = Left(file, Len(file) - 3) & "vbe" 
    Set oEncFile = oFSO.CreateTextFile(sFileOut) 
    oEncFile.Write sDest 
    oEncFile.Close 
Next 

復元するに当たり、わかりやすいように定数を加えたが、原文のスクリプトはSet oStream = oFile.OpenAsTextStream(1)となっている。つまりASCIIであることがわかる。

Decodeと文字コード

VBScript の難読化と解除
日本語が入れば不可能だったDecodeに成功していた。
https://gallery.technet.microsoft.com/Encode-and-Decode-a-VB-a480d74c
元になっているコードのサイトは現存しない。
ただ、このデコードでもやはり、ANSIなのは確認できる。

メモ帳(NOTEPAD.exe)の文字コード

メモ帳の既定の文字コードが[UTF-8]に(ショートカットキーも追加)- hamachan.info
2020年のWindows10 Version 1903以降のメモ帳はUTF-8がデフォルトになっている。
このままVBSを作成するとエラーになるため、保存するときにANSIに変更する必要がある。

image.png

変更履歴

vbnetではコードが装飾されないのでVBに変更
また参考リンクの増加、記述を若干みなおし。
htmlのサンプルの作成方法を補足。(2022/07/15)
公式がコードサンプルを削除したので発掘。(2022/07/15)
メモ帳の文字コードのデフォルトの変更を注意喚起(2022/07/15)

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3