作品发布     邀请码    设为首页  收藏 

当前位置:文章免杀 → 文章内容 >> TrayIcon Pro V2.1.251注册算法分析


TrayIcon Pro V2.1.251注册算法分析

更新时间:2010-12-15 6:03:40   作者:佚名  来源:不详
文/图 zjjtr
TrayIcon Pro是一款系统托盘管理软件,可以让你迅速快捷的从系统托盘中运行最喜爱的程序和文件夹。它是一款共享软件,必须注册才能使用其全部功能。下面我们就对 TrayIcon Pro V2.1.251进行一次注册算法分析。
首先用PEiD查壳后,发现无壳,使用Microsoft Visual C++ 5.0编写。随意注册一下,弹出了错误提示,如图1所示。
javascript:dcs.images.doResizes(this,0,null); border=0>
用OD载入,查找错误提示的ASCII码,没有找到有用的信息,看来只能直接动态调试了。F9运行,输入用户名zjjtr,注册码12345678,由于是VC编写的,我一开始下断点MessageBoxA没有成功,后来想到了下万能断点,程序果然断在了77D3352D处,并且寄存器中出现了我们的注册码,看样子形势一片大好。F2取消断点,直接Alt+F9回到程序领空。

00421B42  |.  8B4D 10 MOV ECX,DWORD PTR SS:[EBP+10] ;回到这里
00421B45  |.  6A FF  PUSH -1
00421B47  |.  E8 13D5FFFF   CALL trayicon.0041F05F
00421B4C  |.  EB 0B  JMP SHORT trayicon.00421B59

