• 标 题:PC 安全虎[Beta 1]算法分析 (6千字)
  • 作 者:PaulYoung[CCG]
  • 时 间:2001-12-5 20:35:53
  • 链 接:http://bbs.pediy.com

PC 安全虎[Beta 1]算法分析

作者:PaulYoung ( 属于 China Cracking Group )
简介:不要再为朋友用自己电脑玩游戏、看影碟、乱装东西而烦恼不要再为孩子上有不健康内容的网站而担心,不要再怕老弟偷用电话上网,PC安全虎全都轻松搞定!!
下载:http://shareware.onlinedown.net/download.asp?id={B2594856-886B-4224-A457-53C0976CB2B6}
工具:SoftICE v4.05
日期:2001-12-05

*************************************************************************************************

  输入用户名、假注册码,用 SoftICE V4.05 设断 bpx hmemcpy ,中断后按8下F12,F10单步跟踪,直到……

:00408AD6 E825D50000              call 00416000    //验证注册码,F8跟入
:00408ADB 83C408                  add esp, 00000008
:00408ADE 8945C8                  mov dword ptr [ebp-38], eax
:00408AE1 837DC800                cmp dword ptr [ebp-38], 00000000
:00408AE5 0F84AF000000            je 00408B9A

  继续按F10,直到……

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004161B6(U)
|
:0041615E 8B8574FFFFFF            mov eax, dword ptr [ebp+FFFFFF74]
:00416164 83C001                  add eax, 00000001
:00416167 898574FFFFFF            mov dword ptr [ebp+FFFFFF74], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041615C(U)
|
:0041616D 8B4DF0                  mov ecx, dword ptr [ebp-10]
:00416170 038D74FFFFFF            add ecx, dword ptr [ebp+FFFFFF74]
:00416176 0FBE11                  movsx edx, byte ptr [ecx]  //依次取用户名字符的 ASCII 值,保存到 edx
:00416179 85D2                    test edx, edx         //比较 edx 是否为0,即比较是否取完用户名
:0041617B 743B                    je 004161B8         //取完即跳
:0041617D 83BD74FFFFFF1E          cmp dword ptr [ebp+FFFFFF74], 0000001E //取了多少个字符?
:00416184 7D32                    jge 004161B8                       //取够30个则跳
:00416186 8B45F0                  mov eax, dword ptr [ebp-10]
:00416189 038574FFFFFF            add eax, dword ptr [ebp+FFFFFF74]
:0041618F 0FBE00                  movsx eax, byte ptr [eax]       //依次取字符的 ASCII 送 eax
:00416192 8B8D74FFFFFF            mov ecx, dword ptr [ebp+FFFFFF74]
:00416198 03848D78FFFFFF          add eax, dword ptr [ebp+4*ecx-00000088] //eax=eax+[ebp+4*ecx-00000088]这个变量
:0041619F 99                      cdq              //edx 清零
:004161A0 B917000000              mov ecx, 00000017 //把 ecx 置值为0x17
:004161A5 F7F9                    idiv ecx      //eax/ecx ,商放在 eax ,余数放在 edx
:004161A7 83C242                  add edx, 00000042  //edx=余数+0x42
:004161AA 8B8574FFFFFF            mov eax, dword ptr [ebp+FFFFFF74]
:004161B0 8890E07A4800            mov byte ptr [eax+00487AE0], dl  //把每次计算结果的ASCII值保存
:004161B6 EBA6                    jmp 0041615E    //继续取下一个字符

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0041617B(C), :00416184(C)
|
:004161B8 8B8D74FFFFFF            mov ecx, dword ptr [ebp+FFFFFF74]
:004161BE C681E07A480000          mov byte ptr [ecx+00487AE0], 00

* Possible Reference to Dialog: 
                                  |
:004161C5 68E07A4800              push 00487AE0      //计算结果入栈
:004161CA E8E1DB0000              call 00423DB0
:004161CF 83C404                  add esp, 00000004
:004161D2 83F805                  cmp eax, 00000005    //用户名长度大于5吗
:004161D5 7712                    ja 004161E9     //大于则跳

* Possible Reference to Dialog: 
                                  |
:004161D7 6828254800              push 00482528        //不跳则 CNIAWFKU 入栈
:004161DC 68E07A4800              push 00487AE0     //0<用户名≤5时的计算结果入栈
:004161E1 E80AE10000              call 004242F0        //组成一个字符串
:004161E6 83C408                  add esp, 00000008

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004161D5(C)
|

* Possible Reference to Dialog: 
                                  |
