My FAQ,最新最全的IT技术FAQ
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 未整理篇 | 技术讨论
  当前位置:> 看雪学院专区 > CrackMe
对一个CrackMe的分析
作者:佚名 时间:2005-11-17 12:41 出处:pediy 责编:My FAQ
              摘要:暂无
【破文标题】NAG-RAR 逆向分析
【破文作者】HappyTown
【作者邮箱】wxr277@163.com
【软件名称】NAG-RAR 
【下载地址】
本地下载:nag-rar.rar 
【应用平台】Win9x/NT/2000/XP
【软件大小】42.0 KB
【保护方式】序列号
【破解难度】简单,献给像我等这样的菜鸟学习
【破解声明】我是一只小菜鸟,偶得一点心得,愿与大家分享:)
【破解工具】PEiD,OllyDbg
【软件简介】这个CrackMe作者本来只是想通过此提供另一个文件的解压密码。但事实上,通过逆向该CrackMe可
            以发现:无法得到一个固定的解压密码。也就是说,所得到的解压密码是无效的。
========================================================================================
【分析过程】

开工:

1、用PEiD查无壳;
2、不输入Serial,输入9位数字及字母加数字,分别出现不同的信息;
3、好了,在OD命令行下断点bpx GetDlgItemTextA,只有一处断点。

输入9位数字试练码Serial=123456789。为什么必须是9位数字,往下看就知道了。

注意字符串"`44muYh1|X5k05w"(不包含双引号)是怎么形成的!


00407D2A   |.  push 400                            ; /Count = 400 (1024.)
00407D2F   |.  push edi                            ; |Buffer
00407D30   |.  push 0BB9                           ; |ControlID = BB9 (3001.)
00407D35   |.  mov eax,dword ptr ds:[40A850]       ; |
00407D3A   |.  push eax                            ; |hWnd
00407D3B   |.  call <jmp.&user32.GetDlgItemTextA>  ; \GetDlgItemTextA //取得Serial
00407D40   |.  cmp byte ptr ds:[edi],0    //未输入Serial则提示"Enter serial !!!"
00407D43   |.  jnz short NAG-RAR.00407D67
00407D45   |.  mov eax,dword ptr ds:[409294]
00407D4A   |.  push eax                            ; /Text => "Enter serial !!!"
00407D4B   |.  push 0BB9                           ; |ControlID = BB9 (3001.)
00407D50   |.  mov eax,dword ptr ds:[40A850]       ; |
00407D55   |.  push eax                            ; |hWnd 
00407D56   |.  call <jmp.&user32.SetDlgItemTextA>  ; \SetDlgItemTextA

00407D5B   |.  mov eax,edi
00407D5D   |.  call NAG-RAR.00402504
00407D62   |.  jmp NAG-RAR.00407FC0
00407D67   |>  lea eax,dword ptr ss:[ebp-8]
00407D6A   |.  mov edx,edi      //输入的Serial:123456789
00407D6C   |.  call NAG-RAR.0040378C    //该函数检测Serial的每位是否为1~9的数字
00407D71   |.  mov eax,dword ptr ss:[ebp-8]  //输入的Serial:123456789
00407D74   |.  call NAG-RAR.00403824    //取得Serial长度
00407D79   |.  cmp eax,9      //判断Serial长度是否等于9,不等则错。 
00407D7C   |.  jnz NAG-RAR.00407FB9

