meishenm 发表于 2010-5-26 15:03:48

mucki's crackme#2分析

标 题: 【转载】mucki's crackme#2分析
作 者: llydd
时 间: 2006-10-06,00:01:44
链 接: http://bbs.pediy.com/showthread.php?t=32914

【文章标题】: mucki's crackme#2分析
【文章作者】: llydd
【作者邮箱】: [email protected]
【编写语言】: 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                   ; |hWnd
    004011CD|.E8 16020000   |call <jmp.&user32.GetDlgItemTextA>      ; \GetDlgItemTextA
    004011D2|.64:8B15 18000>|mov edx, dword ptr fs:
    004011D9|.8B52 30       |mov edx, dword ptr
    004011DC|.0FB652 02   |movzx edx, byte ptr
    004011E0|.83F8 00       |cmp eax, 0      ;取出用户名,比较用户名的位数是不否大于0,大于则跳
    004011E3|.7F 11         |jg short 004011F6
   
   
   
    004011FE/movsx eax, byte ptr     ;取出用户名每位的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 , 0;重复上面的操作
    00401218\jnz short 004011FE
   
    CM2-2769-9F190E24
   
   
    0040121Amov eax, 0C0DEF
    0040121Fsub eax, ecx      ;用0C0DEF减上面求得的结果(ECX),然后平方送EAX
    00401221imul eax, eax
    00401224push eax                                 ; /<%lX>
    00401225push ecx                                 ; |<%lX>
    00401226push 004060E1                            ; |cm2-%lx-%lx         ;将EAX,与ECX的值按CM2-%lx-%lx的格式转换成注册码
    0040122Bpush 004062B6                            ; |s = crackme2.004062B6
    00401230call <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                    ; |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                    ; |hOwner
    00401266|.E8 89010000   call <jmp.&user32.MessageBoxA>         ; \MessageBoxA
   
   
    注册机代码:
   
    #include "string.h"
    #include "stdio.h"
    int main()
    {char szID;
   inti;
   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

keyule 发表于 2010-5-26 16:29:03

学习下 呵呵 还可以 指令能看懂

miyuecao 发表于 2010-5-26 22:41:28

来看看 学习一下~~
页: [1]
查看完整版本: mucki's crackme#2分析