这里是被调用的地方,先不管它,一路F8,经过3个ret后,回到最初的call,来到408DEB处。我们一直往前看,直到找到第一个ret,这里就应该是算法的开始了。在00408DBA处按F2下断点,重新载入程序,点击注册后在00408DBA处就断了下来,然后一路F8,单步跟踪。
00408DBA .  B8 B07C4200 MOV EAX,trayicon.00427CB0
00408DBF .  E8 4C2C0000 CALL trayicon.0040BA10
00408DC4 .  83EC 60 SUB ESP,60
00408DC7 .  56 PUSH ESI
00408DC8 .  8BF1 MOV ESI,ECX
00408DCA .  8D4D EC LEA ECX,DWORD PTR SS:[EBP-14]
00408DCD .  E8 595D0100 CALL trayicon.0041EB2B
00408DD2 .  8365 FC 00  AND DWORD PTR SS:[EBP-4],0
00408DD6 .  8D4D F0 LEA ECX,DWORD PTR SS:[EBP-10]
00408DD9 .  E8 4D5D0100 CALL trayicon.0041EB2B
00408DDE .  6A 01  PUSH 1
00408DE0 .  8BCE MOV ECX,ESI
00408DE2 .  C645 FC 01  MOV BYTE PTR SS:[EBP-4],1
00408DE6 .E8 F84C0100 CALL trayicon.0041DAE3
;获取用户名,压入堆栈
00408DEB .  FF76 5C PUSH DWORD PTR DS:[ESI+5C]
;来到这里,往前看
00408DEE .  8D45 94 LEA EAX,DWORD PTR SS:[EBP-6C]
00408DF1 .  50 PUSH EAX
00408DF2 .  E8 49310000 CALL trayicon.0040BF40
00408DF7 .  59 POP ECX
00408DF8 .  8D45 C0 LEA EAX,DWORD PTR SS:[EBP-40]
00408DFB .  59 POP ECX
00408DFC .  FF76 60 PUSH DWORD PTR DS:[ESI+60]
;注册码压入堆栈
00408DFF .  50 PUSH EAX
00408E00 .  E8 3B310000 CALL trayicon.0040BF40
00408E05 .  59 POP ECX
00408E06 .  8D45 C0 LEA EAX,DWORD PTR SS:[EBP-40]
00408E09 .  59 POP ECX
00408E0A .  50 PUSH EAX
00408E0B .  8D45 94 LEA EAX,DWORD PTR SS:[EBP-6C]
00408E0E .  50 PUSH EAX
00408E0F . E8 D88DFFFF CALL trayicon.00401BEC
;关键call,F7跟入
00408E14 .  59 POP ECX
00408E15 .  85C0 TEST EAX,EAX
00408E17 .  59 POP ECX
00408E18  74 5D  JE SHORT trayicon.00408E77
;EAX设为标志位,为0注册失败,这里可以爆破,但是每次启动都要注册
00408E1A .  57 PUSH EDI
00408E1B .  53 PUSH EBX
00408E1C .  E8 DACB0100 CALL trayicon.004259FB
00408E21 .  FF76 5C PUSH DWORD PTR DS:[ESI+5C]; /Arg3
00408E24 .  8B58 04 MOV EBX,DWORD PTR DS:[EAX+4]; |
00408E27 .  BF 1C414300 MOV EDI,trayicon.0043411C; |options
00408E2C .  8BCB MOV ECX,EBX; |
00408E2E .  68 24414300 PUSH trayicon.00434124; |username
00408E33 .  57 PUSH EDI; |Arg1 => 0043411C ASCII "Options"
00408E34 .  E8 EE8B0100 CALL trayicon.00421A27; \trayicon.00421A27
00408E39 .  FF76 60 PUSH DWORD PTR DS:[ESI+60]; /Arg3
00408E3C .  8BCB MOV ECX,EBX; |
00408E3E .  68 24444300 PUSH trayicon.00434424; |code
00408E43 .  57 PUSH EDI; |Arg1
00408E44 .  E8 DE8B0100 CALL trayicon.00421A27; \trayicon.00421A27
00408E49 .  8325 688D4300>AND DWORD PTR DS:[438D68],0
00408E50 .  68 C4494300 PUSH trayicon.004349C4;rtmsgtitle
00408E55 .  6A 40  PUSH 40
00408E57 .  68 BC494300 PUSH trayicon.004349BC;rtmsg1
00408E5C .  68 788C4300 PUSH trayicon.00438C78
00408E61 .  C705 D08D4300>MOV DWORD PTR DS:[438DD0],1
00408E6B .  E8 2A090000 CALL trayicon.0040979A
00408E70 .  83C4 10 ADD ESP,10
00408E73 .  5B POP EBX
00408E74 .  5F POP EDI
00408E75 .  EB 19  JMP SHORT trayicon.00408E90
00408E77 >  68 C4494300 PUSH trayicon.004349C4;rtmsgtitle
00408E7C .  6A 10  PUSH 10
00408E7E .  68 B4494300 PUSH trayicon.004349B4;rtmsg2
00408E83 .  68 788C4300 PUSH trayicon.00438C78
00408E88 .  E8 0D090000 CALL trayicon.0040979A
00408E8D .  83C4 10 ADD ESP,10
00408E90 >  8BCE MOV ECX,ESI
00408E92 .  E8 A9230100 CALL trayicon.0041B240;出错的地方
00408E97 .  8065 FC 00  AND BYTE PTR SS:[EBP-4],0
00408E9B .  8D4D F0 LEA ECX,DWORD PTR SS:[EBP-10]
00408E9E .  E8 D35D0100 CALL trayicon.0041EC76
00408EA3 .  834D FC FF  OR DWORD PTR SS:[EBP-4],FFFFFFFF
00408EA7 .  8D4D EC LEA ECX,DWORD PTR SS:[EBP-14]
00408EAA .  E8 C75D0100 CALL trayicon.0041EC76
00408EAF .  8B4D F4 MOV ECX,DWORD PTR SS:[EBP-C]
00408EB2 .  5E POP ESI
00408EB3 .  64:890D 00000>MOV DWORD PTR FS:[0],ECX
00408EBA .  C9 LEAVE

原来程序用了标识位,怪不得爆破不了,看来只能继续分析算法了。00408E0F处的call是个关键的地方,EAX是标志位,为0则注册失败,我们F7跟入00408E0F处的call,来到这里。
00401BEC  /$  55 PUSH EBP
00401BED  |.  8BEC MOV EBP,ESP
00401BEF  |.  81EC 14010000 SUB ESP,114
00401BF5  |.  53 PUSH EBX
00401BF6  |.  56 PUSH ESI
00401BF7  |.  8B75 08 MOV ESI,DWORD PTR SS:[EBP+8];用户名进ESI
00401BFA  |.  57 PUSH EDI
00401BFB  |.  BF 508B4300 MOV EDI,trayicon.00438B50
00401C00  |.  33DB XOR EBX,EBX
00401C02  |.  57 PUSH EDI
00401C03  |.  56 PUSH ESI
00401C04  |.  895D F0 MOV DWORD PTR SS:[EBP-10],EBX
00401C07  |.  E8 742E0100 CALL trayicon.00414A80
00401C0C  |.  59 POP ECX
00401C0D  85C0 TEST EAX,EAX;用户名是否为空
00401C0F  |.  59 POP ECX
00401C10  |.  0F84 EF000000 JE trayicon.00401D05
00401C16  |.  57 PUSH EDI
00401C17  |.  FF75 0C PUSH DWORD PTR SS:[EBP+C]
00401C1A  |.  E8 612E0100 CALL trayicon.00414A80
00401C1F  |.  59 POP ECX
00401C20 85C0 TEST EAX,EAX;注册码是否为空
00401C22  |.  59 POP ECX
00401C23  |.  0F84 DC000000 JE trayicon.00401D05
00401C29  |.  56 PUSH ESI
00401C2A  |.  E8 91A00000 CALL trayicon.0040BCC0;用户名小写变大写
00401C2F  |.  59 POP ECX
00401C30  |.  895D F4 MOV DWORD PTR SS:[EBP-C],EBX
00401C33  |.  56 PUSH ESI
00401C34  |.  895D F8 MOV DWORD PTR SS:[EBP-8],EBX
00401C37  |.  895D FC MOV DWORD PTR SS:[EBP-4],EBX
00401C3A  |.  E8 01A00000 CALL trayicon.0040BC40;用户名长度进EAX

