CrackMe分析3.11.12.28【第二关】
【文章作者】: HcyRcer
【作者邮箱】: 421458119@qq.com
【作者主页】: http://hi.baidu.com/kao4ni/home
【作者QQ号】: 421458119
【下载地址】: http://www.2cto.com/Article/201112/115448.html
【加壳方式】: 无
【编写语言】: Borland Delphi 4.0 - 5.0
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
CrackMe的第一关,已经被我们解决掉了!!这次继续干掉 第二关!!一共4关!不知道我能过到第几关!!
第二关:难度系数3
和第一关一样,DEDE查 SpeedButton2Click 0044C648 !!第一关既然是Button1Click !!第二关估计就是
Button2Click 了!!
OD 载入后CTRL + G 到达0044C648 后,下F2断点!! 此地址为Button1Click 按钮过程!!
然后输入NAME:7个1
COMPANY: 7个2
serial:7个3
点击【CHECK】,OD在0044C648 断下过程!!然后F8单步走,走到0044C66F call CrackMe_.00403A74时,
发现EAX 显示出了我们输入的NAME,7个1!! 此时程序开始进入 算法阶段!
全部 流程如下:
代码:
0044C648 /. 5>push ebp
0044C649 |. 8>mov ebp,esp
0044C64B |. 8>add esp,-8
0044C64E |. 5>push ebx
0044C64F |. 5>push esi
0044C650 |. 3>xor ecx,ecx
0044C652 |. 8>mov dword ptr ss:[ebp-8],ecx
0044C655 |. 8>mov esi,eax
0044C657 |. 3>xor eax,eax
0044C659 |. 5>push ebp
0044C65A |. 6>push CrackMe_.0044C783
0044C65F |. 6>push dword ptr fs:[eax]
0044C662 |. 6>mov dword ptr fs:[eax],esp
0044C665 |. 3>xor eax,eax
0044C667 |. 8>mov dword ptr ss:[ebp-4],eax
0044C66A |. A>mov eax,dword ptr ds:[44F880] //eax为NAME
0044C66F |. E>call CrackMe_.00403A74 返回NAME位数
0044C674 |. 8>cmp eax,6
0044C677 |. 0>jle CrackMe_.0044C76D //NAME位数小于等于6则错
0044C67D |. A>mov eax,dword ptr ds:[44F880]
0044C682 |. E>call CrackMe_.00403A74
0044C687 |. 8>cmp eax,14
0044C68A |. 0>jge CrackMe_.0044C76D NAME 位数大于等于14则错
0044C690 |. A>mov eax,dword ptr ds:[44F880]
0044C695 |. E>call CrackMe_.00403A74
0044C69A |. 8>test eax,eax
0044C69C |. 7>jle short CrackMe_.0044C6B5 如果没有输入NAME,则不进行 NAME算法计算,而 跳到0044C6B5 进行COMPANY的 计算
0044C69E |. B>mov edx,1
0044C6A3 |> 8>/mov ecx,dword ptr ds:[44F880]
0044C6A9 |. 0>|movzx ecx,byte ptr ds:[ecx+edx-1]
0044C6AE |. 0>|add dword ptr ss:[ebp-4],ecx
0044C6B1 |. 4>|inc edx
0044C6B2 |. 4>|dec eax
0044C6B3 |.^ 7>\jnz short CrackMe_.0044C6A3 以上为NAME的ASCII码值的 和,并把 和 保存到[ebp-4] 中
0044C6B5 |> A>mov eax,dword ptr ds:[44F884] 取COMPANY 值
0044C6BA |. E>call CrackMe_.00403A74 取COMPANY 位数
0044C6BF |. 8>cmp eax,2
0044C6C2 |. 7>jle short CrackMe_.0044C6DC 位数 小于等于2的话,则跳0044C6DC
0044C6C4 |. A>mov eax,dword ptr ds:[44F884]
0044C6C9 |. E>call CrackMe_.00403A74
0044C6CE |. 8>cmp eax,8
0044C6D1 |. 7>jge short CrackMe_.0044C6DC 位数 大于等于8的话,则跳0044C6DC
0044C6D3 |. 8>mov eax,dword ptr ss:[ebp-4]
0044C6D6 |. 6>imul eax,eax,2
0044C6D9 |. 8>mov dword ptr ss:[ebp-4],eax 位数在3-7个时,则[ebp-4] * = 2
0044C6DC |> 6>push CrackMe_.0044C798 入栈字符串:"I Love Cracking and"
0044C6E1 |. 8>lea edx,dword ptr ss:[ebp-8] 缓冲区
0044C6E4 |. 8>mov eax,dword ptr ss:[ebp-4] 取[ebp-4]
0044C6E7 |. E>call CrackMe_.00407754 此函数为:wsprintf([ebp-8],"%d",[ebp-4])
0044C6EC |. F>push dword ptr ss:[ebp-8] 入栈 格式化后的字符串,我的为"686 "
0044C6EF |. 6>push CrackMe_.0044C7B8 入栈 字符串Girls ;)
0044C6F4 |. B>mov eax,CrackMe_.0044F88C
0044C6F9 |. B>mov edx,3
0044C6FE |. E>call CrackMe_.00403B34 把刚才入栈的3个字符串 连起来为:
I Love Cracking and 364 Girls ;) //长度20
0044C703 |. 3>xor eax,eax
0044C705 |. 8>mov dword ptr ss:[ebp-4],eax //[ebp-4]=0
0044C708 |. A>mov eax,dword ptr ds:[44F888] 取第三个serial的值7个3
0044C70D |. E>call CrackMe_.00403A74 取第三个serial的长度
0044C712 |. 8>mov ebx,eax 把长度放到EBX中
0044C714 |. A>mov eax,dword ptr ds:[44F88C] 取出字符串I Love Cracking and 364 Girls ;)
0044C719 |. E>call CrackMe_.00403A74 计算长度 放到EAX
0044C71E |. 3>cmp ebx,eax 比较serial 与I Love Cracki.....的长度是否相等
0044C720 |. 7>jnz short CrackMe_.0044C76D 不等则错
0044C722 |. A>mov eax,dword ptr ds:[44F888] 取第三个serial的值7个3
0044C727 |. E>call CrackMe_.00403A74
0044C72C |. 8>test eax,eax
0044C72E |. 7>jle short CrackMe_.0044C757 判断serial 的长度,为0 则跳
0044C730 |. B>mov edx,1
0044C735 |> 8>/mov ecx,dword ptr ds:[44F888]
0044C73B |. 0>|movzx ecx,byte ptr ds:[ecx+edx-1]
0044C740 |. 0>|add ecx,dword ptr ss:[ebp-4]
0044C743 |. 8>|mov ebx,dword ptr ds:[44F88C]
0044C749 |. 0>|movzx ebx,byte ptr ds:[ebx+edx-1]
0044C74E |. 2>|sub ecx,ebx
0044C750 |. 8>|mov dword ptr ss:[ebp-4],ecx
0044C753 |. 4>|inc edx
0044C754 |. 4>|dec eax
0044C755 |.^ 7>\jnz short CrackMe_.0044C735 //从44C735到此为一个循环,循环把
输入的COMPANY 与20位的I Love Cracking and 364 Girls ;) 对应位想减!!
0044C757 |> 8>cmp dword ptr ss:[ebp-4],0
0044C75B |. 7>jnz short CrackMe_.0044C76D 如果输入的COMPANY值不为
I Love Cracking and 364 Girls ;) 则错误!! 为则正确!!!!!!!!!!!!
0044C75D |. 8>mov eax,dword ptr ds:[esi+314]
0044C763 |. B>mov edx,CrackMe_.0044C7CC ; You have found the correct Serial :)
0044C768 |. E>call CrackMe_.00425854
0044C76D |> 3>xor eax,eax
0044C76F |. 5>pop edx
0044C770 |. 5>pop ecx
0044C771 |. 5>pop ecx
0044C772 |. 6>mov dword ptr fs:[eax],edx
0044C775 |. 6>push CrackMe_.0044C78A
0044C77A |> 8>lea eax,dword ptr ss:[ebp-8]
0044C77D |. E>call CrackMe_.004037F8
0044C782 \. C>retn
【经验总结】:
注册分2种情况:
第一种。COMPANY的位数 小于等于2个 或 大于等于8时。
NAME:必须是7-13个,NAME的ASCII码 的 和 放到 @1 中
COMPANY:不进行判断
serial:为20为的I Love Cracking and @1 Girls ;)
第二种。COMPANY的位数 为3 - 7个时。
NAME:必须是7-13个,NAME的ASCII码 的 和 放到 @1 中
COMPANY:@1 = @1 *2
serial:为20为的I Love Cracking and @1 Girls ;)
推出注册码:
第一种。
NAME:1234567 //ASC码和 为364
COMPANY:随便什么,但位数必须 小于等于2个 或 大于等于8
serial:I Love Cracking and 364 Girls ;)
第二种。
NAME:1234567 //ASC码和 为364
COMPANY:随便什么,但位数必须是 3-7个
serial:I Love Cracking and 728 Girls ;) // 364 * 2 =728
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2011年12月28日 13:41:38