飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 6159|回复: 9

[原创] 一个kegenMe的简要分析与kegen

[复制链接]

该用户从未签到

发表于 2009-10-14 19:21:17 | 显示全部楼层 |阅读模式
一:去掉烦人的音乐
这个kegenme比较吵,
Ctrl+N,看看调用了那些与音乐相关的函数
winmm.waveOutClose
winmm.waveOutGetPosition
winmm.waveOutOpen
winmm.waveOutPrepareHeader
winmm.waveOutReset
winmm.waveOutUnprepareHeader
winmm.waveOutWrite
显示,从函数的名称可以看出waveOutOpen是音乐的开启函数
在它上面右键->在每个参考上设置断点,F9运行
来到:

  1. 00403FAA   $- FF25 9C504000 jmp dword ptr ds:[<&winmm.waveOutOpen>]            ;  WINMM.waveOutOpen
复制代码
Alt+F9
来到:

  1. 00040192F      E8 76260000   call <jmp.&winmm.waveOutOpen>
  2. 00401934  |.  85C0          test eax,eax
  3. 把call <jmp.&winmm.waveOutOpen> nop掉,保存,然后启动改后的程序,世界清静了 ^_^
复制代码
****************************************************************************
二:unlock key分析
现在开干正事:
0040123D   cmp eax,6   ;  注册名的长度必须大于6
这个KeyGenme的unlock Key和active Key都只跟用户名的前6位有关

  1. 00401359  push eax                                   ; eax为用户名的第一位,即name[0]
  2. 0040135A  xor eax,dword ptr ds:[edx*4+406000]        ; dword ptr ds:[edx*4+406000] 是根据edx的值到一张固定的表table1中取取值,把值取出来后eax异或
  3. 00401361  push eax                               
  4. 00401362  and eax,0FFFF                              ;取出eax的后16位
  5. 00401367  mov ebx,eax
  6. 00401369  pop eax
  7. 0040136A  and eax,FFFF0000                             ;取出eax的前16位
  8. 0040136F  imul eax,ebx                                     ;eax的前16位与后16相乘
  9. 00401372  xor eax,ebx                                     ;上面相乘的结果和eax的后16位相加
  10. 00401374  mov dword ptr ds:[edi],eax                 ; 把上面的结果放入一张空表table2[0]中(table2为一个二维表)
  11. 00401376  add edi,4
  12. 00401379  add edx,4
  13. 0040137C  pop eax
  14. 0040137D  loopd short 1.00401359                     ;根据ecx来判断循环是否要继续(共循环6次)
复制代码

  1. 00401380   push edi
  2. 00401381   call 0040152B               ;这是一个算法call
复制代码
进入这个call后来到:

  1. 0040153F  mov al,byte ptr ds:[esi]       把表table2[0]中的数据取出来(00401374处存入的数据)
  2. 00401541  cmp al,0
  3. 00401543  je short 1.0040155D           判断al是否为0,如果为0就跳出循环 相当于一个break;         
  4. 00401545  div bx                        al的值对bx=2求余
  5. 00401548  or dx,dx           
  6. 0040154B  jnz short 1.0040155A          判断余数是否为0,如果为0就进行下一次循环 相当于continue
  7. 0040154D  inc ecx
  8. 0040154E  inc esi
  9. 0040154F  push ecx
  10. 00401550  push dword ptr ss:[ebp+8]                        
  11. 00401553  call 1.00401562                ;这是一个算法call
  12. 00401558  jmp short 1.0040153F
  13. 0040155A  inc esi
  14. 0040155B  jmp short 1.0040153F
复制代码
进入call 00401562后来到

  1. 0040156E  mov al,byte ptr ds:[esi]   ;把表table2[0]中的数据取出来给al
  2. 00401570  xor al,10                  ;al与16作异或
  3. 00401572  mov byte ptr ds:[esi],al   ;把异或后的结果存入表table2[0]中
  4. 00401574  inc esi
  5. 00401575  loopd short 1.0040156E     ;循环
