screncによるエンコードの意義

前回、screncがなんぼのもんじゃいと思って興味本位でデコードを試みてみた。目が痛くなって頭がボーッとして、根気が続かないので断念したが、(デコードできていないのにこういうのもなんだが)時間をかければいけそうな気がする。自分みたいなハシクレでもいけそうな気がする程度のものなので、頭のいい人だったらササッとデコードできるんじゃないか。

Web上でデコードツールを探してみた。いやあ、あることあること。でもEXEが多い。これじゃロジックが分からないのでつまらん。と思っていたら、スクリプトデコーダを書いた人がいた。


http://john.bryntze.net/jbkb/index.php?title=Script-kb1_Decode_vbe_files


ヘッダとフッタの部分の認識は合っていた。要はここのファンクションらしい。

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
  'Next line we correct a bug, otherwise a ")" could be decoded to a ">"
  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


このファンクションにヘッダとフッタをトリムしたものを食わせればデコードできる。ロジックについては今度ゆっくり見るとして、そもそもたったこれだけのプログラムでこんなに簡単にデコードできるんじゃ意味ないじゃないか。攻撃する側から見ても一発変換できるような難読化をかけるくらいなら、ゴミコードを大量に書いたほうがよっぽど時間稼ぎになるし、難読化という目的にも合致するのでは?

簡単なロジックをわざわざ長ったらしく冗長に書き出すような難読化変換ツールってないものか。最近、思考が攻撃する側になっている気がするが。

ちなみにScriptのデバッグ方法について。コマンドプロンプトより

>aaa.vbs //d //x

とすることで、デバッグモードでスクリプトが起動し、開始直後に例外が発生する。そこでVSにアタッチすればデバッグできる。