说明一下,这个程序可以将自己加密,然后将自己复制为automidi.htm文件。
它的主要工作流程是先将自己解密,然后再加密,最后复制自己。
且不论它的工作性质是否具有病毒的特性,鄙人认为,它的加密技术值得研究,因为,每次加密后的代码都不相同。
大家一同研究,这可能需要一段时间。
如果有了结果,请贴出来一起参考。
它的主要工作流程是先将自己解密,然后再加密,最后复制自己。
且不论它的工作性质是否具有病毒的特性,鄙人认为,它的加密技术值得研究,因为,每次加密后的代码都不相同。
大家一同研究,这可能需要一段时间。
如果有了结果,请贴出来一起参考。
var m=68683;这个值是替换ASC时候用来控制边界的。
猜想大致的加密函数为下列形式:
function encode(str)
{
for(...;str.length;...)
{
tmp1==String.fromCharCode(str.charAt(...))
if(tmp1>m)tmp1%=m;
....
}
}
解密想法了。
不知道我说的对不?我没有看所有的代码,实在看不下去,头痛,所有的变量名和函数名过于简化,头痛,频繁的调用,纯粹的过程语言!他妈的,还不如让我去看CIH源码,不比汇编好多少,请允许我骂人,这不是人干的。
js为了能后执行真的很难真正的加密,我不知道能不能彻底的加密,除非从解释器下手,如果能够访问解释器某些接口,否则我觉得不能彻底加密js。这种加密方法加密后的代码人就可以很容易的得到源代码,只比原来多了一层eval而已,也就是嵌套加密了。
就说这么多了,我想他的思路就是这么多了,希望我的判断是对的,完全根据直觉。===================
个人意见,仅供参考
我的邮箱。有意结识请留下联系。
很愿意和高手相识。
所提出的过程语言不予苟同,它只是将函数名简化以混淆实现而已。
最后,还是请高手们能够对上面的代码给出详细的注释,虽然可能会花一定时间,但这可能会接触某些作者的杰出思想。
你很让我失望,竟然没有一次回答。或许你只是在使用javascript上相对熟悉而已,并不能称上高手。希望你能回复这句话。在此,感谢llrock(百乐宝||昨夜星辰) 对本贴所付出的时间和精力。
感谢。
她的原理无非是模仿了哈希表的哈西函数,从而建立索引和字符位置之间的关系,function fo(s,q,h)就是那个伪哈希函数了,
你可以看到h=h*9137%m;x=h-q;9137应该是个素数,并且远离2的某一次幂,且足够大,这正是取模构造哈西函数的条件,其他的没什么了。
个人认为原作者的代码过于繁琐,效率比较低。我去联众打牌去了
function z(a)
{//返回一个随机整数
with(Math)
{
return floor(random()*a)
}
}
//--------------------------------------------------function hs()
{//返回一个空格或这u,好象u绝大多数为空
return(z(2)?' ':u)
}
//--------------------------------------------------function ha(f)
{//返回大小些字母和数字,
/*
当f&4为0,并且x随机后在[26,35]中时,返回数字;
否则返回大写或小写字母;
*/
var x=z(f&4?26:36);
return String.fromCharCode(x+=x<26?(((f&1)<<5)^az):22);
}
//--------------------------------------------------function pq(s)
{
d+=ps?lz+s+rz+(--ps?'==!=+ - < >>=<=||&&'.substr(z(yr+5)&30,2):cz):s+(z(yy)||(ps=z(yp)?0:2)?cz:kz)
}
//--------------------------------------------------function mv(n,a,x)
{/* 产生一个由字母和数字组成的变量名,并且存贮到a[n]里,
注意:a是一个数祖对象的引用, n为数组索引,x将影响变量名的长度
*/
var v,f,j;
do
{
f=0;
j=x;
v=ha(4);//得到一个字母,注意4&4=4
if(x<3&&az&32)
{//此时变量名长度为2
v+=ha(1);//得到一个字母或数字,注意1&4=0
}
else
{//此时变量名长度为x。
//****好像有一个bug,当x=0时会出现错误,当z(yy&2)&4=0时有可能出现数字开头的变量名,猜测,我没有仔细看,直觉:)****
while(j--)
{
v+=ha(z(yy&2));
}
}
for(j=0;j<n;j++)
{//遍历a检查是否当前名字已经存在,存在就重新来做,否则f=0结束do while循环,函数调用结束
if(v==a[j])
{
f=1;
break;
}
}
}
while(f);
return a[n]=v;
}
//--------------------------------------------------function sw(a,m,b)
{
return(z(2)?a+m+b:b+m+a)
}
//--------------------------------------------------function pk(a,j,x,y,s)
{
var p=0,q;
for(;p<a.length;j++)
{
q=z((s&&s<p)?y:x);
while(a.charAt(p+q++)==bz);
sa[ka[j]=j]=qq+gg(a.substr(p,q),bz+bz,bz+bz)+qq;
p+=q;
}
return j;
}
//--------------------------------------------------function fa(x,q)
{
var j=x+q;
var n=ka[j];
var v=g[n];
for(j=0;j<=k;j++)
{
if(ka[j]==n)
{
ka[j]=x;
}
}
j=dd.charCodeAt(pp);
if(ka[j]==j&&sa[j]!=u)
{
g[j]=v;
if(pp<m)
{
pp++;
}
}
return v;
}
//--------------------------------------------------
//这里应该就是代码看上去很乱的原因,根据随机的来的h,根据规则打乱cc中字符的顺序
function fo(s,q,h)
{//按照一定规则打乱字符串中字符的顺序,并存放到数组中,这个规则和索引、9137、68683,h相关
var x;
var j=0;
var f=s.length;
var c=new Array(f);
while(j<f)
{
h=h*9137%m;//9137好像是一个足够大的素数,h应该时获得一个相对于68683偏移量
x=h-q;//这个应该就是索引和偏移量之间的计算关系了
if(x<f&&x>=0)
{
c[x]=s.charAt(j++);//存贮一个字符,不是顺序存储的,有点像哈西函数效果
}
}
return c.join(u)//在c尾部加一个u,这个u应该是起结束符作用
}
//--------------------------------------------------
//替换[ ] 为引号
function gg(s,a,x)
{
return s.replace(eval('/'+a+'/g'),x);
}
//--------------------------------------------------function gb()
{
var x;
while(et==(x=g[z(tt)]));
return x
}
//--------------------------------------------------function ga()
{
var s=cc.substr(z(3600),z(yp*4)+3);
if(yy&7)
{
s=zo(s,zb);
}
pq(gb()+ez+qq+s+qq+(z(3)?pz+gb():u));
}
//--------------------------------------------------function sy(b)
{
var h=0;
var c;
var s=u;
do{
if(--h<0)
{
c='()[]{}<>=!&?*,-./|:^'.substr(z(10)*2,2);
h=z(b/8)+1;
}
s+=c;
}
while(s.length<b);
return s;
}
//--------------------------------------------------function zo(s,a)
{
var i;
var x;
var c;
var h;
var b='()[]{}?|^.';
for (i=a.length;i--;)
{
for(x=b.indexOf(c=a.charAt(i)),h=x<0?u:bz;c;x=-1)
{
s=gg(s,h+c,'%'+(c.charCodeAt(0).toString(16)));
c=b.charAt(x^1);
}
}
return s
}
oo=0;
c =null;
//w=String.fromCharCode;//一个替换var g=new Array();
var sa=new Array();
var ka=new Array();var i=z(3)?39:34;//随机决定那个是双引号
var qz=String.fromCharCode(i);// 单引号或双引号
var qq=String.fromCharCode(73-i);//如果qz为单引号则qq为双引号...var u='';
var bz=String.fromCharCode(92);//bz="\";//空或者一个空格,作用在于改变cc的长度,利用javascript语法对空格忽略的特点随机改变cc长度
var d=hs();
var ez=d+'='+d;//一个等号字符串
var pz=d+'+'+d;//一个加号字符串
var lz=hs()+'(',rz=')'+hs();//左、右括号字符串
//一个换行字符串。String.fromCharCode(13,10))换行,后面的无非是添加制表等javascript语法不识别的字符来改变cc长度
var jz=hs()+(lf=String.fromCharCode(13,10))+(z(4)?hs():String.fromCharCode(9));
var cz=';'+hs()+hs();//分号字符串
var kz=z(3)?jz:cz+jz;//换行字符,或者换行前加个分号;var pp=z(3);//?????????????????????????????????????var k;
var m=68683;
var vv;
var dd;
var az=z(2)?65:97;//ASCII表中,A=65 a=97var zb=')]}';
var oz='([{?|^.!&,-/:;<=>@ghijklmnopqrstuwxyzJAMXILOSTFUCHREW'+qz+qq;
var yy=z(12);
var yr=z(12);
var yp=z(20);
var ps;//版权,lf="\n";
var bb;
bb='Jax363 - Auto Modifying Code With Random Apperance Jscript Example'+lf+lf+'Copyright (c) Hamdi Ucar, Orchestra Communication Systems Ltd.,2001'+lf+lf+'Email: [email protected]'+lf+lf+'This program create or rewrite a file named automodi.js on the current directory.'+lf;//产生11个长度为2的字符存到数组g中
for(i=0;i<11;i++)
{
mv(i,g,z(3));
}
//通过异或az在65和97之间切换
az^=32;
//alert(az);//三个重要的变量
ux=g[8];
aa=g[10];
if(z(2)){vv=g[9];}//稍微做些手脚使变量名
// 替换cc中的方括号引号为引号. 注意:原c =null中的"c"变成了g[0]的值
cc=gg('oo='+oo+';cc='+g[0]+';'+g[0]+cc.slice(cc.indexOf(' ='),cc.lastIndexOf(' ')+1),'['+qz+qq+']',qz);
if((uv=z(3))>1)
{
dd=u;
while(z(12))
{
dd+=oz.charAt(z(55));
}
d=cc.slice(i=cc.indexOf(d=String.fromCharCode(125,59),z(3800))+2,k=cc.indexOf(d,i+z(4200-i))+2);
cc=cc.substr(0,i)+zo(d,dd)+cc.substr(k)
}
//打乱cc中字符的排列顺序
cc=fo(cc+sy(z(140)&254)+'*/',i=z(60000)+1,k=z(m));
//???
q=Math.floor(m/(p=70+z(30)));
//这句太长了不想看了,应该是作为解密用的
d=sw(' 5= 2='+(z(3)?m:sw(sw(p,'*',q),'+',m-p*q)),cz,sw(' 3='+i,cz,' 7='+k))+cz+sw(' 1='+sw(' 3','+',(9137-i)),cz,' 0='+qz+qz)+cz+(z(4)?'for(;-- 5;)':'while(-- 5)')+'{ 7*= 1; 7%= 2; 4= 7- 3;if( 4'+sw('>=0',' && 4','<'+cc.length)+') 0+= 6.charAt ( 4) } '+(uv>1?' 0= 8 ( 0);':u)+(vv?vv:'eval')+'( 0)';if(uv)
{
for(dd=u,i=0;i<d.length;i++)
{
dd+=(z(3)&&(c=d.charCodeAt(i))&64)?'%'+c.toString(16):d.charAt(i);
}
d=dd;
}for(i=9;i--;)
{
d=gg(d,' '+i,g[i]);
}d=gg(d,';',';'+hs());
et=g[6];
tt=m=pk(cc,0,4000/(2+z(yr+3)));
sa[m]=qq+qq;
k=m=pk(d,m+1,2+z(22-yr),1+z(3),uv?0:99);if(z(3-uv))
{
p=z(5)+2;
for(i=0;i<m;i+=z(p))
{
sa[i]=gg(sa[i],String.fromCharCode(c=z(26)+97),bz+c.toString(8));
}
}if(uv)
{
sa[m++]='unescape';
}dd=g[ev=m]='eval';
if(z(2)||vv)
{
sa[m++]=dd;
}
dd=d=u;for(i=0;i<m;i++)
{
d+=(i==tt)?u:String.fromCharCode(i);
}while(i=d.length)
{
dd+=d.charAt(i=z(i));
d=d.substr(0,i)+d.substr(i+1)};
p=z(6)+2;
for(i=0;i<m;i++)
{
if(pp)
{
g[dd.charCodeAt(i)]=aa+(pp<2?i+10+yy:'['+i+']');
}
else
{
mv(i,g,z(p)+1);
}
}
d='/*'+lf+lf+bb+lf+lf+'(Run '+oo+')'+lf+lf+'*/'+lf+jz;
if(pp==2){d+=(z(4)?'var ':hs())+aa+ez+(z(3)?hs():jz)+'new Array()'+kz;
}pp=0;
p=0;for(i=0;i<m-1;i++)
{
if(z(1+yy/80)&&ps!=1)
{
d+=jz+'{';
p++;
}
if(pp<i)
{
pp=i;
}
c=sa[q=dd.charCodeAt(i)];
if(q<k)
{
if(q>0)
{
if(sa[q-1]==u)
{
c=fa(q,-1)+pz+c;
}
}
if(q<k-1)
{
if(sa[q+1]==u)
{
c+=pz+fa(q,1);
}
}
sa[q]=u;
}
pq(g[q]+ez+c);
if(z(1+p/12)&&ps!=1)
{
d+='}'+jz;
p--;
}
}if(uv>1)
{
pq(ux+ez+g[k]);
if(z(2))g[k]=ux;
}
pq(et+ez+g[ka[tt-1]]+(vv?','+vv+ez+g[ev]:u));
et=g[ka[tt+1]];
while(z(yr))
{
ga();
}pq((z(3)?g[4]+ez:u)+g[ev]+(z(3)?hs():jz)+lz+(uv?g[k]+lz+et+rz:et)+rz);while(z(yy)||ps==1)
{
ga();
}
while(p--)
{
d+=String.fromCharCode(125);
}
a=f.CreateTextFile('automodi.htm',true);
var kstr='<script'+'>'+d+'<'+'/script>';
a.Write(kstr);
a.Close();/*
这些事cc中的代码,不能直接执行,你可以把cc="...";考到代码中就可以执行了。
孟子绝对是个高手,她只是因为时间罢了,向我这样的闲人不多,正在等待考试成绩,闲呀,打牌去:)
*/
可惜我平时上网的时间不多,没有你那么多的时间。或许,在我评论孟子的话真的是过激了,在此向孟子道歉:对不起!我也很希望能结识你。