[求助]一个crackme遇到的问题,请大家来指点一下。
00401056 |> /0FB613 /movzx edx,byte ptr ds:[ebx] ; 从头取一个字节
00401059 |. |0FB63C2E |movzx edi,byte ptr ds:[esi+ebp] ; 从尾部取字节
0040105D |. |33D7 |xor edx,edi ; 把取出的字符异或
0040105F |. |03C2 |add eax,edx ; 把异或结果累加
00401061 |. |0FAFC1 |imul eax,ecx ; ECX存放的注册码长度一半
00401064 |. |43 |inc ebx ; CrackMe.0040300C
00401065 |. |4D |dec ebp ; CrackMe.0040300C
00401066 |. |49 |dec ecx
00401067 |> |83F9 01 cmp ecx,0x1
0040106A |.^\73 EA \jnb short CrackMe.00401056
0040106C |. 83F8 66 cmp eax,0x66 ; --------------------->
0040106F |. 74 0E je short CrackMe.0040107F
00401071 |. 3D 59010000 cmp eax,0x159 ; 比铰EAX的算法值是不是0x66 0x159
0xEB是就注册成
00401076 |. 74 07 je short CrackMe.0040107F
00401078 |. 3D EB000000 cmp eax,0xEB ; <-----------------------------
0040107D |. 75 09 jnz short CrackMe.00401088
0040107F |> C605 D5304000>mov byte ptr ds:[0x4030D5],0x1
00401086 |. EB 07 jmp short CrackMe.0040108F
00401088 |> C605 D5304000>mov byte ptr ds:[0x4030D5],0x0
0040108F |> 5D pop ebp ; 0012FB74
00401090 |. 8A4D FF mov cl,byte ptr ss:[ebp-0x1]
00401093 |. BB 0C304000 mov ebx,CrackMe.0040300C ; ASCII "4440V444"
00401098 |. BD 0C304000 mov ebp,CrackMe.0040300C ; ASCII "4440V444"
0040109D |. EB 17 jmp short CrackMe.004010B6
0040109F |> 0FB613 /movzx edx,byte ptr ds:[ebx] ; --------------->
004010A2 |. 0FB63C2E |movzx edi,byte ptr ds:[esi+ebp] ; 防止人为构构间单注册码
004010A6 |. 3BD7 |cmp edx,edi
004010A8 |. 75 09 |jnz short CrackMe.004010B3
004010AA |. C605 D5304000>|mov byte ptr ds:[0x4030D5],0x0
004010B1 |. EB 11 |jmp short CrackMe.004010C4
004010B3 |> 43 |inc ebx ; CrackMe.0040300C
004010B4 |. 4D |dec ebp ; CrackMe.0040300C
004010B5 |. 49 |dec ecx
004010B6 |> 83F9 01 cmp ecx,0x1
004010B9 |.^ 73 E4 \jnb short CrackMe.0040109F ; <-----------------------------
004010BB |. EB 07 jmp short CrackMe.004010C4
从分析代码来看注册码是个8位数的字串
以EAX=0x66 // 十进制为102
cmp eax,0x66
从上位算法来看头尾的字符不可以相同,也算法来我们可构造注册码前面首尾异或结果为1,那么按算法来算最后一次导或
结果为0x46 (70) .
0x66-(((0x1+0)*4+1)*3+1)*2 = 0x46
那我就用一个随机的数3吧
1. 首先搞定前面三对吧!我是把0x30(就是十进制0)异或 0x31 (就是十进制1)
2. 这样经过前面三次运算就得到最后一次异或结果是0x46就可以了
3.只你随用一个字符与0x46异或就可得到注册码最后一位如:
我用的是0x33(3) XOR 0x46 = 0x75(u)那么0003u111这个注码是可用的.
当然用0x34(4) XOR 0x46 = 0x72(r) 那注册码就是0004r111了