这段代码针对用户名进行了相应处理。准备工作做好后,算法就开始了。

00401C3F  |.  59 POP ECX
00401C40  |.  33C9 XOR ECX,ECX
00401C42  |.  3BC3 CMP EAX,EBX
00401C44  |.  7E 0E  JLE SHORT trayicon.00401C54
00401C46  |>  8A1431  /MOV DL,BYTE PTR DS:[ECX+ESI];取每一位
00401C49  |.  83E2 7F |AND EDX,7F
00401C4C  |.  0155 F8 |ADD DWORD PTR SS:[EBP-8],EDX;加到[EBP-8]中
00401C4F  |.  41 |INC ECX
00401C50  |.  3BC8 |CMP ECX,EAX
00401C52  |.^ 7C F2  \JL SHORT trayicon.00401C46

很明显,这里的循环是对转化后的用户名的ASCII码求和,之后进入DWORD PTR SS:[EBP-8]。

00401C54  |>  FF75 F8 PUSH DWORD PTR SS:[EBP-8]; /<%d>
00401C57  |.  8B35 C8944200 MOV ESI,DWORD PTR DS:[<&USER32.wsprintfA>; |USER32.wsprintfA
00401C5D  |.  BB 44424300 MOV EBX,trayicon.00434244;|%d
00401C62  |.  8D85 ECFEFFFF LEA EAX,DWORD PTR SS:[EBP-114]; |
00401C68  |.  53 PUSH EBX;|Format => "%d"
00401C69  |.  50 PUSH EAX; |s
00401C6A  |.  FFD6 CALL ESI;十六进制变成十进制
00401C6C  |.  83C4 0C ADD ESP,0C;在信息窗口看到ASCII 404

这里虽然调用了系统函数,仔细观察后发现就是十六进制变成十进制,接着看下去。

00401C6F  |>  8D85 ECFEFFFF /LEA EAX,DWORD PTR SS:[EBP-114]
00401C75  |.  50 |PUSH EAX
00401C76  |.  E8 C59F0000 |CALL trayicon.0040BC40
00401C7B  |.  33FF |XOR EDI,EDI
00401C7D  |.  59 |POP ECX
00401C7E  |.  85C0 |TEST EAX,EAX
00401C80  |.  8945 EC |MOV DWORD PTR SS:[EBP-14],EAX
00401C83  |.  7C 2A  |JL SHORT trayicon.00401CAF
00401C85  |>  0FBE843D ECFE>|/MOVSX EAX,BYTE PTR SS:[EBP+EDI-114]
00401C8D  |.  50 ||PUSH EAX
00401C8E  |.  8D45 08 ||LEA EAX,DWORD PTR SS:[EBP+8]
00401C91  |.  68 40424300 ||PUSH trayicon.00434240
00401C96  |.  50 ||PUSH EAX
00401C97  |.  FFD6 ||CALL ESI
00401C99  |.  83C4 0C ||ADD ESP,0C
00401C9C  |.  8D45 08 ||LEA EAX,DWORD PTR SS:[EBP+8]
00401C9F  |.  50 ||PUSH EAX
00401CA0  |.  E8 8B9F0000 ||CALL trayicon.0040BC30  
00401Cyesmybi.com  |.  0145 FC ||ADD DWORD PTR SS:[EBP-4],EAX;加到[EBP-4]中,
00401CA8  |.  47 ||INC EDI
00401CA9  |.  3B7D EC ||CMP EDI,DWORD PTR SS:[EBP-14]
00401CAC  |.  59 ||POP ECX
00401CAD  |.^ 7E D6  |\JLE SHORT trayicon.00401C85

从00401C85到00401CAD的循环计算从00401C6A得到的数404的各位上的和。

00401CAF  |>  FF75 FC |PUSH DWORD PTR SS:[EBP-4]
00401CB2  |.  8D85 ECFEFFFF |LEA EAX,DWORD PTR SS:[EBP-114]
00401CB8  |.  53 |PUSH EBX
00401CB9  |.  50 |PUSH EAX
00401CBA  |.  FFD6 |CALL ESI
00401CBC  |.  83C4 0C |ADD ESP,0C
00401CBF  |.  8D85 ECFEFFFF |LEA EAX,DWORD PTR SS:[EBP-114]
00401CC5  |.  50 |PUSH EAX
00401CC6  |.  E8 759F0000 |CALL trayicon.0040BC40
00401CCB  |.  59 |POP ECX
00401CCC  |.  6A 01  |PUSH 1
00401CCE  |.  59 |POP ECX
00401CCF  |.  3BC1 |CMP EAX,ECX
00401CD1  |.  75 05  |JNZ SHORT trayicon.00401CD8
00401CD3  |.  894D F4 |MOV DWORD PTR SS:[EBP-C],ECX
00401CD6  |.  EB 04  |JMP SHORT trayicon.00401CDC
00401CD8  |>  8365 FC 00  |AND DWORD PTR SS:[EBP-4],0
00401CDC  |>  837D F4 00  |CMP DWORD PTR SS:[EBP-C],0
00401CE0  |.^ 74 8D  \JE SHORT trayicon.00401C6F
;若上面的和大于一位数,跳回去接着算它各位上的和,直到这个和为一位数为止

稍微总结一下,从00401C6F到00401CE0这一段看似复杂,循环中套着循环,00401C97处调用系统函数将整数转为字符,又从字符转为整数,看得迷迷糊糊的,但是耐心跟踪,还是看出了算法,就是不断求各位上的和,直到结果是一位数为止。接下来又是什么呢,继续往下看。

00401CE2  |.  FF75 0C PUSH DWORD PTR SS:[EBP+C]
00401CE5  |.  E8 469F0000 CALL trayicon.0040BC30
00401CEA  |.  59 POP ECX
00401CEB  |.  8B4D F8  MOV ECX,DWORD PTR SS:[EBP-8]
;ECX存入用户名ASCII码和
00401CEE  |.  0FAF4D FC  IMUL ECX,DWORD PTR SS:[EBP-4]
;ECX=ECX*上面循环所得的数
00401CF2  41 INC ECX;ECX=ECX+1
00401CF3  |.  0FAF4D FC IMUL ECX,DWORD PTR SS:[EBP-4]
;ECX=ECX*上面循环所得的数
00401CF7  |.  034D F8 ADD ECX,DWORD PTR SS:[EBP-8]
;ECX=ECX+用户名ASCII码和,即是注册码
00401CFA  3BC8 CMP ECX,EAX
;真假码比较,相等EAX赋1,不等赋0
00401CFC  |.  75 07  JNZ SHORT trayicon.00401D05
00401CFE  |.  C745 F0 01000>MOV DWORD PTR SS:[EBP-10],1
00401D05  |>  8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
00401D08  |.  5F POP EDI
00401D09  |.  5E POP ESI
00401D0A  |.  5B POP EBX
00401D0B  |.  C9 LEAVE

算法分析至此就算结束了,总体来说较简单,只要耐着性子就能分析出来,下面对算法进行一下总结。用户名变成大写,求ASCII码和记为S1,求各位的和直到成为一位数,记为S2,注册码=(S1*S2+1)*S2+S1。最后我用“zjjtr”和“26268”注册成功,如图2所示。下面是我用VB写的一个注册机的部分关键代码。
javascript:dcs.images.doResizes(this,0,null); border=0>

Private Sub Command1_Click()
a = UCase(Text1.Text) ‘转化为大写
For i = 1 To Len(a)
b = b + Asc(Mid(a, i, 1))
Next I ‘求ASCII码和
d = 11
c = b
Do While (d >= 10) ‘不是一位数继续循环
Do While (c > 0)
e = e + c Mod 10
c = Int(c \ 10)
Loop ‘各位数字之和
d = e
c = d
e = 0
Loop  
Text2.Text = (b * d + 1) * d + b
End Sub

总的来说,这款软件的算法不是很难,而且出现了明码,即使不太懂算法也能找到注册码,就是没找到也能爆破。这样的保护实在是太弱了,软件安全仍是任重而道远啊

责任编辑:华中帝国        



本文引用网址: 

TrayIcon Pro V2.1.251注册算法分析的相关文章
发表评论

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

         (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码