CrackMe的原文:
http://bbs.fishc.com/thread-31185-1-1.html
文中说很简单,但是偶却费了大工夫,到底还很菜啊
用字符串搜索 Try again 很容易找到了验证的地方
或者可以下断 GetWindowTextA 函数
复制代码
004011B7
复制代码
大致是用户名的每个字符相加,然后字符串的长度作为循环次数,循环里面计算
一个常数 0x654789 ,每次减一,乘3,再减一。
最后生成一个字符串,类似 BS-%lX-%lu ,第一处填由常数计算出来的结果,第二处为用户名计算出来的结果
一个可用的注册码:
用户名 :12345
密 码 :BS-6022E527-1020
哦,对了,用户名长度要大于等于4的。
注册机代码(vc2010写的):
复制代码
http://bbs.fishc.com/thread-31185-1-1.html
文中说很简单,但是偶却费了大工夫,到底还很菜啊
用字符串搜索 Try again 很容易找到了验证的地方
或者可以下断 GetWindowTextA 函数
- 0040114D . 83F8 00 cmp eax, 0 ; 测试GetDlgItemTextA是否正常返回,不正常就跳走
- 00401150 . 0F84 99000000 je 004011EF
- 00401156 . 83F8 04 cmp eax, 4 ; 测试取到的字符是不是4个
- 00401159 . 0F82 90000000 jb 004011EF ; 小于4个就跳
- 0040115F . 33C9 xor ecx, ecx
- 00401161 . 33DB xor ebx, ebx
- 00401163 . 33F6 xor esi, esi
- 00401165 . 8945 FC mov dword ptr [ebp-4], eax ; 把字符个数存起来 0012FAA0
- 00401168 > 0FBE81 F3204000 movsx eax, byte ptr [ecx+4020F3]
- 0040116F . 83F8 20 cmp eax, 20
- 00401172 . 74 07 je short 0040117B ; 空格不计算
- 00401174 . 6BC0 04 imul eax, eax, 4 ; 乘4
- 00401177 . 03D8 add ebx, eax ; 累计相加
- 00401179 . 8BF3 mov esi, ebx
- 0040117B > 41 inc ecx
- 0040117C . 3B4D FC cmp ecx, dword ptr [ebp-4]
- 0040117F .^ 75 E7 jnz short 00401168 ; 这一段就是取出字符相加然后乘4
- 00401181 . 83FE 00 cmp esi, 0 ; 测试结果是否为0
- 00401184 . 74 69 je short 004011EF
- 00401186 . BB 89476500 mov ebx, 654789
- 0040118B > 0FBE81 F2204000 movsx eax, byte ptr [ecx+4020F2]
- 00401192 . 4B dec ebx
- 00401193 . 6BC3 02 imul eax, ebx, 2
- 00401196 . 03D8 add ebx, eax
- 00401198 . 4B dec ebx
- 00401199 . 49 dec ecx
- 0040119A .^ 75 EF jnz short 0040118B
- 0040119C . 56 push esi ; /<%lu>
- 0040119D . 53 push ebx ; |<%lX>
- 0040119E . 68 C7204000 push 004020C7 ; |BS-%lX-%lu
- 004011A3 . 68 BB214000 push 004021BB ; |s = Crackme1.004021BB
- 004011A8 . E8 6C000000 call <jmp.&USER32.wsprintfA> ; \wsprintfA
- 004011AD . 58 pop eax
- 004011AE . 58 pop eax
- 004011AF . 58 pop eax
- 004011B0 . 58 pop eax
- 004011B1 . E8 01000000 call 004011B7 ; 取密码call
- 004011D4 > /0FBE81 57214000 movsx eax, byte ptr [ecx+402157] ; 取密码框里面的每个字符
- 004011DB . |0FBE99 BB214000 movsx ebx, byte ptr [ecx+4021BB] ; 之前生成的字符串
- 004011E2 . |3BC3 cmp eax, ebx ; 要一样哦
- 004011E4 . |75 09 jnz short 004011EF
- 004011E6 . |83F8 00 cmp eax, 0
- 004011E9 . |74 19 je short 00401204
- 004011EB . |41 inc ecx
- 004011EC .^\EB E6 jmp short 004011D4
一个常数 0x654789 ,每次减一,乘3,再减一。
最后生成一个字符串,类似 BS-%lX-%lu ,第一处填由常数计算出来的结果,第二处为用户名计算出来的结果
一个可用的注册码:
用户名 :12345
密 码 :BS-6022E527-1020
哦,对了,用户名长度要大于等于4的。
注册机代码(vc2010写的):
- CString strName,strSerial;
- char c;
- int nName=0;
- GetDlgItem(IDC_EDIT1)->GetWindowText(strName);
- if (strName.GetLength()<4)
- {
- AfxMessageBox("长度大于等于4");
- return;
- }
- strName.Remove(' ');
- for (int i=0;i<strName.GetLength();i++)
- {
- c = strName.GetAt(i);
- nName += c * 4;
- }
-
- int nLoop = strName.GetLength();
- int nNumber = 0x654789;
- for (int i=0;i<nLoop;i++)
- {
- nNumber--;
- nNumber *= 3;
- nNumber--;
- }
- CString strTarget;
- strTarget.Format("BS-%lX-%lu",nNumber,nName);
- GetDlgItem(IDC_EDIT2)->SetWindowText(strTarget);