首页
社区
课程
招聘
[原创]明可"明" 非常"明"(第二波)
发表于: 2009-3-29 11:01 10368

[原创]明可"明" 非常"明"(第二波)

2009-3-29 11:01
10368
收藏
免费 0
支持
分享
最新回复 (28)
雪    币: 1596
活跃值: (30)
能力值: ( 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
2009-7-10 11:01
0
雪    币: 1596
活跃值: (30)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
27
附上注册机!
上传的附件:
2009-7-12 09:07
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
28
还是不太懂,核心代码的内存区域是什么时候分配的啊?
2009-7-14 12:46
0
雪    币: 1596
活跃值: (30)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
29
这个很重要吗?只要知道它的地址就OK
2009-7-16 08:56
0
游客
登录 | 注册 方可回帖
返回
//