1

Тема: WSH: обфускация и Microsoft Script Encoder

Обфускация (англ. obfuscate — затемнять) — это приведение исходного текста скрипта к виду, сохраняющему его функциональность, но затрудняющему анализ, понимание алгоритмов его работы и модификацию. Цели обфускации — это защита кода от слишком любопытных глаз и рук, и, возможно, небольшая оптимизация интерпретируемой программы: уменьшение её размера и ускорение работы. Обфускация может использоваться и для неблаговидных целей, таких, как обход спам-фильтров или скрытие авторства программ.

Script Encoder — это бесплатный простой инструмент командной строки, который даёт возможность закодировать скрипт Windows Script Host или ASP. Script Encoder будет работать в Windows 98/Me/NT4/2000/XP. Дистрибутив Script Encoder имеет размер менее 200 Кб.

Чтобы использовать Script Encoder, разработайте и отладьте свой сценарий обычным способом, а затем используйте эту утилиту, чтобы закодировать конечный сценарий. Script Encoder использует специальные маркеры в исходном коде скрипта, чтобы определить, где должно начаться кодирование. Маркер для VBScript выглядит так:

'**Start Encode**

Маркер для JScript выглядит так:

//**Start Encode**

Если маркеры не используются, кодируется весь сценарий. Script Encoder используется в командной строке следующим образом:

screnc [опции] <source> <destination>

Подробное описание опций командной строки вы найдёте в справочном файле в поставке. При обработке файлов .js и .vbs они должны превращаться в результате в файлы .jse и .vbe. Пример скрипта на VBScript:

Wscript.Echo("Привет, Script Encoder!")
'**Start Encode**
Wscript.Echo("Привет ещё раз, Script Encoder!")

После обработки командой наподобие screnc test.vbs test.vbe этот скрипт будет выглядеть примерно так (здесь приведён только пример внешнего вида, этот код не запустится):

Wscript.Echo("Привет, Script Encoder!")
'**Start Encode**#@~^NwAAAA==@#@&d1DbwYc214WvJПривет~ещёPразBPj^MkwD~2    mW9n."r#@#@&XgsAAA==^#~@

Полученный файл test.vbe будет таким же скриптом, как и test.vbs — его можно будет запустить как двойным щелчком в Проводнике, так и с помощью cscript.exe из командной строки.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

2

Re: WSH: обфускация и Microsoft Script Encoder

Файлы html и hta с помощью Script Encoder можно обработать примерно такой командой:

screnc /e html test.hta test1.hta

Теги закодированных скриптов в HTML-коде будут выглядеть следующим образом:

<SCRIPT LANGUAGE="VBScript.Encode">
<SCRIPT LANGUAGE="JScript.Encode">

