首页
社区
课程
招聘
[原创]对一个CrackMe的分析
2005-10-14 23:08 6347

[原创]对一个CrackMe的分析

2005-10-14 23:08
6347
【破文标题】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没什么难度,适合像我这样的初学者。
==========================================================
【版权信息】本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
                                                  2005-10-13]

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞7
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回