00407D82   |.  mov eax,dword ptr ss:[ebp-8]    
00407D85   |.  mov al,byte ptr ds:[eax]    //al=31(Serial的第1位x1)(为了方便,把Serial的第i位记为xi)
00407D87   |.  mov edx,dword ptr ss:[ebp-8]
00407D8A   |.  mov dl,byte ptr ds:[edx+3]  //bl=34(Serial的第4位x4)
00407D8D   |.  xor al,dl      //al=al xor bl =x1 xor x4
00407D8F   |.  mov edx,dword ptr ss:[ebp-8]
00407D92   |.  mov dl,byte ptr ds:[edx+6]  //dl=37(Serial的第7位x7)
00407D95   |.  xor al,dl      //al=al xor dl= x1 xor x4 xor x7
00407D97   |.  and eax,0FF
00407D9C   |.  mov dword ptr ss:[ebp-C],eax  //把al高位0扩展后的值放入[ebp-C],即[ebp-C]=x1 xor x4 xor x7
00407D9F   |.  mov eax,dword ptr ss:[ebp-8]
00407DA2   |.  mov al,byte ptr ds:[eax+1]  //al=32(Serial的第2位x2)
00407DA5   |.  mov edx,dword ptr ss:[ebp-8]
00407DA8   |.  mov dl,byte ptr ds:[edx+4]  //dl=35(Serial的第5位x5)
00407DAB   |.  xor al,dl      //al=al xor dl=x2 xor x5
00407DAD   |.  mov edx,dword ptr ss:[ebp-8]
00407DB0   |.  mov dl,byte ptr ds:[edx+7]  //dl=38x2 xor x5 xor x8
00407DB3   |.  xor al,dl      //al=al xor dl=x2 xor x5 xor x8
00407DB5   |.  and eax,0FF
00407DBA   |.  mov dword ptr ss:[ebp-14],eax  //把al高位0扩展后的值放入[ebp-14],即[ebp-14]=x2 xor x5 xor x8
00407DBD   |.  mov eax,dword ptr ss:[ebp-8]
00407DC0   |.  mov al,byte ptr ds:[eax+2]  //al=33(Serial的第3位x3)
00407DC3   |.  mov edx,dword ptr ss:[ebp-8]
00407DC6   |.  mov dl,byte ptr ds:[edx+5]  //dl=36(Serial的第6位x6)
00407DC9   |.  xor al,dl      //al=al xor dl=x3 xor x6
00407DCB   |.  mov edx,dword ptr ss:[ebp-8]
00407DCE   |.  mov dl,byte ptr ds:[edx+8]  //dl=39(Serial的第9位x9)
00407DD1   |.  xor al,dl      //al=al xor dl=x3 xor x6 xor x9
00407DD3   |.  and eax,0FF
00407DD8   |.  mov dword ptr ss:[ebp-10],eax  //把al高位0扩展后的值放入[ebp-10],即[ebp-10]=x3 xor x6 xor x9
00407DDB   |.  mov esi,dword ptr ss:[ebp-C]  //esi=[ebp-C]
00407DDE   |.  xor esi,dword ptr ss:[ebp-14]  //esi=esi xor [ebp-14]=[ebp-C] xor [ebp-14]
00407DE1   |.  xor esi,dword ptr ss:[ebp-10]  //esi=esi xor [ebp-10]=[ebp-C] xor [ebp-14] xor [ebp-10]=31
00407DE4   |.  add esi,2      //esi=33
      
00407DE7   |.  lea eax,dword ptr ss:[ebp-4]
00407DEA   |.  mov edx,NAG-RAR.00407FFC        //用于计算注册码的表 "a55ayUg>sY9d19x",记为Table

