Codz: ; t! }- ?# R# }5 x0 K' l3 [) |% l/ y
str="cswpire.tohcO"" ""!K" " b* G* _1 b$ j; t8 d1 _8 c& B
for i=1 to len(str) step 3
8 f6 O$ P$ j+ P+ w' I2 [6 Lrev=rev+strreverse(mid(str,i,3))
; c; p- t6 t n7 Q" \9 \next ' \7 y6 f- i9 b/ c: ]
execute rev. A+ i9 z& F, A
/ }1 w. e+ Q0 i6 T% c! }% i. h3 j8 ~0 P
一个最简单的“壳”。“壳”的算法是每n个字符反转顺序一次。n就是算法的“种子”,本例中它等于3。
7 ]3 V) e& x \9 ~, G. P这个“壳”是死的,起不到减少特征码的效果。反而增加了特征码,如"cswpire"。
' b( H4 ^( n- m$ {* D4 }! P; I3 X$ L& Z/ U% D+ @- ^
下面看一个复杂些的例子:% b5 Y# S4 R+ V( u
Codz: # i9 C, i+ O( q. Q8 _5 h0 q7 g+ A, o
str="wscript.echo ""OK!"":randomize:key=int(rnd*8+2):str=rev:str=replace(str,chr(34),chr(34)+chr(34)):set aso=createobject(""ADODB.Stream""):with as.open:.writetext ""str=""+chr(34)+str+chr(34)+"":key=""+cstr(key)+"":str=rev:execute str:function rev():for i=1 to len(str) step key:rev=rev+strreverse(mid(str,i,key)):next:end function"":.savetofile wscript.scriptfullname,2:end with":key=1:str=rev:execute str:function rev():for i=1 to len(str) step key:rev=rev+strreverse(mid(str,i,key)):next:end function- Y- |" N( O! v
6 f% t) C7 C4 E" P' z. {(注意,该代码只有一行,没有回车)
% W9 F2 e$ J) s: H9 {- P2 l6 T ^: C6 a' G
保存成vbs文件,双击执行,效果还是和前一段代码一样,弹出一个对话框显示"OK!"。4 u5 ?& _9 A7 k: |) Q
但是,执行完后再看代码,可能变成了这样:
8 @$ \' u% @% C* s9 v4 ^# i! HCodz: . W9 n: N. f) V* c) N
str="tpircsw"" ohce.ar:""!KOezimodnni=yek:8*dnr(trts 2+ts:ver=alper=r,rts(ec)43(rhc43(rhc,3(rhc+)tes )4rc=osa jboetaeDA""(tcertS.BDOw ""maeosa hti:nepo.:tetirw.ts"" txerhc+""=rts+)43(3(rhc+rek:""+)4tsc+""=y+)yek(rr=rts:""cexe:verts etuitcnuf ver noi rof l ot 1=)rts(nek pets =ver:yerts+veresreverts(dim(yek,i,rtxen )uf dne:""noitcntevas.:w elifo.tpircsftpircsemanllu dne:2,htiw":key=7:str=rev:execute str:function rev():for i=1 to len(str) step key:rev=rev+strreverse(mid(str,i,key)):next:end function- j3 K" B7 [0 T& q1 Z' ?+ k) m
" g- K) V6 P1 n9 D& U6 V, |0 ]
& \ `3 ?% g9 ]$ L6 ?再执行,又变成其他样子了。这个脚本是自变形的。
9 o9 W/ u* a2 f& J) Z0 j s7 K0 A% W( q6 U
如果仔细看代码就会发现,“壳”的算法依旧,而“种子”随机改变。但是,加壳过的内容每次不同了,“壳”本身还是没有任何改变。很多exe加壳工具加的壳,本身就被当作恶意代码来提取特征码。为了更好的反查杀,脚本的“壳”也需要动态改变。这就要用到所谓的多态技术。不过,exe的多态是用来反动态查杀的,而脚本的“多态”只是应付静态查杀,两者有很大不同。- Q4 l$ O7 m/ [3 ]& v2 W8 \- q
1 [; W7 |( c- {对于exe,真正的多态目前还未听说被实现的。脚本也只能做多少算多少。
- e# e, p/ N0 Q+ _; [. u5 E! i6 O; B不影响功能的变形方法,除了上面提到的3种,还有:' i2 y8 P; J: b: @
1,随机改变大小写;& U, Z& r. N$ |; ^* K
2,冒号( 与回车符随机互换(字符串内和"then"之后的冒号除外);
# K! O- x+ d& V! [$ d3,字符串分割时,"+"与"&"随机互换;; }2 [/ u5 y: b; ]
4,()+-*/&,等字符两边任意添加空格或续行符(_)和回车符的组合;
4 Z* a; `5 `/ m g+ W; ^5,用自定义函数替换内置函数;即使自定义的函数只是简单的封装内置函数,但至少改变了关键字的位置。5 U! j$ B, a5 ?& E7 |) a
…………8 a9 b' t) P* ?+ g' r& k
还有其他“多态”算法有待你的研究。& c+ z- v2 B- [& V1 W0 ]) ^8 f
|