var SectionTitles=new Array( "MS Script Encoder: ukßzka bezpeΦnosti p" , " Jak to funguje?" , " Zkusme si s tφm pohrßt" , " Algoritmus" , " Jak je vid∞t, znaky se opakujφ, tak₧e t" , " Dek≤dovacφ tabulky" , " Zßv∞r" , " Dodatek" );
Intro('The Windows Script Encoder (screnc.exe) je malß utilitka od Microsoftu, kterß umo₧≥uje zak≤dovat vaÜe skripty (tj. JScript, ASP a VBScript). Ano, zak≤dovat, nikoliv zaÜifrovat. Jejφm cφlem je ochrßnit k≤d nap°φklad WWW strßnek nejen p°ed kopφrovßnφm pro jinΘ ·Φely, ale i p°ed prost²m \"koukßnφm\" na zdrojov² text Φi p°ed jeho modifikacφ. Microsoft <a href=../microsoft.com/Seminar/1033/20001010IISSecMH1/Seminar.htm>doporuΦuje</a> pou₧φvßnφ tohoto nßstroje pro \"zahalenφ\" skuteΦnΘho know-how strßnky. Progrßmek si m∙₧ete stßhnout <a href=../msdn.microsoft.com/scripting/default.htm@_2Fscripting_2Fvbscript_2Fdownload_2Fvbsdown.htm>zde</a>');
Jak ji₧ bylo °eΦeno: nejednß se o ₧ßdnΘ Üifrovßnφ ale o prost² neparametrick² k≤d. V tomto duchu se vyjad°uje i dokumentace : <i>Uv∞domte si, ₧e zak≤dovßnφ znemo₧nφ maximßln∞ p°eΦφst zdroj, ale pokroΦilΘmu hackerovi zjistit, co jste napsali, nezabrßnφ</i>.
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
Zak≤dovan² skript je takΘ chrßn∞n p°ed ·pravami.
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
Algoritmus nebyl slo₧it². Psanφ tohoto Φlßnku mi ve skuteΦnosti zabralo vφce Φasu, ne₧ vlastnφ kryptoanal²za. Ale myslφm, ₧e n∞co podobnΘho m∙₧e b²t velmi hezkΘ cviΦenφ pro ty, kte°φ se analyzovßnφm takov²chto algoritm∙ zab²vajφ, nebo se jimi n∞kdy zab²vat cht∞jφ. Znßme otev°en² text, znßme zaÜifrovan² text, ale neznßme algoritmus. Pravda, deÜifrovßnφ zajiÜ¥uje COM objekt, kter² je s IE pochopiteln∞ dodßn, Φili disassemblovßnφ by dan² problΘm takΘ °eÜilo. TakΘ z toho plyne, ₧e takto zak≤dovanß strßnka bude funkΦnφ pouze v Internet Exploreru (navφc veze 5.0 a vyÜÜφ)
</DIV></FONT></b></i>
<A Name="Title1"><FONT Size=3><DIV Class=Headline>Jak to funguje?</DIV></font>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
Srcenc.exe funguje velmi jednoduÜe. Jako parametry si bere jen nßzev vstupnφho a v²stupnφho souboru a co vÜechno se mß k≤dovat poznß podle p°φpony poznß, co vÜechno se bude k≤dovat.
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
Uva₧me tedy nßsledujφcφ javascript,
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
<PRE><SPAN Class=CODE>
<SCRIPT LANGUAGE="JScript">
<!--//
//**Start Encode**
alert ("this code should be kept secret!!!!");
//-->
</SCRIPT>
</SPAN></PRE>
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
kter² po prob∞hnutφ k≤dovacφm algoritmem vypadß takto:
Jak vidφte, "jazyk" javascriptu se zm∞nil z <SPAN Class=CODE>JScript</SPAN> na <SPAN Class=CODE>JScript.Encode</SPAN>. Takto se volß zmi≥ovan² objekt <SPAN Class=CODE>Scripting.Encoder</SPAN>.
</DIV></FONT></b></i>
<A Name="Title2"><FONT Size=3><DIV Class=Headline>Zkusme si s tφm pohrßt</DIV></font>
Jak je vid∞t, znaky @#@& p°edstavujφ novou °ßdku (CRLF, @# = CR, @& = LF) a na v²sledek mß takΘ jist² vliv pozice znak∙. V prvnφm p°φpad∞ HaiHaj dalo CCbCmk, v druhΘm CmrCmk. Zkusme nynφ zak≤dovat °adu znak∙ "A".
Jak je vid∞t, znaky se opakujφ, tak₧e to vypadß, ₧e pφsmeno A mß t°i reprezentace: b, z a ). Pokud si zak≤dujete °adu BΦek, dostanete jinß pφsmena, ale stejn² vzorek. ╪et∞zec se opakuje po 64 znacφch, co se pozice znaku t²Φe, roli hraje jen hodnota <SPAN Class=CODE>i mod 64</SPAN>. Algoritmus tedy bude vypadat p°ibli₧n∞ nßsledovn∞:
Moje pozorovßnφ potvrdilo poΦßteΦnφ domn∞nku, ₧e se k≤dujφ jen ASCII znaky 32 a₧ 126 vΦetn∞ a 9 (TAB). Zbytek se vyescapuje podobn∞ jako CR a LF. Co zbylo je "vata" na zaΦßtku a konci zak≤dovanΘho textu. Obsahuje pravd∞podobn∞ n∞jk² kontrolnφ souΦet a ·daj o dΘlce skriptu.
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
K≤dovacφ tabulky
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
Nynφ musφme nalΘzt tabulky, kter²ma se text k≤duje. Zjistit obsah tabulky pick_encoding nenφ t∞₧kΘ, staΦφ se podφvat na vzor, kter² produkovala k≤dovacφ funkce na °ßdku ßΦek.
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
<PRE><SPAN Class=CODE>int pick_encoding[64] =
{
1, 2, 0, 1, 2, 0, 2, 0, 0, 2, 0, 2, 1, 0, 2, 0,
1, 0, 2, 0, 1, 1, 2, 0, 0, 2, 1, 0, 2, 0, 0, 2,
1, 1, 0, 2, 0, 2, 0, 1, 0, 1, 1, 2, 0, 1, 0, 2,
1, 0, 2, 0, 1, 1, 2, 0, 0, 1, 1, 2, 0, 1, 0, 2
};</SPAN></PRE>
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
V tom jsme m∞li znaky CR a LF na zaΦßtku, tedy po jejich vypuÜt∞nφ je vid∞t, ₧e 0, 1, 2, 0, 2, 0, 0, 2 p°esn∞ odpovφdß b, ), z, b, z, b, b, z , kde b=0, )=1 a z=2. Druhß tabulka (<SPAN Class=CODE>lookuptable</SPAN>) p°edstavuje matici, ve kterß jsou ulo₧eny v₧dy t°i reprezentace jednoho znaku. Kter² z nich bude pou₧it, zßvisφ na </SPAN>pick_encoding</SPAN>. Hodnoty tΘto tabulky zjistφme, pokud algoritmu do vstupu podstrΦφme text, ve kterΘm se ka₧d² znak zak≤duje prßv∞ t°ikrßt. Musφme vzφt ale v ·vahu jeho pozici, resp. musφme za°φdit, aby vÜechny tyto testovacφ znaky zaΦφnali na stejnΘm indexu <SPAN Class=CODE>i mod 64</SPAN>. Trojici tedy doplnφme vpravo ßΦky.
A tak dßle. Pokud vßs mate, ₧e v²pln∞ je jen 59 znak∙, musφte uvß₧it jeÜt∞ CR a LF znaΦφcφ konec °ßdky (59+2+3). PotΘ, co toto strΦφme do programu a z v²sledku vyma₧eme v²sledek ßΦek (stejn∞ tak @#@& zastupujφcφ CR a LF), obdr₧φme reprezentaci cht∞n²ch znak∙ v ASCII:
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
<SPAN Class=CODE>d7i P~, "Ze JEr a:[ ^yf ]Yu ['L BvE `cv #b* eMC _Q3 ~SB OR R c z&J !TZ Fq8 +y &f2 c*W *Xl
.M /dk YOD E;! \-7 hAS 6aX XzH y". `P uk- 8N) U=? </SPAN>
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
Jak je vid∞t, znaky <, > a @ se vyescapovaly takΘ, a to na hodnoty @!, @* a @$ v tomto po°adφ. Pro p°φpadnou implementaci vypadß tabulka <SPAN Class=CODE>encoding</SPAN> v hexadecimßlnφm provedenφ takto:
Tabulka <SPAN Class=CODE>pick_encoding</SPAN> evidentn∞ z∙stane stejnß, nebo¥ ka₧d² znak (mimo ty vyescapovanΘ) z∙stane na svΘm mφst∞. Dßle staΦφ jen vyhledat inverznφ hodnoty, tj. reprezentace, kterΘ odpovφdajφ danΘmu znaku. Tak nap°φklad 'A' (hex <SPAN Class=CODE>0x41</SPAN>), se v tabulce <SPAN Class=CODE>encoding</SPAN> vyskytuje na t∞chto mφstech:
V p°edposlednφm °ßdku je jasn∞ vid∞t v²jimka pro tabulßtor (9), stejn∞ tak jako odeΦtenφ hodnoty 31. S <SPAN Class=CODE>transformed</SPAN> pak jednoduÜe vyhledßme vÜechny hodnoty. Kdy₧ <SPAN Class=CODE>i</SPAN> je pozice znaku <SPAN Class=CODE>c</SPAN> tak
Je jasnΘ, ₧e ji₧ idea k≤dovßnφ HTML Φi JS je sama o sob∞ bezpeΦnostn∞ spornß, nebo¥ v₧dy existuje cesta, jak se domoci originßlu. Vedle jin²ch, komerΦnφch produkt∙, kterΘ tuto slu₧bu nabφzejφ, mß vÜak Microsoft navrch, nebo¥ dek≤dovßnφ implementoval p°φmo do prohlφ₧eΦe a nikoliv v javascriptu, co₧ je jinak jedinß mo₧nß cesta. Pak Φasto ale staΦφ nahradit funkci <SPAN Class=CODE>eval()</SPAN> (vykonß parametr jako javascript) prost²m <SPAN Class=CODE>document.write</SPAN> a zdrojov² text je na sv∞t∞. Negativnφ strßnka je ale samoz°ejm∞ v omezenosti na platformu Exploreru.
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
Nehled∞ na to si ale p°iznejme, ₧e samotn² algoritmus je skuteΦn∞ trapn², na to, jak jednoduchß ·loha toto je. StaΦφ implementovat jakoukoliv znßmou Üifru a do k≤dovacφho a dek≤dovacφho algoritmu zadat stejn² symetrick² klφΦ. Jedin² problΘm m∙₧e b²t v "nehezk²ch" znacφch v "textovΘm" HTML/JS souboru, kterΘ je t°eba chyt°e p°evΘst na normßlnφ "klßvesnicovou" abecedu (vstup m∙₧eme p°ed p°edßnφm Üif°e zkomprimovat, tak₧e na druhΘ stran∞ si je mo₧nΘ jistΘ prodlou₧enφ).
Text (mimo dodatku redakce) byl p°evzat ze strßnky <a href=../www.klaphek.nl/nr6/scrdec.html>http://www.klaphek.nl/nr6/scrdec.html</a>, program si m∙₧ete stßhnou na adrese <a href=../www.virtualconspiracy.com/index.php@page=scrdec_2Fintro>http://www.virtualconspiracy.com/index.php?page=scrdec/intro</a>.</TEXTAREA>-->