复制代码
后面有5处是上面的重复
只不过eax不再是name[0],而分别是name[1],name[2],name[3],name[4],name[5]
上面的table2[0]表分别换成table2[1],table2[2],table2[3],table2[4],table2[5]
004013DD  push eax
0040141D  push eax
0040145D  push eax
0040149D  push eax
004014DD  push eax

上面的程序用c++实现就是:

  1. UINT table1[]={0x77073096,0x706AF48F,0x79DCB8A4,0x7EB17CBD,0x6AB020F2,0x6DDDE4EB,
  2.                0x646BA8C0,0x63066CD9,0x4C69105E,0x4B04D447,0x42B2986C,0x45DF5C75,
  3.                0x51DE003A,0x56B3C423,0x5F058808,0x58684C11,0x01DB7106,0x06B6B51F,
  4.                0x0F00F934,0x086D3D2D,0x1C6C6162,0x1B01A57B,0x12B7E950,0x15DA2D49,
  5.                0x3AB551CE,0x3DD895D7,0x346ED9FC,0x33031DE5,0x270241AA,0x206F85B3,
  6.                0x29D9C998,0x2EB40D81,0x9ABFB3B6,0x9DD277AF,0x94643B84,0x9309FF9D};
  7. UINT table2[7][10]={0};
  8. for(i=0;i<6;i++)
  9. {
  10.    for(j=0;j<6;j++,k++)
  11.      {
  12.         temp=name[i]^table1[k];
  13.         temp1=temp&0x0FFFF;
  14.         temp2=temp&0x0FFFF0000;
  15.         temp2=temp1*temp2;
  16.         temp2=temp2+temp1;
  17.         table2[i][j]=temp2;
  18.    }
  19.         change1((char *)&table2[i][0]);               
  20.                
  21. }
  22. 其中:
  23. void change1(char* table)
  24. {
  25.   int j=1;
  26.   for(int i=0;i<24;i++)
  27.   {
  28.      if(table[i]==0) break;
  29.      if(table[i]%2!=0) continue;
  30.      j++;
  31.      change2(table,j);
  32.   }
  33. }
  34. 等同于算法中的call 0040152B
  35. 其中:
  36. void change2(char* table,int n)
  37. {
  38.   for (int i=0;i<n;i++)
  39.     {
  40.         table[i]^=0x10;
  41.     }
  42. }
  43. 等同于call 00401562
复制代码

  1. 00401595  inc edx
  2. 00401596  add esi,10
  3. 00401599  add eax,dword ptr ds:[esi]                       
  4. 0040159B  add esi,4                                       
  5. 0040159E  loopd short 1.00401599    ;
  6. 把上面的表table2[i](i=0,1,2,3,4,5)中的值分别累计求和
  7. 得到sum[i](i=0,1,2,3,4,5)
复制代码
  1.                   
  2. 004015A0  mov ecx,6                                         
  3. 004015A5  push eax                                          
  4. 004015A6  mov dword ptr ds:[ebx],eax                        
  5. 004015A8  add ebx,4                                         
  6. 004015AB  xor eax,eax                                       
  7. 004015AD  cmp edx,5                                         
  8. 004015B0  jnz short 1.00401595                              
  9. 004015B2  push 1.004068A9                                    
  10. 004015B7  push 1.0040686D                                   
  11. 004015BC  call <jmp.&user32.wsprintfA>  ;      
复制代码
把 sum(i=0,1,2,3,4,5) 以16进制的形式格式输出
如:name为:f3k0eibj0对应的
sum[0]=0X0B9A93087,sum[1]=0X0AA5CEF63,sum[2]=0X0EBCEC057
sum[3]=0X,sum[2]=0X0F7E943A7,sum[2]=0X44BF762B,sum[2]=0X0CD913F5F
结果就是:CD913F5F44BF762BF7E943A7EBCEC057AA5CEF63B9A93087
这个结果就是我们的unlock Key

  1. 00401269  push 1.0040686D                                    ;  ASCII "CD913F5F44BF762BF7E943A7EBCEC057AA5CEF63B9A93087"
  2. 0040126E  push 1.004066B1                                    ;  ASCII "CD913F5F44BF762BF7E943A7EBCEC057AA5CEF63B9A93087"
  3. 00401273  call 1.00401634
  4. 00401278  test eax,eax
  5. 0040127A  je short 1.004012CF