:004161E9 68E07A4800              push 00487AE0              //正确注册码入栈
:004161EE 8D4D0C                  lea ecx, dword ptr [ebp+0C] //输入的假注册码放到[ebp+0C]
:004161F1 E8BAB1FEFF              call 004013B0              //真假注册码比较
:004161F6 85C0                    test eax, eax
:004161F8 752D                    jne 00416227                //不等则跳,跳则死
:004161FA C7856CFFFFFF01000000    mov dword ptr [ebp+FFFFFF6C], 00000001
:00416204 C645FC00                mov [ebp-04], 00
:00416208 8D4D08                  lea ecx, dword ptr [ebp+08]
:0041620B E8F2C50200              call 00442802
:00416210 C745FCFFFFFFFF          mov [ebp-04], FFFFFFFF
:00416217 8D4D0C                  lea ecx, dword ptr [ebp+0C]
:0041621A E8E3C50200              call 00442802
:0041621F 8B856CFFFFFF            mov eax, dword ptr [ebp+FFFFFF6C]
:00416225 EB2B                    jmp 00416252

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004161F8(C)
|
:00416227 C78568FFFFFF00000000    mov dword ptr [ebp+FFFFFF68], 00000000
:00416231 C645FC00                mov [ebp-04], 00
:00416235 8D4D08                  lea ecx, dword ptr [ebp+08]
:00416238 E8C5C50200              call 00442802
:0041623D C745FCFFFFFFFF          mov [ebp-04], FFFFFFFF
:00416244 8D4D0C                  lea ecx, dword ptr [ebp+0C]
:00416247 E8B6C50200              call 00442802
:0041624C 8B8568FFFFFF            mov eax, dword ptr [ebp+FFFFFF68]

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00416068(U), :00416225(U)
|
:00416252 8B4DF4                  mov ecx, dword ptr [ebp-0C]
:00416255 64890D00000000          mov dword ptr fs:[00000000], ecx
:0041625C 8BE5                    mov esp, ebp
:0041625E 5D                      pop ebp
:0041625F C3                      ret


算法总结:
  1、先将用户名每个字符的 ASCII 值加上一个数,这个数按其所在位数不同而不同。从第1位开始,1~30位所加的数依次为(十进制):23、15、18、17、4、21、24、2、19、7、22、10、11、13、5、72、238、118、29、103、105、161、27、122、140、71、248、84、149、151。
  2、每位字符与上述对应的数相加后所得的和,除以 0x17 ,求得一个余数。余数再与 0x42 相加和的 ASCII 的值,作为对应用户名位数的注册码,把用户名各个字符计算出的结果依次排列成串。
  3、当0<用户名≤5时,在计算结果后加上" CNIAWFKU ",作为正确的注册码。
  4、当5<用户名≤30时,根据用户名各位字符的ASCII值计算出结果(ASCII),排列成串直接作为正确的注册码。
  5、31位(包括31位)以后的字符,不列入计算范围,即注册码最长为30位。
  6、中文算2个字符。

  呵……算法其实非常的简单,只是有点罗嗦。不过,如果这样这样设断点的话,就不烦了, bpx 4161E9 do "d 487AE0" ,直接可见到正确注册码。呵……*^_^*

  • 标 题:PC 安全虎[Beta 1] TC 2.0 注册机源码(好友Ann★Tonny根据本人算法编写,非常感谢!) (833字)
  • 作 者:PaulYoung[CCG]
  • 时 间:2001-12-7 23:43:45

# include <stdio.h>
static int key[80]={23,15,18,17,4,21,24,2,19,7,22,10,11,13,5,72,238,118,29,103,105,161,27,122,140,71,248,84,149,151};
void main()

    char name[80],password[80],*p=name;
    int i=0,j=0,*p1=key;
    printf("!!!!For PC_tiger[Bata 1]!!!!\n");
    printf("Input your name:");
    gets(name);

    while((*p)!='\0')
    {    password[i]=(char)((((int)*p)+*p1)%0x17+0x42);       
        p++;p1++;i++;
    };
    printf("Your Password is:");
    if(i<=5)
    {  for (j=0;j<=i-1;j++)printf("%c",password[j]);
        printf("CNIAWFKU\n");
    };
      if(i<=30&&i>5)  {for (j=0;j<=i-1;j++) printf("%c",password[j]);
    printf("\n");
    };
      if(i>30) {for (j=0;j<=29;j++) printf("%c",password[j]);printf("\n");
    };

      printf(" ***CODE BY Ann★Tonny*** \n");


    }