飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3021|回复: 2

[转贴] mucki's crackme#2分析

[复制链接]

该用户从未签到

发表于 2010-5-26 15:03:48 | 显示全部楼层 |阅读模式
标 题: 【转载】mucki's crackme#2分析
作 者: llydd
时 间: 2006-10-06,00:01:44
链 接: http://bbs.pediy.com/showthread.php?t=32914

【文章标题】: mucki's crackme#2分析
【文章作者】: llydd
【作者邮箱】: mainzo@163.com
【编写语言】: MASM32 / TASM32
【使用工具】: OD+PEID
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  用PEID查壳发现好像加了壳,本人壳盲一个,直接用PEID找到程序入口,得用OD字符插件找到关键点如下
  
    004011BB  /$  55            push ebp
    004011BC  |.  8BEC          mov ebp, esp
    004011BE  |.  57            push edi
    004011BF  |.  56            push esi
    004011C0  |.  53            push ebx
    004011C1  |>  6A 32         /push 32                                 ; /Count = 32 (50.)
    004011C3  |.  68 84624000   |push 00406284                           ; |Buffer = crackme2.00406284
    004011C8  |.  6A 01         |push 1                                  ; |ControlID = 1
    004011CA  |.  FF75 08       |push dword ptr [ebp+8]                  ; |hWnd
    004011CD  |.  E8 16020000   |call <jmp.&user32.GetDlgItemTextA>      ; \GetDlgItemTextA
    004011D2  |.  64:8B15 18000>|mov edx, dword ptr fs:[18]
    004011D9  |.  8B52 30       |mov edx, dword ptr [edx+30]
    004011DC  |.  0FB652 02     |movzx edx, byte ptr [edx+2]
    004011E0  |.  83F8 00       |cmp eax, 0        ;取出用户名,比较用户名的位数是不否大于0,大于则跳
    004011E3  |.  7F 11         |jg short 004011F6
   
   
   
    004011FE  /movsx eax, byte ptr [esi]    ;取出用户名每位的ASCII码移至EAX
    00401201  |mov ebx, eax      ;ASCII码也移至EBX
    00401203  |sub esi, edx
    00401205  |shl eax, 4      ;然后将存于EAX中的ASCII码左移四位,
    00401208  |shr ebx, 5      ;将存于EBX中的ASCII码右移五位
    0040120B  |xor eax, ebx      ;将上面两步的结果相加送EAX
    0040120D  |add eax, 26      ;将EAX+26H
    00401210  |xor eax, ecx      ;(注:ECX存放操作的结果)将上面操作的结果(EAX)与以前所得结果(ECX)异或送至EAX
    00401212  |add ecx, eax      ;将以前操作的结果(ECX)与该结果(EAX)相加保存至ECX
    00401214  |inc esi
    00401215  |cmp byte ptr [esi], 0  ;重复上面的操作
    00401218  \jnz short 004011FE
   
    CM2-2769-9F190E24
   
   
    0040121A  mov eax, 0C0DEF
    0040121F  sub eax, ecx      ;用0C0DEF减上面求得的结果(ECX),然后平方送EAX
    00401221  imul eax, eax
    00401224  push eax                                 ; /<%lX>
    00401225  push ecx                                 ; |<%lX>
    00401226  push 004060E1                            ; |cm2-%lx-%lx           ;将EAX,与ECX的值按CM2-%lx-%lx的格式转换成注册码
    0040122B  push 004062B6                            ; |s = crackme2.004062B6
    00401230  call <jmp.&user32.wsprintfA>             ; \wsprintfA
   
   
    00401235  |.  6A 4B         push 4B                                  ; /Count = 4B (75.)
    00401237  |.  68 B1604000   push 004060B1                            ; |                                       nameless
    0040123C  |.  6A 02         push 2                                   ; |ControlID = 2
    0040123E  |.  FF75 08       push dword ptr [ebp+8]                   ; |hWnd
    00401241  |.  E8 A2010000   call <jmp.&user32.GetDlgItemTextA>       ; \GetDlgItemTextA   ;取假注册码^_^
    00401246  |.  68 B1604000   push 004060B1                            ; /                                       nameless
    0040124B  |.  68 B6624000   push 004062B6                            ; |String1 = ""
    00401250  |.  E8 DB010000   call <jmp.&kernel32.lstrcmpA>            ; \lstrcmpA    ;比较注册码与假码是否相同,相同则注册成功,
    00401255  |.  75 16         jnz short 0040126D
    00401257  |.  6A 00         push 0                                   ; /Style = MB_OK|MB_APPLMODAL
    00401259  |.  68 00604000   push 00406000                            ; |crackme2
    0040125E  |.  68 3D604000   push 0040603D                            ; |valid serial - now write a KeyGen!
    00401263  |.  FF75 08       push dword ptr [ebp+8]                   ; |hOwner
    00401266  |.  E8 89010000   call <jmp.&user32.MessageBoxA>           ; \MessageBoxA
   
   
    注册机代码:
   
    #include "string.h"
    #include "stdio.h"
    int main()
    {char szID[20];
     int  i;
     long nSum=0,nconst=0x0c0def;
     printf("ID=");
     gets(szID);
     while(strlen(szID)<=0)
      {
        printf("ID=");
        gets(szID);
      }
    for(i=0;i<strlen(szID);i++)
      nSum+=(long)(szID*16+szID/32+0x26)^nSum;
    nconst-=nSum;
    nconst*=nconst;
    printf("serial=CM2-%lX-%lX\n",nSum,nconst);
    system("pause");
    return 0;
    }
   
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2006年10月06日 0:00:44

评分

参与人数 1威望 +8 收起 理由
月之精灵 + 8 您的贴子很精彩,希望能再次分享!

查看全部评分

PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2019-2-20 15:52
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2010-5-26 16:29:03 | 显示全部楼层
    学习下 呵呵 还可以 指令能看懂
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2019-9-9 09:51
  • 签到天数: 82 天

    [LV.6]常住居民II

    发表于 2010-5-26 22:41:28 | 显示全部楼层
    来看看 学习一下~~
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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