-
-
[原创]对一个CrackMe的分析
-
发表于: 2005-10-14 23:08 6694
-
【破文标题】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]
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
- [分享]一个开源的keygenme 10227
- [原创]uCF2000 keygenme 1.0分析 8187
- [原创]bundy's keygenme #1分析 6529