00407DEF   |.  call NAG-RAR.0040364C    //这个函数不用理睬
00407DF4   |.  mov eax,dword ptr ss:[ebp-4]  //Table "a55ayUg>sY9d19x"
00407DF7   |.  xor ebx,ebx
00407DF9   |.  mov bl,byte ptr ds:[eax]    //Table第1位"a"
00407DFB   |.  xor ebx,esi      //ebx=ebx xor esi 
00407DFD   |.  xor ebx,dword ptr ss:[ebp-C]  //ebx=ebx xor [ebp-C]=ebx xor [ebp-C] xor esi=60(即字符"`")
00407E00   |.  lea eax,dword ptr ss:[ebp-4]
00407E03   |.  call NAG-RAR.004039B8    //这个函数不用理睬,以下同
00407E08   |.  mov byte ptr ds:[eax],bl    //60(`),即字符串"`44muYh1|X5k05w"的第1位
00407E0A   |.  mov eax,dword ptr ss:[ebp-4]
00407E0D   |.  xor ebx,ebx
00407E0F   |.  mov bl,byte ptr ds:[eax+1]  //Table第2位"5"
00407E12   |.  xor ebx,esi
00407E14   |.  xor ebx,dword ptr ss:[ebp-C]  //ebx=ebx xor [ebp-C] xor esi=34(4)
00407E17   |.  lea eax,dword ptr ss:[ebp-4]
00407E1A   |.  call NAG-RAR.004039B8
00407E1F   |.  mov byte ptr ds:[eax+1],bl  //34(4),即字符串"`44muYh1|X5k05w"的第2位
00407E22   |.  mov eax,dword ptr ss:[ebp-4]
00407E25   |.  xor ebx,ebx
00407E27   |.  mov bl,byte ptr ds:[eax+2]  //Table第3位"5"
00407E2A   |.  xor ebx,esi
00407E2C   |.  xor ebx,dword ptr ss:[ebp-C]  //ebx=ebx xor [ebp-C] xor esi=34(4)
00407E2F   |.  lea eax,dword ptr ss:[ebp-4]
00407E32   |.  call NAG-RAR.004039B8
00407E37   |.  mov byte ptr ds:[eax+2],bl  //34(4),即字符串"`44muYh1|X5k05w"的第3位,以下同
00407E3A   |.  mov eax,dword ptr ss:[ebp-4]
00407E3D   |.  xor ebx,ebx
00407E3F   |.  mov bl,byte ptr ds:[eax+3]  //Table第4位"a"
00407E42   |.  xor ebx,esi
00407E44   |.  xor ebx,dword ptr ss:[ebp-14]  //ebx=ebx xor [ebp-14] xor esi=6D(m)
00407E47   |.  lea eax,dword ptr ss:[ebp-4]
00407E4A   |.  call NAG-RAR.004039B8
00407E4F   |.  mov byte ptr ds:[eax+3],bl  //6D(m)
00407E52   |.  mov eax,dword ptr ss:[ebp-4]
00407E55   |.  xor ebx,ebx
00407E57   |.  mov bl,byte ptr ds:[eax+4]  //Table第5位"y"
00407E5A   |.  xor ebx,esi
00407E5C   |.  xor ebx,dword ptr ss:[ebp-14]  //ebx=ebx xor [ebp-14] xor esi=75(u)
00407E5F   |.  lea eax,dword ptr ss:[ebp-4]
00407E62   |.  call NAG-RAR.004039B8
00407E67   |.  mov byte ptr ds:[eax+4],bl  //75(u)
00407E6A   |.  mov eax,dword ptr ss:[ebp-4]
00407E6D   |.  xor ebx,ebx
00407E6F   |.  mov bl,byte ptr ds:[eax+5]  //Table第6位"U"
00407E72   |.  xor ebx,esi
00407E74   |.  xor ebx,dword ptr ss:[ebp-14]  //ebx=ebx xor [ebp-14] xor esi=59(Y)
00407E77   |.  lea eax,dword ptr ss:[ebp-4]
00407E7A   |.  call NAG-RAR.004039B8      
00407E7F   |.  mov byte ptr ds:[eax+5],bl
00407E82   |.  mov eax,dword ptr ss:[ebp-4]
00407E85   |.  xor ebx,ebx
00407E87   |.  mov bl,byte ptr ds:[eax+6]  //Table第7位"g"
00407E8A   |.  xor ebx,esi
00407E8C   |.  xor ebx,dword ptr ss:[ebp-10]  //ebx=ebx xor [ebp-10] xor esi=68(h)
00407E8F   |.  lea eax,dword ptr ss:[ebp-4]
00407E92   |.  call NAG-RAR.004039B8
00407E97   |.  mov byte ptr ds:[eax+6],bl  //68(h)
00407E9A   |.  mov eax,dword ptr ss:[ebp-4]
00407E9D   |.  xor ebx,ebx
00407E9F   |.  mov bl,byte ptr ds:[eax+7]  //Table第8位">"
00407EA2   |.  xor ebx,esi
00407EA4   |.  xor ebx,dword ptr ss:[ebp-10]  //ebx=ebx xor [ebp-10] xor esi=31(1)
00407EA7   |.  lea eax,dword ptr ss:[ebp-4]
00407EAA   |.  call NAG-RAR.004039B8
00407EAF   |.  mov byte ptr ds:[eax+7],bl  //31(1)  
00407EB2   |.  mov eax,dword ptr ss:[ebp-4]
00407EB5   |.  xor ebx,ebx
00407EB7   |.  mov bl,byte ptr ds:[eax+8]  //Table第9位"s"
00407EBA   |.  xor ebx,esi
00407EBC   |.  xor ebx,dword ptr ss:[ebp-10]  //ebx=ebx xor [ebp-10] xor esi=7C(|)
00407EBF   |.  lea eax,dword ptr ss:[ebp-4]
00407EC2   |.  call NAG-RAR.004039B8
00407EC7   |.  mov byte ptr ds:[eax+8],bl  //7C(|)
00407ECA   |.  mov eax,dword ptr ss:[ebp-4]
00407ECD   |.  xor ebx,ebx
00407ECF   |.  mov bl,byte ptr ds:[eax+9]  //Table第10位"Y"
00407ED2   |.  xor ebx,esi
00407ED4   |.  xor ebx,dword ptr ss:[ebp-C]  //ebx=ebx xor [ebp-C] xor esi=58(X)
00407ED7   |.  lea eax,dword ptr ss:[ebp-4]
00407EDA   |.  call NAG-RAR.004039B8
00407EDF   |.  mov byte ptr ds:[eax+9],bl  //58(X)
00407EE2   |.  mov eax,dword ptr ss:[ebp-4]
00407EE5   |.  xor ebx,ebx
00407EE7   |.  mov bl,byte ptr ds:[eax+A]  //Table第11位"9"
00407EEA   |.  xor ebx,esi
00407EEC   |.  xor ebx,dword ptr ss:[ebp-14]  //ebx=ebx xor [ebp-14] xor esi=35(5)
00407EEF   |.  lea eax,dword ptr ss:[ebp-4]
00407EF2   |.  call NAG-RAR.004039B8
00407EF7   |.  mov byte ptr ds:[eax+A],bl  //35(5)
00407EFA   |.  mov eax,dword ptr ss:[ebp-4]
00407EFD   |.  xor ebx,ebx
00407EFF   |.  mov bl,byte ptr ds:[eax+B]  //Table第12位"d"
00407F02   |.  xor ebx,esi
00407F04   |.  xor ebx,dword ptr ss:[ebp-10]  //ebx=ebx xor [ebp-10] xor esi=6B(k)
00407F07   |.  lea eax,dword ptr ss:[ebp-4]
00407F0A   |.  call NAG-RAR.004039B8
00407F0F   |.  mov byte ptr ds:[eax+B],bl  //6B(k)
00407F12   |.  mov eax,dword ptr ss:[ebp-4]
00407F15   |.  xor ebx,ebx
00407F17   |.  mov bl,byte ptr ds:[eax+C]  //Table第13位"1"
00407F1A   |.  xor ebx,esi
00407F1C   |.  xor ebx,dword ptr ss:[ebp-C]  //ebx=ebx xor [ebp-C] xor esi=30(0)
00407F1F   |.  lea eax,dword ptr ss:[ebp-4]
00407F22   |.  call NAG-RAR.004039B8
00407F27   |.  mov byte ptr ds:[eax+C],bl  //30(0)
00407F2A   |.  mov eax,dword ptr ss:[ebp-4]
00407F2D   |.  xor ebx,ebx
00407F2F   |.  mov bl,byte ptr ds:[eax+D]  //Table第14位"9"
00407F32   |.  xor ebx,esi
00407F34   |.  xor ebx,dword ptr ss:[ebp-14]  //ebx=ebx xor [ebp-14] xor esi=35(5)
00407F37   |.  lea eax,dword ptr ss:[ebp-4]
00407F3A   |.  call NAG-RAR.004039B8
00407F3F   |.  mov byte ptr ds:[eax+D],bl  //35(5)
00407F42   |.  mov eax,dword ptr ss:[ebp-4]
00407F45   |.  xor ebx,ebx
00407F47   |.  mov bl,byte ptr ds:[eax+E]  //Table第15位"x"
00407F4A   |.  xor ebx,esi
00407F4C   |.  xor ebx,dword ptr ss:[ebp-10]  //ebx=ebx xor [ebp-10] xor esi=77(w)
00407F4F   |.  lea eax,dword ptr ss:[ebp-4]
00407F52   |.  call NAG-RAR.004039B8
00407F57   |.  mov byte ptr ds:[eax+E],bl