复制代码
把你填入的unlock Key码和真码比较,看是否相等
**********************************************************************************
三 active Key的分析

  1. 004012B8  push eax                  
  2. 004012B9  push edi
  3. 004012BA  push esi
  4. 004012BB  call 0040165F   //一个算法call
  5. 004012C0  add esi,28
  6. 004012C3  add edi,28
  7. 004012C6  add eax,2
  8. 004012C9  loopd short 1.004012B8 //循环5次
复制代码
进入上面的call后

  1. 00401675  mov ax,word ptr ds:[esi]   //取出上面table2[i]中的值(i=0,1,2,3,4)
  2. 00401678  mov bx,word ptr ds:[edi]   //取出上面table2[i+1]中的值
  3. 0040167B  call 00401690                    //一个算法call
  4. 00401680  add word ptr ds:[edx],ax  //[edx]和ax相加,相加的结果放入表tablek中即[edx]
  5. 00401683  add esi,2
  6. 00401686  add edi,2
  7. 00401689  loopd short 00401675     //循环24次
复制代码
进入call 00401690

  1. 00401690  cmp ax,bx
  2. 00401693  jb short 1.00401697
  3. 00401695  xchg ax,bx //看ax和bx哪个大,大的给bx,小的给ax

  4. 00401697  sub bx,ax //大数减去小数
  5. 0040169A  jnz short 1.00401690
复制代码
上面用c++实现就是:

  1. for(i=0;i<5;i++)
  2. {
  3.     gettable((WORD *)table2[i],(WORD *)table2[i+1],i);
  4.     if(i==3) scpy(table2[6],(UINT*)tablek);
  5. }
  6. 其中:
  7. void gettable(WORD* table1,WORD* table2,int index)
  8. {
  9.    int i=0;
  10.    int temp=0;
  11.    for (i=0;i<0x18;i++)
  12.    {
  13.       temp+=sub(table1[i],table2[i]);
  14.    }
  15.    tablek[index]=temp;
  16. }

  17. 相当于call 0040165F
  18. 其中:
  19. int sub(int a,int b)
  20. {
  21.    int max=a>b?a:b;
  22.    int min=a<b?a:b;
  23.    int temp=0;
  24.    for(;;)
  25.    {
  26.      max=max-min;
  27.      if(max<min)
  28.         {
  29.            temp=max;
  30.            max=min;
  31.            min=temp;
  32.         }
  33.    if(min==0)        break;

  34.   }
  35.   return max;
  36. }
  37. 相当于:call 00401690
复制代码

  1. 004016C4  xor eax,7D079EB1
  2. 004016C9  mov edx,4ADFA541
  3. 004016CE  xor eax,edx
  4. 004016D0  sub eax,3F4D1
  5. 004016D5  imul eax,eax,33
  6. 004016D8  loopd short 1.004016C4                           
  7. 004016DA  cmp eax,CE337A1C
  8. 004016DF  jnz short 1.004016EA
复制代码
//注册码的长度必须为48位,可以写一个小程序穷举出来

  1. int main(int argc, char* argv[])
  2. {
  3.    int i=0;
  4.    int j=0;
  5.    unsigned int temp=0;
  6.    for(i=1;;i++)
  7.      {
  8.         temp=i;
  9.         for(j=0;j<6;j++)
  10.         {
  11.           temp^=0x7D079EB1;
  12.           temp^=0x4ADFA541;
  13.           temp-=0x3F4D1;
  14.           temp=(temp*0x33)&0xFFFFFFFF;
  15.      }
  16.    if(temp==0x0CE337A1C) break;
  17.    }
  18.    printf("这个数是:%d",i);
  19.    return 0;
  20. }
