吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5679|回复: 5
收起左侧

[原创] 明可明非常明第二波cm算法分析

[复制链接]
missviola 发表于 2009-12-29 18:06
本帖最后由 missviola 于 2009-12-31 08:57 编辑

【破文标题】明可明非常明第二波算法分析
【破文作者】missviola[LCG]
破解工具】PEID OD
【破解平台】Windows XP
【原版下载】见附件
【破解声明】只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
------------------------------------------------------------------------
【破解过程】首先PEID查壳,显示加了upx的壳。用upx自带的-d参数脱掉以后,显示为Borland Delphi 6.0 - 7.0。OD载入,用F12暂停法,在467996这里下断点。输入name:pediy,code:123456。分析如下:

00467996  |.  55            push    ebp
00467997  |.  68 3D7A4600   push    00467A3D
0046799C  |.  64:FF30       push    dword ptr fs:[eax]
0046799F  |.  64:8920       mov     dword ptr fs:[eax], esp
004679A2  |.  8D55 FC       lea     edx, dword ptr [ebp-4]
004679A5  |.  8B83 F8020000 mov     eax, dword ptr [ebx+2F8]
004679AB  |.  E8 94BBFCFF   call    00433544
004679B0  |.  837D FC 00    cmp     dword ptr [ebp-4], 0             ;  是否输入了用户名
004679B4  |.  74 5F         je      short 00467A15
004679B6  |.  8D55 F8       lea     edx, dword ptr [ebp-8]
004679B9  |.  8B83 FC020000 mov     eax, dword ptr [ebx+2FC]
004679BF  |.  E8 80BBFCFF   call    00433544
004679C4  |.  837D F8 00    cmp     dword ptr [ebp-8], 0             ;  是否输入了注册码
004679C8  |.  74 4B         je      short 00467A15
004679CA  |.  8D55 F4       lea     edx, dword ptr [ebp-C]
004679CD  |.  8B83 FC020000 mov     eax, dword ptr [ebx+2FC]
004679D3  |.  E8 6CBBFCFF   call    00433544
004679D8  |.  8B45 F4       mov     eax, dword ptr [ebp-C]
004679DB  |.  50            push    eax
004679DC  |.  8D55 F0       lea     edx, dword ptr [ebp-10]
004679DF  |.  8B83 F8020000 mov     eax, dword ptr [ebx+2F8]
004679E5  |.  E8 5ABBFCFF   call    00433544
004679EA  |.  8B45 F0       mov     eax, dword ptr [ebp-10]
004679ED  |.  50            push    eax
004679EE  |.  E8 8DFFFFFF   call    <jmp.&hanyu.Reg1>


F7跟进4679EE处的call看看:

003CD14C >  55              push    ebp
003CD14D    8BEC            mov     ebp, esp
003CD14F    53              push    ebx
003CD150    8B45 08         mov     eax, dword ptr [ebp+8]
003CD153    E8 C075FBFF     call    00384718
003CD158    8B45 0C         mov     eax, dword ptr [ebp+C]
003CD15B    E8 B875FBFF     call    00384718
003CD160    33C0            xor     eax, eax
003CD162    55              push    ebp
003CD163    68 BAD13C00     push    003CD1BA
003CD168    64:FF30         push    dword ptr fs:[eax]
003CD16B    64:8920         mov     dword ptr fs:[eax], esp
003CD16E    8B45 0C         mov     eax, dword ptr [ebp+C]
003CD171    E8 1EFDFFFF     call    003CCE94                    跟进

