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