中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 看雪学院专区 > CrackMe
mucki's crackme#2分析
作者:佚名 时间:2006-12-15 10:47 出处:pediy.com 责编:月夜寒箫
              摘要:mucki's crackme#2分析
【文章标题】: 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[i]*16+szID[i]/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
所上传文件
crackme2.zip (上传时间2006-10-06,00:01,13.1 KB,27 次点击)
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有