能力值:
( LV7,RANK:110 )
|
-
-
26 楼
【文章标题】: 明可"明" 非常"明"(第二波)的破解
【文章作者】: 柳州小林
【作者邮箱】: 2130292@163.COM
【作者主页】: http://user.qzone.qq.com/55713720?ptlang=2052
【作者QQ号】: 55713720
【软件名称】: crackme
【软件大小】: 842K
【下载地址】: http://bbs.pediy.com/showthread.php?t=84810
【加壳方式】: 无
【保护方式】: 用户名,注册码
【编写语言】: Delphi 6.0
【使用工具】: OD
【操作平台】: xp
--------------------------------------------------------------------------------
【详细过程】
1、用户名、注册码正确时,会弹出“True”的窗口,错误会显示一个图片。
2、由于是用Delphi 6.0编写,所以用DeDe反编译,并找到按键事件的入口(RAW=67988)。
3、下断,断下后一路按F8到这里:
004679EE |. E8 8DFFFFFF call <jmp.&hanyu.Reg1> ; 算法
这里将跳到hanyu.dll里。
4、核心代码如下,
003ED162 55 push ebp
003ED163 68 BAD13E00 push 003ED1BA
003ED168 64:FF30 push dword ptr fs:[eax]
003ED16B 64:8920 mov dword ptr fs:[eax], esp
003ED16E 8B45 0C mov eax, dword ptr [ebp+C] ; sn
003ED171 E8 1EFDFFFF call <运算SN后得字串S1> ; 16进制
003ED176 50 push eax
003ED177 8B45 08 mov eax, dword ptr [ebp+8]
003ED17A E8 89FEFFFF call <运算USER得S2> ; 返回EAX
003ED17F E8 B4FDFFFF call <运算S2得S3> ; 参数为EAX
003ED184 5A pop edx
003ED185 E8 E6FDFFFF call <数字变字符串并比较> ; S1与S3比较
003ED18A 85C0 test eax, eax
003ED18C 75 0F jnz short 003ED19D
5、分析完上面的代码后得出结论。用户名经过两次运算后与注册码经过一运算后的结果对比。
用户名的运算1:
003ED17A E8 89FEFFFF call <运算USER得S2>
||
||
\ /
\/
003ED02B E8 F874FBFF call <取EAX的长度>
003ED030 85C0 test eax, eax
003ED032 7E 19 jle short 003ED04D
003ED034 BA 01000000 mov edx, 1 ; int temp1,temp2=0
003ED039 8B4D FC mov ecx, dword ptr [ebp-4] ; /for(i=0;i<sn.len;i++)
003ED03C 0FB64C11 FF movzx ecx, byte ptr [ecx+edx-1] ; temp1=asc(user[i])
003ED041 03D9 add ebx, ecx ; temp2+=temp1
003ED043 81F3 05FA0B00 xor ebx, 0BFA05 ; temp2^=0xBFA05
003ED049 42 inc edx
003ED04A 48 dec eax
003ED04B ^ 75 EC jnz short 003ED039 ; \得出S2
// 翻译成C++:
long CCrackme_Dlg::fun2(CString user)
{
long a=1,c=0;
char b;
for (int i=0;i<user.GetLength();i++)
{
b=user.GetAt(i);
c+=b;
c^=0x0BFA05;
}
return c;//0x1aa
}
用户名的运算2:
003ED17F E8 B4FDFFFF call <运算S2得S3>
||
||
\ /
\/
003ECF38 > 55 push ebp
003ECF39 8BEC mov ebp, esp
003ECF3B 83C4 F8 add esp, -8
003ECF3E 8945 FC mov dword ptr [ebp-4], eax
003ECF41 53 push ebx
003ECF42 8B5D FC mov ebx, dword ptr [ebp-4]
003ECF45 B8 79954101 mov eax, 1419579
003ECF4A 89C2 mov edx, eax
003ECF4C C1E0 03 shl eax, 3
003ECF4F 01D0 add eax, edx
003ECF51 01C3 add ebx, eax
003ECF53 81C3 44A21300 add ebx, 13A244
003ECF59 81F3 C3E85900 xor ebx, 59E8C3
003ECF5F 81F3 2173C400 xor ebx, 0C47321
003ECF65 895D F8 mov dword ptr [ebp-8], ebx
// 翻译成C++:
long CCrackme_Dlg::fun3(long num)
{
long a,b;
a=189677889;
b=num+a;
b+=0x13A244;
b^=0x59E8C3;
b^=0x0C47321;
return b;
}
注册码运算:
003ED171 E8 1EFDFFFF call <运算SN后得字串S1>
||
||
\ /
\/
003ECEC8 E8 5B76FBFF call <取EAX的长度>
003ECECD 8BF0 mov esi, eax
003ECECF 85F6 test esi, esi
003ECED1 7E 26 jle short 003ECEF9
003ECED3 BB 01000000 mov ebx, 1
003ECED8 8D45 F0 lea eax, dword ptr [ebp-10] ; /for(i=1;i<sn.len;i++)
003ECEDB 8B55 FC mov edx, dword ptr [ebp-4]
003ECEDE 0FB6541A FF movzx edx, byte ptr [edx+ebx-1]
003ECEE3 03D3 add edx, ebx ; asc(sn[i])+i
003ECEE5 E8 6675FBFF call <ASCII转字符>
003ECEEA 8B55 F0 mov edx, dword ptr [ebp-10] ; 存在EDX(地址)
003ECEED 8D45 F4 lea eax, dword ptr [ebp-C]
003ECEF0 E8 3B76FBFF call <strcat>
003ECEF5 43 inc ebx
003ECEF6 4E dec esi
003ECEF7 ^ 75 DF jnz short 003ECED8 ; \得出S1(字符串)
翻译成C++:
CString CCrackme_Dlg::fun1(CString sn)
{
CString temp;
for (int i=1;i<=sn.GetLength();i++)
{
temp+=sn.GetAt(i-1)+i;
}
return temp;
}
6、写出注册码运算的逆向代码。
if (m_edit1.GetWindowTextLength()==0)
{
return;
}
CString user,sn;
long s1;
m_edit1.GetWindowText(user);
s1=fun2(user);
s1=fun3(s1);
user.Format("%d",s1);
for (int i=0;i<user.GetLength();i++)
{
sn+=user.GetAt(i)-(i+1);
}
m_edit2.SetWindowText(sn);
7、爆破。
003ED185 E8 E6FDFFFF call <数字变字符串并比较>
||
||
\ /
\/
003ECF7F 55 push ebp
003ECF80 68 F9CF3E00 push 003ECFF9
003ECF85 64:FF30 push dword ptr fs:[eax]
003ECF88 64:8920 mov dword ptr fs:[eax], esp
003ECF8B 8D4D F8 lea ecx, dword ptr [ebp-8]
003ECF8E BA 04000000 mov edx, 4
003ECF93 8BC3 mov eax, ebx
003ECF95 E8 2EB2FBFF call <数字变字符串>
003ECF9A 8D4D FC lea ecx, dword ptr [ebp-4]
003ECF9D BA 04000000 mov edx, 4
003ECFA2 8BC6 mov eax, esi
003ECFA4 E8 1FB2FBFF call <数字变字符串>
003ECFA9 8B45 F8 mov eax, dword ptr [ebp-8]
003ECFAC E8 7775FBFF call <取EAX的长度>
003ECFB1 8BD8 mov ebx, eax
003ECFB3 8B45 FC mov eax, dword ptr [ebp-4]
003ECFB6 E8 6D75FBFF call <取EAX的长度>
003ECFBB 8BD0 mov edx, eax
003ECFBD 85D2 test edx, edx
003ECFBF 7E 1D jle short 003ECFDE
003ECFC1 B8 01000000 mov eax, 1
003ECFC6 8B4D F8 mov ecx, dword ptr [ebp-8]
003ECFC9 8A4C01 FF mov cl, byte ptr [ecx+eax-1]
003ECFCD 8B75 FC mov esi, dword ptr [ebp-4]
003ECFD0 3A4C06 FF cmp cl, byte ptr [esi+eax-1] ; !=J
003ECFD4 75 03 jnz short 003ECFD9
003ECFD6 4B dec ebx
003ECFD7 EB 01 jmp short 003ECFDA
003ECFD9 43 inc ebx
003ECFDA 40 inc eax
003ECFDB 4A dec edx
003ECFDC ^ 75 E8 jnz short 003ECFC6
把全部的dword ptr [ebp-4]改成dword ptr [ebp-8]就可以了。
--------------------------------------------------------------------------------
2009年07月12日 09:06:54
|
能力值:
( LV7,RANK:110 )
|
-
-
29 楼
这个很重要吗?只要知道它的地址就OK
|