Аналогично можно обработать и файлы сценариев wsf. Однако, такие файлы не должны содержать "жёсткий" XML, т.е. теги <?xml?> и <[CDATA[…>, иначе Script Encoder выдаст ошибку. В справке Script Encoder также заявлена обработка скриптлетов sct (т.е. wsc).

Можно кодировать скрипты и программно, с помощью объекта "Scripting.Encoder". Объект имеет единственный метод:

Function EncodeScriptFile(ByVal szExt As String,
                          ByVal bstrStreamIn As String,
                          ByVal cFlags As Long,
                          ByVal bstrDefaultLang As String) As String

Параметры:
    * szExt — расширение файла, например ".vbs", ".js", ".htm", ".html";
    * bstrStreamIn — текст скрипта для кодирования;
    * cFlags — всегда 0;
    * bstrDefaultLang — язык, например, "VBScript", "JScript".
Метод возвращает закодированный текст скрипта. Пример использования на VBScript:

Set objIScriptEncoder = WScript.CreateObject("Scripting.Encoder")
Set objFSO            = WScript.CreateObject("Scripting.FileSystemObject")
Set objTS             = objFSO.OpenTextFile("C:\Temp\script.hta")
strTempString         = objTS.ReadAll
objTS.Close
Set objTS             = objFSO.CreateTextFile("C:\Temp\scripte.hta", True)
objTS.Write objIScriptEncoder.EncodeScriptFile(".html", strTempString, 0, "VBScript")
objTS.Close

Благодарность за помощь при написании этого обзора — YMP и alexii.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

3

Re: WSH: обфускация и Microsoft Script Encoder

Возможно и обратное раскодирование. Приведённый ниже скрипт получает в качестве параметра закодированный файл, и создаёт файл .txt с результатами расшифровки (скрипт найден на просторах Интернета, используйте на свой страх и риск):

Option Explicit
Dim oArgs, NomFichier
NomFichier = ""
Set oArgs = WScript.Arguments
Select Case oArgs.Count
Case 0
    NomFichier = ""
Case 1
    If Instr(oArgs(0), "?")=0 Then
        NomFichier = oArgs(0)
    End If
Case Else
    WScript.Echo "Слишком много параметров."
End Select
Set oArgs = Nothing
If NomFichier <> "" Then
    Dim fso
    Dim a
    Set fso = WScript.CreateObject("Scripting.FileSystemObject")
    If fso.FileExists(NomFichier) Then
        Dim fic,contenu
        Set fic = fso.OpenTextFile(NomFichier, 1)
        Contenu = fic.readAll
        fic.close
        Set fic = Nothing
        Const TagInit = "#@~^"
        Const TagFin = "==^#~@"
        Dim DebutCode, FinCode
        Do
            FinCode = 0
            DebutCode = Instr(Contenu, TagInit)
            If DebutCode > 0 Then
                If (Instr(DebutCode, Contenu, "==") - DebutCode) = 10 Then
                    FinCode = Instr(DebutCode , Contenu, TagFin)
                    If FinCode > 0 Then
                        Contenu = Left(Contenu, DebutCode - 1) & _
                        Decode(Mid(Contenu, DebutCode + 12, FinCode - DebutCode - 12 - 6)) & _
                        Mid(Contenu, FinCode + 6)
                    End If
                End If
            End If
        Loop Until FinCode = 0
        Set a = fso.CreateTextFile(NomFichier & ".txt", 1)
        a.WriteLine Contenu
        a.Close
    Else
        WScript.Echo Nomfichier & " не найден."
    End If
    Set fso = Nothing
Else
    WScript.Echo "Укажите имя файла."
    WScript.Echo "Использование: " & wscript.fullname & " " & WScript.ScriptFullName & " "
End If
'========================================================================================
Function Decode(Chaine)
    Dim se, i, c, j, index, ChaineTemp
    Dim tDecode(127)
    Const Combinaison = "1231232332321323132311233213233211323231311231321323112331123132"

    Set se = WSCript.CreateObject("Scripting.Encoder")
    For i=9 to 127
        tDecode(i) = "JLA"
    Next
    For i=9 to 127
        ChaineTemp = Mid(se.EncodeScriptFile(".vbs", string(3,i), 0, ""), 13, 3)
        For j=1 to 3
            c = Asc(Mid(ChaineTemp,j,1))
            tDecode(c) = Left(tDecode(c), j-1) & chr(i) & Mid(tDecode(c), j+1)
        Next
    Next
    tDecode(42) = Left(tDecode(42), 1) & ")" & Right(tDecode(42), 1)
    Set se = Nothing
    Chaine = Replace(Replace(Chaine,"@&",chr(10)),"@#",chr(13))
    Chaine = Replace(Replace(Chaine,"@*",">"),"@!","<")
    Chaine = Replace(Chaine,"@$","@")
    index = -1
    For i=1 to Len(Chaine)
        c=asc(Mid(Chaine,i,1))
        If c < 128 Then index=index+1
        If (c=9) or ((c>31) and (c<128)) Then
            If (c<>60) and (c<>62) and (c<>64) Then
                Chaine = Left(Chaine,i-1) & _
                         Mid(tDecode(c), Mid(Combinaison, (index mod 64)+1, 1), 1) & _
                         Mid(Chaine, i+1)
            End If
        End If
    Next
    Decode = Chaine
End Function

Ещё одна программа для обратного раскодирования скриптов — Windows Script Decoder, это инструмент командной строки (бесплатен). Работает чуть аккуратнее, чем вышеприведённый скрипт (не оставляет NULL в конце), и можно указать кодировку.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

4 (изменено: Аскет, 2012-02-03 02:27:55)

Re: WSH: обфускация и Microsoft Script Encoder

Не вижу смысла в SCRENC.EXE, ещё и маркеры с ключями расставлять...Не труЪ как-то.


Разрешите представить - Обфускатор WSH (на основе WSH), или ласково SCRENC.VBS.

&#9679; Шифрует файл целиком
&#9679; Шифрует неопределяемые типы файлов движком VBEncode, независимо от расширения. Только текстовые файлы, но видимо что и с бинарными можно подружить.

На выходе получаете VBE/JSE/HT(A/M/ML) файл с аналогичным именем или суфикс-расширением "enc.txt".


'***********************************************
'* Name:        Real Script for encrypt		*
'* Language:   VBScript						*
'* CommandLine: screnc.vbs script.ext		  *
'* Description:  VBS/JS/HTML/HTA encryptor     *
'* CopyLeft:     Аскет, spt 2011			   *
'***********************************************

	Option Explicit
Dim FSO, ENC, file,ftype, code, deCode, sign, ext,newExt
IF WSCRIPT.ARGUMENTS.COUNT=0 THEN 
	msgbox "Задай входной файл  [VBS]/JS/HTML",,"Real Script for encrypt"
	wscript.quit
 ELSE
	file = WSCRIPT.ARGUMENTS(0)
end if

sign = "#@~^tgAAAA==@#@&:dT4K6PrKMrl^P2+MkG[,tlk~2XwkMn[""rPLP-4^.,[EA!zP	WA~6EVs~7+./bG	RE,[,mtM`8T#,[~m4DcqZ#PL~JDDERdmMkaY@$XCU9+aRM;J,[~Er~.$(	0GDsCDkG	~rI+mV,dmMk2Y,0G.,+x1.XaYP ~PDbl^P-+.dbWUJ@#@&AzkAAA==^#~@"

set FSO = CreateObject ("Scripting.FileSystemObject")
ext = FSO.GetExtensionName(file)
code = FSO.OpenTextFile (file).ReadAll
file = FSO.GetParentFolderName(file) & "\" & FSO.GetBaseName (file)

SET enc = CreateObject ("Scripting.Encoder")
ftype=""
ftype=magic(ext)
deCode = enc.EncodeScriptFile ( "." & ext, code, 0,"" )

if (ext="vbs") AND (newext<>".enc.txt") Then
	deCode = mid(deCode,1,len(deCode)-1)
	FSO.OpenTextFile (file  & newExt , 2, true).writeline ( sign & decode )
elseif (ext=".js") Then
	deCode = mid(deCode,1,len(deCode)-1)
	FSO.OpenTextFile (file  & newExt , 2, true).writeline ( decode )
 elseif (newext=".enc.txt") Then
	deCode = mid(deCode,1,len(deCode)-1)
	FSO.OpenTextFile (file  & newExt , 2, true).writeline ( decode )
 else
	FSO.OpenTextFile (file  & newExt , 2, true).writeline ( decode )
end if

function magic(byref ext)
	
	select case lcase(ext)
		case "js"
			newExt=".jse"
			magic="JScript"
		case "vbs"
			newExt=".vbe"
			magic="VBScript"
		case "htm"
			newExt=".HTML"
		case "html"
			newExt=".HTM"
		case "hta"
			ext="html"
			newExt=".enc.HTA"
		case else 
			ext="vbs"
			newext=".enc.txt"
			magic="VBScript"
	end select
end function