破解的一个crackme,附注册机

CrackMe的原文:
http://bbs.fishc.com/thread-31185-1-1.html

文中说很简单,但是偶却费了大工夫,到底还很菜啊
用字符串搜索 Try again 很容易找到了验证的地方
或者可以下断 GetWindowTextA 函数

  1. 0040114D   .  83F8 00             cmp     eax, 0                           ;  测试GetDlgItemTextA是否正常返回,不正常就跳走
  2. 00401150   .  0F84 99000000       je      004011EF
  3. 00401156   .  83F8 04             cmp     eax, 4                           ;  测试取到的字符是不是4个
  4. 00401159   .  0F82 90000000       jb      004011EF                         ;  小于4个就跳
  5. 0040115F   .  33C9                xor     ecx, ecx
  6. 00401161   .  33DB                xor     ebx, ebx
  7. 00401163   .  33F6                xor     esi, esi
  8. 00401165   .  8945 FC             mov     dword ptr [ebp-4], eax           ;  把字符个数存起来 0012FAA0
  9. 00401168   >  0FBE81 F3204000     movsx   eax, byte ptr [ecx+4020F3]
  10. 0040116F   .  83F8 20             cmp     eax, 20
  11. 00401172   .  74 07               je      short 0040117B                   ;  空格不计算
  12. 00401174   .  6BC0 04             imul    eax, eax, 4                      ;  乘4
  13. 00401177   .  03D8                add     ebx, eax                         ;  累计相加
  14. 00401179   .  8BF3                mov     esi, ebx
  15. 0040117B   >  41                  inc     ecx
  16. 0040117C   .  3B4D FC             cmp     ecx, dword ptr [ebp-4]
  17. 0040117F   .^ 75 E7               jnz     short 00401168                   ;  这一段就是取出字符相加然后乘4
  18. 00401181   .  83FE 00             cmp     esi, 0                           ;  测试结果是否为0
  19. 00401184   .  74 69               je      short 004011EF
  20. 00401186   .  BB 89476500         mov     ebx, 654789
  21. 0040118B   >  0FBE81 F2204000     movsx   eax, byte ptr [ecx+4020F2]
  22. 00401192   .  4B                  dec     ebx
  23. 00401193   .  6BC3 02             imul    eax, ebx, 2
  24. 00401196   .  03D8                add     ebx, eax
  25. 00401198   .  4B                  dec     ebx
  26. 00401199   .  49                  dec     ecx
  27. 0040119A   .^ 75 EF               jnz     short 0040118B
  28. 0040119C   .  56                  push    esi                              ; /<%lu>
  29. 0040119D   .  53                  push    ebx                              ; |<%lX>
  30. 0040119E   .  68 C7204000         push    004020C7                         ; |BS-%lX-%lu
  31. 004011A3   .  68 BB214000         push    004021BB                         ; |s = Crackme1.004021BB
  32. 004011A8   .  E8 6C000000         call              ; \wsprintfA
  33. 004011AD   .  58                  pop     eax
  34. 004011AE   .  58                  pop     eax
  35. 004011AF   .  58                  pop     eax
  36. 004011B0   .  58                  pop     eax
  37. 004011B1   .  E8 01000000         call    004011B7                         ;  取密码call
复制代码
004011B7
  1. 004011D4   > /0FBE81 57214000     movsx   eax, byte ptr [ecx+402157]       ;  取密码框里面的每个字符
  2. 004011DB   . |0FBE99 BB214000     movsx   ebx, byte ptr [ecx+4021BB]       ;  之前生成的字符串
  3. 004011E2   . |3BC3                cmp     eax, ebx                         ;  要一样哦
  4. 004011E4   . |75 09               jnz     short 004011EF
  5. 004011E6   . |83F8 00             cmp     eax, 0
  6. 004011E9   . |74 19               je      short 00401204
  7. 004011EB   . |41                  inc     ecx
  8. 004011EC   .^\EB E6               jmp     short 004011D4
复制代码
大致是用户名的每个字符相加,然后字符串的长度作为循环次数,循环里面计算
一个常数 0x654789 ,每次减一,乘3,再减一。
最后生成一个字符串,类似 BS-%lX-%lu ,第一处填由常数计算出来的结果,第二处为用户名计算出来的结果

一个可用的注册码:
用户名 :12345
密   码  :BS-6022E527-1020

哦,对了,用户名长度要大于等于4的。

注册机代码(vc2010写的):
  1. CString strName,strSerial;
  2.         char c;
  3.         int nName=0;
  4.         GetDlgItem(IDC_EDIT1)->GetWindowText(strName);
  5.         if (strName.GetLength()<4)
  6.         {
  7.                 AfxMessageBox("长度大于等于4");
  8.                 return;
  9.         }
  10.         strName.Remove(' ');
  11.         for (int i=0;i
  12.         {
  13.                 c = strName.GetAt(i);
  14.                 nName += c * 4;
  15.         }
  16.         
  17.         int nLoop = strName.GetLength();
  18.         int nNumber = 0x654789;
  19.         for (int i=0;i
  20.         {
  21.                 nNumber--;
  22.                 nNumber *= 3;
  23.                 nNumber--;
  24.         }
  25.         CString strTarget;
  26.         strTarget.Format("BS-%lX-%lu",nNumber,nName);
  27.         GetDlgItem(IDC_EDIT2)->SetWindowText(strTarget);
复制代码
  破解的一个crackme,附注册机_第1张图片 破解的一个crackme,附注册机_第2张图片 破解的一个crackme,附注册机_第3张图片 

你可能感兴趣的:(vs2010,Windows)