00407F5A   |.  xor edx,edx
00407F5C   |.  mov eax,1
00407F61   |>  /mov ecx,dword ptr ss:[ebp-4]  //把字符串"`44muYh1|X5k05w"各字符的ASCUII值累加并存进edx
00407F64   |.  |movzx ecx,byte ptr ds:[ecx+eax-1]
00407F69   |.  |add edx,ecx
00407F6B   |.  |inc eax
00407F6C   |.  |cmp eax,0A
00407F6F   |.^ \jnz short NAG-RAR.00407F61

00407F71   |.  cmp edx,324
//如果累加后的值等于324(十进制804),则"`44muYh1|X5k05w"为密码。在这里,由于我们的试练码不是正确的Serial,所以"`44muYh1|X5k05w"并不是正确的密码。y5J4NSnS6则是一组可行的序列号,你可以试试看它对应的密码是什么。
      
00407F77   |.  jnz short NAG-RAR.00407FA4
00407F79   |.  lea eax,dword ptr ss:[ebp-18]
00407F7C   |.  mov ecx,dword ptr ss:[ebp-4]
00407F7F   |.  mov edx,NAG-RAR.00408014            ;  ASCII "Password is: "
00407F84   |.  call NAG-RAR.00403870
00407F89   |.  mov eax,dword ptr ss:[ebp-18]
00407F8C   |.  call NAG-RAR.00403968
00407F91   |.  push eax                            ; /Text
00407F92   |.  push 0BB9                           ; |ControlID = BB9 (3001.)
00407F97   |.  mov eax,dword ptr ds:[40A850]       ; |
00407F9C   |.  push eax                            ; |hWnd
00407F9D   |.  call <jmp.&user32.SetDlgItemTextA>  ; \SetDlgItemTextA