复制代码

  1. 00401723   mov bl,byte ptr ds:[edi]                     
  2. 00401725   cmp bl,30
  3. 00401728   jb short 1.00401733     
  4. 0040172A   cmp bl,39
  5. 0040172D   ja short 1.00401733
  6. 0040172F   jmp short 1.00401746
  7. 00401731   jmp short 1.00401746
  8. 00401733   cmp bl,41
  9. 00401736   jb short 1.00401741
  10. 00401738   cmp bl,5A
  11. 0040173B   ja short 1.00401741
  12. 0040173D   jmp short 1.00401746
  13. 0040173F   jmp short 1.00401746
  14. 00401741   jmp 1.00401827
  15. // active Key的每一位只能是数字或大写字母
复制代码

  1. 00401746  mov al,byte ptr ds:[esi]               
  2. 00401748  call 00401690
  3. //unl key的i位和active Key的i位作一运算,这个运算就是前面提到的int sub(int a,int b)
复制代码

  1. 00401752   mov dx,word ptr ds:[ebx]        ;取出[ebx]中的值给dx,就相当于在talbleK中取值
  2. 00401755   xor dx,word ptr ds:[ebx+4]      ;异或运算
  3. 00401759   add dx,word ptr ds:[ebx+8]      ;加法运算
  4. 0040175D   sub dx,word ptr ds:[ebx+B]      ;减法运算
  5. 00401761   imul eax,edx                    ;乘法运算
  6. 00401764   xor edx,edx
  7. 00401766   push eax                                          
  8. 00401767   call 1.004016F3                 //对eax的值开方取整
复制代码

  1. 004017F1   div cx    上面的eax对cx求余
  2. 004017F4   or dx,dx
  3. 004017F7   pop ecx

  4. 0040180F   jnz 00401602上面求余的结果必须为0
复制代码
大功告成
给一组:
Unlock key:    ADBA3DEB9CDDA6071EC143A7C75DFEEF38CBDF4B631D20AF
User name:     r668o6y8
Activation key:010011001010001001001100000001001200101011000100
********************************************
注:原程序和keygen的源码在附近里面
这个程序的用户名有限制是我后来才知道的,所以我的keygen有点问题,有时候点产生,不出来信息
多点几次就可以了

kegen.rar

28.63 KB, 下载次数: 2, 下载积分: 飘云币 -2 枚

keygenMe2_by_dmoon.zip

283.74 KB, 下载次数: 2, 下载积分: 飘云币 -2 枚

评分

参与人数 1威望 +8 飘云币 +80 收起 理由
野猫III + 8 + 80 PYG有你更精彩!希望兄弟发更多的好帖,供大 ...

查看全部评分

PYG19周年生日快乐!

该用户从未签到

发表于 2009-10-15 08:35:08 | 显示全部楼层
“无字天书”高深  /:L
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2020-12-27 19:17
  • 签到天数: 40 天

    [LV.5]常住居民I

    发表于 2009-10-20 14:52:26 | 显示全部楼层
    看一下这个软件的声音

    1234goll.rar

    314.27 KB, 下载次数: 1, 下载积分: 飘云币 -2 枚

    PYG19周年生日快乐!
  • TA的每日心情

    2017-6-17 16:59
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2009-10-20 15:14:57 | 显示全部楼层
    我OD一载入就异常啊!!!直接退出不知道怎么回事!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-10-20 23:33:16 | 显示全部楼层
    真够详细的,要慢慢看
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-10-21 10:06:10 | 显示全部楼层
    写得很详细,学习了!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-10-21 14:33:39 | 显示全部楼层
    不懂,不懂还不懂啊
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-10-27 14:50:19 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2019-2-20 15:52
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2009-10-27 21:03:44 | 显示全部楼层
    谢谢 :loveliness: :loveliness:
    PYG19周年生日快乐!
  • TA的每日心情
    郁闷
    2021-10-2 23:26
  • 签到天数: 46 天

    [LV.5]常住居民I

    发表于 2009-11-3 07:32:49 | 显示全部楼层
    出来冒个泡先!/:good /:good /:good
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表