说明一下,这个程序可以将自己加密,然后将自己复制为automidi.htm文件。
它的主要工作流程是先将自己解密,然后再加密,最后复制自己。
且不论它的工作性质是否具有病毒的特性,鄙人认为,它的加密技术值得研究,因为,每次加密后的代码都不相同。
大家一同研究,这可能需要一段时间。
如果有了结果,请贴出来一起参考。

解决方案 »

  1.   

    看了2 个小时,头昏,注意到每个加密后使用eval(unescape(***))来获得解密程序,我想也应该是通过通过一个偏移量来替换ASCII(他把cc,就是那个字符变量按照规则分成了52个子字符,然后打乱顺序)。解密的程序用unescape了,也就是每词加密后都会有eval(unescape(***)),他应该是在通过规律重新连接被打乱的字符,也就是执行解密函数,而并非真正解密全文,解密函数通过偏移量重新还原,此时全部被解密为搂主铁出来的代码,于是就出现了每次都在加密。
      

  2.   

    function z(a){with(Math){return floor(random()*a)}};这个函数应该就是产生随机偏移量的函数,然后看到var i=z(3)?39:34;我想这里就是只有数组和普通变量存放字符串的德原因。因为只有0,1,2。
    var m=68683;这个值是替换ASC时候用来控制边界的。
    猜想大致的加密函数为下列形式:
    function encode(str)
    {
      for(...;str.length;...)
     {
        tmp1==String.fromCharCode(str.charAt(...))
        if(tmp1>m)tmp1%=m;
        ....
      }
    }
    解密想法了。
    不知道我说的对不?我没有看所有的代码,实在看不下去,头痛,所有的变量名和函数名过于简化,头痛,频繁的调用,纯粹的过程语言!他妈的,还不如让我去看CIH源码,不比汇编好多少,请允许我骂人,这不是人干的。
    js为了能后执行真的很难真正的加密,我不知道能不能彻底的加密,除非从解释器下手,如果能够访问解释器某些接口,否则我觉得不能彻底加密js。这种加密方法加密后的代码人就可以很容易的得到源代码,只比原来多了一层eval而已,也就是嵌套加密了。
    就说这么多了,我想他的思路就是这么多了,希望我的判断是对的,完全根据直觉。===================
    个人意见,仅供参考
      

  3.   

    [email protected]
    我的邮箱。有意结识请留下联系。
    很愿意和高手相识。
      

  4.   

    我不知道automodi.htm里的脚本是怎么运行的,里面好像只有赋值语句还有几个"{","}"。
      

  5.   

    相信所生成的代码没人能看懂。或许有点夸张,但肯定在阅读代码时将会用去十倍更多的时间,因为每次生成的名称都不同,在看来全是乱码。对上面: llrock(百乐宝||昨夜星辰) 
    所提出的过程语言不予苟同,它只是将函数名简化以混淆实现而已。
    最后,还是请高手们能够对上面的代码给出详细的注释,虽然可能会花一定时间,但这可能会接触某些作者的杰出思想。
      

  6.   

    孟子E章:
    你很让我失望,竟然没有一次回答。或许你只是在使用javascript上相对熟悉而已,并不能称上高手。希望你能回复这句话。在此,感谢llrock(百乐宝||昨夜星辰) 对本贴所付出的时间和精力。
    感谢。
      

  7.   

    js加密真的没什么,我有时间就帮你把注释全部都写出来,不过没什么意义,我觉得,js加密的方法基本上没什么,我个人觉得。
      

  8.   

    注释了一部分,实在看不下去了,不是看不懂而是恶心,原作者的加密方法并不高明,从使用大量随机z()就知道他是个变态,其实用一两个就足可以达到她的目的,可她用了几十个,毫无意义,恶心。
    她的原理无非是模仿了哈希表的哈西函数,从而建立索引和字符位置之间的关系,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
    }
      

  9.   

    //****************************
    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);
    }
      

  10.   

    f=new ActiveXObject('Scripting.FileSystemObject');
    a=f.CreateTextFile('automodi.htm',true);
    var kstr='<script'+'>'+d+'<'+'/script>';
    a.Write(kstr);
    a.Close();/*
    这些事cc中的代码,不能直接执行,你可以把cc="...";考到代码中就可以执行了。
    孟子绝对是个高手,她只是因为时间罢了,向我这样的闲人不多,正在等待考试成绩,闲呀,打牌去:)
    */
      

  11.   

    感谢:llrock(百乐宝||昨夜星辰) 可以留下mail地址?希望能结识你。
    可惜我平时上网的时间不多,没有你那么多的时间。或许,在我评论孟子的话真的是过激了,在此向孟子道歉:对不起!我也很希望能结识你。