==========================================================


附带VB注册机源码
=================================================
[NAG-RAR - by Ap0x] Key Generator 注册机源码_VB
=================================================

Option Base 1

Private Function KeyGen()

    Dim strSerialTemp(16) As String
    Dim lngEbp_C, lngEbp_14, lngEbp_10 As Long
    Dim lngEsi, lngPassword(16), Value As Long
    Dim i, j As Integer
    Dim Table, strTableChar, Table_MyOwn As String
    Dim flag As Boolean
   
    '原程序NAG-RAR所用的表
    Table = "a55ayUg>sY9d19x"

    '自定义表,随机生成的用于试验的序列号
    Table_MyOwn = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
    
        
    
        Do
            For i = 1 To 9
                Randomize
                j = Int((62 * Rnd) + 1)     '62是自定义表的长度
                strSerialTemp(i) = Mid(Table_MyOwn, j, 1)
            Next i
       
            lngEbp_C = Asc(strSerialTemp(1)) Xor Asc(strSerialTemp(4)) Xor Asc(strSerialTemp(7))
            lngEbp_14 = Asc(strSerialTemp(2)) Xor Asc(strSerialTemp(5)) Xor Asc(strSerialTemp(8))
            lngEbp_10 = Asc(strSerialTemp(3)) Xor Asc(strSerialTemp(6)) Xor Asc(strSerialTemp(9))
    
            lngEsi = (lngEbp_C Xor lngEbp_14 Xor lngEbp_10) + 2
    
            For i = 1 To 3
    
                strTableChar = Mid(Table, i, 1)
                lngPassword(i) = GetChar(strTableChar, lngEsi, lngEbp_C)
            Next i
    
            For i = 4 To 6
    
                strTableChar = Mid(Table, i, 1)
                lngPassword(i) = GetChar(strTableChar, lngEsi, lngEbp_14)
            Next i
    
            For i = 7 To 9

                strTableChar = Mid(Table, i, 1)
                lngPassword(i) = GetChar(strTableChar, lngEsi, lngEbp_10)
            Next i
    
            strTableChar = "Y"
            lngPassword(10) = GetChar(strTableChar, lngEsi, lngEbp_C)
    
            strTableChar = "9"
            lngPassword(11) = GetChar(strTableChar, lngEsi, lngEbp_14)
    
            strTableChar = "d"
            lngPassword(12) = GetChar(strTableChar, lngEsi, lngEbp_10)
    
            strTableChar = "1"
            lngPassword(13) = GetChar(strTableChar, lngEsi, lngEbp_C)
    
            strTableChar = "9"
            lngPassword(14) = GetChar(strTableChar, lngEsi, lngEbp_14)
    
            strTableChar = "x"
            lngPassword(15) = GetChar(strTableChar, lngEsi, lngEbp_10)
                  
            Value = 0
            For i = 1 To 9
                Value = Value + lngPassword(i)
            Next i
    
            flag = False
    
            If Value = 804 Then     '804(324h)
                flag = True
                txtSerial.Text = ""
                
                For i = 1 To 9
                    txtSerial.Text = txtSerial.Text + strSerialTemp(i)
                Next i
                
                txtPassword.Text = ""
                For i = 1 To 15
                    txtPassword.Text = txtPassword.Text + Chr(lngPassword(i))
                Next i

            End If
        
        Loop Until flag = True
    
End Function

Private Function GetChar(ByVal TableChar As String, ByVal Esi As Long, ByVal Ebp As Long) As Long
    
    GetChar = Asc(TableChar) Xor Esi Xor Ebp
    
End Function

========================================================================================
【注册机】
本地下载:key.rar
========================================================================================
【分析总结】

这个CrackMe没什么难度,适合像我这样的初学者。
==========================================================

 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 myfaq.com.cn All rights reserved. www.myfaq.com.cn 版权所有