003CCEB1    55              push    ebp
003CCEB2    68 29CF3C00     push    003CCF29
003CCEB7    64:FF30         push    dword ptr fs:[eax]
003CCEBA    64:8920         mov     dword ptr fs:[eax], esp
003CCEBD    8D45 F4         lea     eax, dword ptr [ebp-C]
003CCEC0    E8 A373FBFF     call    00384268
003CCEC5    8B45 FC         mov     eax, dword ptr [ebp-4]
003CCEC8    E8 5B76FBFF     call    00384528
003CCECD    8BF0            mov     esi, eax
003CCECF    85F6            test    esi, esi
003CCED1    7E 26           jle     short 003CCEF9
003CCED3    BB 01000000     mov     ebx, 1
003CCED8    8D45 F0         lea     eax, dword ptr [ebp-10]
003CCEDB    8B55 FC         mov     edx, dword ptr [ebp-4]
003CCEDE    0FB6541A FF     movzx   edx, byte ptr [edx+ebx-1]        ; 取code各位的ASCII码值
003CCEE3    03D3            add     edx, ebx                         ; 同循环次数相加
003CCEE5    E8 6675FBFF     call    00384450
003CCEEA    8B55 F0         mov     edx, dword ptr [ebp-10]
003CCEED    8D45 F4         lea     eax, dword ptr [ebp-C]
003CCEF0    E8 3B76FBFF     call    00384530                         ; 将和作为ASCII码值转换为对应的字符
003CCEF5    43              inc     ebx
003CCEF6    4E              dec     esi
003CCEF7  ^ 75 DF           jnz     short 003CCED8
003CCEF9    8D55 F8         lea     edx, dword ptr [ebp-8]
003CCEFC    8B45 F4         mov     eax, dword ptr [ebp-C]
003CCEFF    E8 A05FFBFF     call    00382EA4                  循环取上面生成字符串的各位,如果当位不是数字就停止循环。
003CCF04    8BD8            mov     ebx, eax
003CCF06    33C0            xor     eax, eax
003CCF08    5A              pop     edx
003CCF09    59              pop     ecx
003CCF0A    59              pop     ecx
003CCF0B    64:8910         mov     dword ptr fs:[eax], edx
003CCF0E    68 30CF3C00     push    003CCF30
003CCF13    8D45 F0         lea     eax, dword ptr [ebp-10]
003CCF16    BA 02000000     mov     edx, 2
003CCF1B    E8 6C73FBFF     call    0038428C
003CCF20    8D45 FC         lea     eax, dword ptr [ebp-4]
003CCF23    E8 4073FBFF     call    00384268
003CCF28    C3              retn


上面的call主要是对code进行了变换,接着往下看。


003CD176    50              push    eax
003CD177    8B45 08         mov     eax, dword ptr [ebp+8]
003CD17A    E8 89FEFFFF     call    003CD008                  跟进

003CD008    55              push    ebp
003CD009    8BEC            mov     ebp, esp
003CD00B    51              push    ecx
003CD00C    53              push    ebx
003CD00D    8945 FC         mov     dword ptr [ebp-4], eax
003CD010    8B45 FC         mov     eax, dword ptr [ebp-4]
003CD013    E8 0077FBFF     call    00384718
003CD018    33C0            xor     eax, eax
003CD01A    55              push    ebp
003CD01B    68 63D03C00     push    003CD063
003CD020    64:FF30         push    dword ptr fs:[eax]
003CD023    64:8920         mov     dword ptr fs:[eax], esp
003CD026    33DB            xor     ebx, ebx
003CD028    8B45 FC         mov     eax, dword ptr [ebp-4]
003CD02B    E8 F874FBFF     call    00384528
003CD030    85C0            test    eax, eax
003CD032    7E 19           jle     short 003CD04D
003CD034    BA 01000000     mov     edx, 1
003CD039    8B4D FC         mov     ecx, dword ptr [ebp-4]
003CD03C    0FB64C11 FF     movzx   ecx, byte ptr [ecx+edx-1]        ; 取name各位的ASCII码值
003CD041    03D9            add     ebx, ecx                         ; 同ebx相加,ebx初始为0
003CD043    81F3 05FA0B00   xor     ebx, 0BFA05                      ; 和同0xBFA05异或
003CD049    42              inc     edx
003CD04A    48              dec     eax
003CD04B  ^ 75 EC           jnz     short 003CD039
003CD04D    33C0            xor     eax, eax
003CD04F    5A              pop     edx
003CD050    59              pop     ecx
003CD051    59              pop     ecx
003CD052    64:8910         mov     dword ptr fs:[eax], edx
003CD055    68 6AD03C00     push    003CD06A
003CD05A    8D45 FC         lea     eax, dword ptr [ebp-4]
003CD05D    E8 0672FBFF     call    00384268
003CD062    C3              retn
003CD063  ^ E9 546BFBFF     jmp     00383BBC
003CD068  ^ EB F0           jmp     short 003CD05A
003CD06A    8BC3            mov     eax, ebx
003CD06C    5B              pop     ebx
003CD06D    59              pop     ecx
003CD06E    5D              pop     ebp
003CD06F    C3              retn


上面的call对name进行了变换,产生了一个数,我们记为sum。


003CD17F    E8 B4FDFFFF     call    003CCF38   跟进
003CCF38    55              push    ebp
003CCF39    8BEC            mov     ebp, esp
003CCF3B    83C4 F8         add     esp, -8
003CCF3E    8945 FC         mov     dword ptr [ebp-4], eax
003CCF41    53              push    ebx
003CCF42    8B5D FC         mov     ebx, dword ptr [ebp-4]
003CCF45    B8 79954101     mov     eax, 1419579                     ; tempnum = 0x1419579
003CCF4A    89C2            mov     edx, eax
003CCF4C    C1E0 03         shl     eax, 3
003CCF4F    01D0            add     eax, edx                         ; tempnum * 9
003CCF51    01C3            add     ebx, eax                         ; 同sum相加
003CCF53    81C3 44A21300   add     ebx, 13A244                      ; 再加上0x13A244
003CCF59    81F3 C3E85900   xor     ebx, 59E8C3                      ; 同0x59E8C3异或
003CCF5F    81F3 2173C400   xor     ebx, 0C47321                     ; 同0xC47321异或,写注册机的时候我们可以先把两个常数先异或了
003CCF65    895D F8         mov     dword ptr [ebp-8], ebx
003CCF68    5B              pop     ebx
003CCF69    8B45 F8         mov     eax, dword ptr [ebp-8]
003CCF6C    59              pop     ecx
003CCF6D    59              pop     ecx
003CCF6E    5D              pop     ebp
003CCF6F    C3              retn


上面对之前生成的sum又进行了变换。

003CD184    5A              pop     edx
003CD185    E8 E6FDFFFF     call    003CCF70   比较call,逐位比较

到这里我们总结一下这个cm的算法:
1.首先将code各位的ASCII码值加上循环次数,产生一个新的字符串。然后依次验证各位,遇到不是数字的就停止循环。以此产生一个数字,记为num1。
2.对name各位的ASCII码值进行一系列的异或和加法变换,产生一个新的数字,记为num2。
3.如果num1 = num2,则注册成功。
那么我们写注册机的思路也很简单了。先算出num2,然后将num2的各位ASCII码值减去循环次数,再变换为新的字符就行了。下面给出注册机源代码(VS2005+windows sp2下编译通过):
void CpediyDlg::OnBnClickedButton1()
{
CString username;
CString tempstr1;
CString tempstr2;
CString sn;
int i,j, k ,length, tmpnum1, tmpnum2, tmpnum3 , sum = 0;
char c;
if (GetDlgItemText(IDC_EDIT1, username) == 0)
{
  MessageBox("请输入用户名!");
}
else
{
length = username.GetLength();
tmpnum2 = 0x1419579;
for (i = 0;i<length;i++)
{
   tmpnum1 = username[i];
   sum = sum + tmpnum1;
   sum = sum ^ 0xBFA05;
  
}
tmpnum2 = tmpnum2 * 9;
sum = (sum + tmpnum2 + 0x13A244) ^ 0x9D9BE2;
    tempstr1.Format("%d", sum);
j = tempstr1.GetLength();
for (k = 1;k <= j;k++)
{
  tmpnum3 = tempstr1[k-1] - k;
  char c = (char)tmpnum3;
  tempstr2.Format("%c", c);
  sn = sn + tempstr2;
}
SetDlgItemText(IDC_EDIT2,sn);
}
}
------------------------------------------------------------------------
【破解总结】总的来说这个cm比较简单,比较的方式为逐位比较。
------------------------------------------------------------------------
【版权声明】本文原创于52pojie技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

crackme:

CrackMe.zip (1.05 MB, 下载次数: 0)

免费评分

参与人数 1威望 +1 收起 理由
CHHSun + 1 感谢发布原创作品,[吾爱破解]因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

innovation 发表于 2009-12-29 19:10
支持原创!
87jc 发表于 2009-12-29 21:27
混混angel 发表于 2010-5-30 01:24
a362071252 发表于 2010-5-30 19:57
给你顶一下
落雪飞花 发表于 2011-2-11 14:26
看看怎么样啊
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 10:16

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表