- UID
- 42004
注册时间2007-12-19
阅读权限8
最后登录1970-1-1
初入江湖
该用户从未签到
|
发表于 2007-12-22 18:12:45
|
显示全部楼层
分析pyg程序算法
调试工具:Ollydbg 1.10
输入用户名:swzyzl0
密码:6A5432
主程序
断点:
00401624 . C64424 28 00 MOV BYTE PTR SS:[ESP+28],0 ; |
00401629 . E8 62000000 CALL pyg.00401690 ; \pyg.00401690(关键,进入)
0040162E . 84C0 TEST AL,AL
00401630 74 19 JNE SHORT pyg.0040164B ;跳到错误对话框(爆破点)
00401632 . 6A 69 PUSH 69 ; /Arg1 = 00000069
00401634 . 8D4C24 10 LEA ECX,DWORD PTR SS:[ESP+10] ; |
00401638 . E8 71850100 CALL pyg.00419BAE ; \pyg.00419BAE(弹出正确对话框)
CALL pyg.00401690
00401690 /$ 6A FF PUSH -1
00401692 |. 68 00054200 PUSH pyg.00420500 ; SE 处理程序安装
00401697 |. 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
0040169D |. 50 PUSH EAX
0040169E |. 64:8925 00000>MOV DWORD PTR FS:[0],ESP
004016A5 |. 83EC 08 SUB ESP,8
004016A8 |. 53 PUSH EBX
004016A9 |. 56 PUSH ESI
004016AA |. 57 PUSH EDI
004016AB |. 8BF9 MOV EDI,ECX
004016AD |. 8B4424 24 MOV EAX,DWORD PTR SS:[ESP+24] ; 用户名移到EAX
004016B1 |. 66:8B4F 68 MOV CX,WORD PTR DS:[EDI+68] ;0050
004016B5 |. 66:8B57 6A MOV DX,WORD PTR DS:[EDI+6A] ;0059
004016B9 |. 66:894C24 0C MOV WORD PTR SS:[ESP+C],CX
004016BE |. 8B70 F8 MOV ESI,DWORD PTR DS:[EAX-8] ; 用户名长度
004016C1 |. 66:8B47 6C MOV AX,WORD PTR DS:[EDI+6C] ;0047
004016C5 |. 33C9 XOR ECX,ECX ; ECX清零
004016C7 |. C74424 1C 010>MOV DWORD PTR SS:[ESP+1C],1
004016CF |. 85F6 TEST ESI,ESI ; 测试用户名长度是否为零
004016D1 |. 66:895424 0E MOV WORD PTR SS:[ESP+E],DX
004016D6 |. 66:894424 10 MOV WORD PTR SS:[ESP+10],AX
004016DB |. 7E 23 JLE SHORT pyg.00401700
004016DD |. 55 PUSH EBP
;以下为处理用户名的循环
004016DE |> 8B5424 28 /MOV EDX,DWORD PTR SS:[ESP+28] ; 用户名移到EDX
004016E2 |. 8BC1 |MOV EAX,ECX ;执行循环次数入EAX中
004016E4 |. BD 03000000 |MOV EBP,3
004016E9 |. 8A1C11 |MOV BL,BYTE PTR DS:[ECX+EDX] ; 取用户名第ECX位到BL中
004016EC |. 99 |CDQ ;EAX的内容符号扩展到EDX中
004016ED |. F7FD |IDIV EBP ;(EDX、EAX)/EBP 商入EAX,余数入EDX
004016EF |. 8D4454 10 |LEA EAX,DWORD PTR SS:[ESP+EDX*2+10] ;0012F8B4(值为:00590050)
004016F3 |. 66:0FBED3 |MOVSX DX,BL
004016F7 |. 66:0110 |ADD WORD PTR DS:[EAX],DX ;将用户名第ECX位用户名ASCII码值与 WORD PTR DS:[EAX]处值相加
004016FA |. 41 |INC ECX ;循环次数加1
004016FB |. 3BCE |CMP ECX,ESI ; 用户名处理完了吗?
004016FD |.^ 7C DF \JL SHORT pyg.004016DE ;没有处理完跳到00401DE处
;以上对用户名进行变码,存在WORD PTR DS:[EAX]处,以待备用
;对用户名的变码过程就是:用户名第1、4、7…………位的ASCII值相加,再加上50,值存入地址0012F8B4中;用户名第2、5……位的ASCII值相加,再加上59,值存入地址0012F8B6中;用户名3、6……位的ASCII值相加,再加上47,值存入地址0012F8B8中。
004016FF |. 5D POP EBP
00401700 |> 8B4424 28 MOV EAX,DWORD PTR SS:[ESP+28] ; 密码移EAX中
00401704 |. 8378 F8 06 CMP DWORD PTR DS:[EAX-8],6 ; 密码长度是否等于6
00401708 |. 74 35 JE SHORT pyg.0040173F
0040170A |> 8D4C24 24 LEA ECX,DWORD PTR SS:[ESP+24] ; 用户名地址入ECX
0040170E |. C64424 1C 00 MOV BYTE PTR SS:[ESP+1C],0
00401713 |. E8 4E540100 CALL pyg.00416B66
00401718 |. 8D4C24 28 LEA ECX,DWORD PTR SS:[ESP+28] ; 密码地地址入ECX
0040171C |. C74424 1C FFF>MOV DWORD PTR SS:[ESP+1C],-1
00401724 |. E8 3D540100 CALL pyg.00416B66
00401729 |. 5F POP EDI
0040172A |. 5E POP ESI
0040172B |. 32C0 XOR AL,AL ;AL清零,这也是在主程序下判断的依据
0040172D |. 5B POP EBX
0040172E |. 8B4C24 08 MOV ECX,DWORD PTR SS:[ESP+8]
00401732 |. 64:890D 00000>MOV DWORD PTR FS:[0],ECX
00401739 |. 83C4 14 ADD ESP,14
0040173C |. C2 0800 RETN 8
0040173F |> 33F6 XOR ESI,ESI ; ESI清零
00401741 |. 8D5C24 0C LEA EBX,DWORD PTR SS:[ESP+C] ;地址:0012F8B4(此地址对应内容来自用户名变法)
00401745 |> 56 /PUSH ESI
00401746 |. 8BCF |MOV ECX,EDI
00401748 |. E8 63000000 |CALL pyg.004017B0 ;此对用户输入的密码进行变换,值返回在EAX(关键,跟入)
0040174D |. 0FBF0B |MOVSX ECX,WORD PTR DS:[EBX] ;将0012F8B4处的内容移到ECX
00401750 |. 81E1 FF000080 |AND ECX,800000FF ;保留符号位和后8位
00401756 |. 79 08 |JNS SHORT pyg.00401760 ;结果为正跳
00401758 |. 49 |DEC ECX
00401759 |. 81C9 00FFFFFF |OR ECX,FFFFFF00
0040175F |. 41 |INC ECX
00401760 |> 0FBFD0 |MOVSX EDX,AX ;将用户输入的密码变换完后的值移到EDX
00401763 |. 3BCA |CMP ECX,EDX ;将用“用户名”变换后的值与用户输入密码变换后的值比较,即(第一次比较:用户名1、4、7…位加50值与用户输入的密码前两位变换后的值比较)
00401765 |.^ 75 A3 |JNZ SHORT pyg.0040170A ;如果第一次比较就错,不再进行比较,跳走,继而返回
00401767 |. 46 |INC ESI
00401768 |. 83C3 02 |ADD EBX,2 ;EBX加2,以使指针指向下一密码地址处
0040176B |. 83FE 03 |CMP ESI,3 ;比较3次
0040176E |.^ 7C D5 \JL SHORT pyg.00401745 ;如果没有比较完接着跳到00401745处
00401770 |. 8D4C24 24 LEA ECX,DWORD PTR SS:[ESP+24]
00401774 |. C64424 1C 00 MOV BYTE PTR SS:[ESP+1C],0
00401779 |. E8 E8530100 CALL pyg.00416B66
0040177E |. 8D4C24 28 LEA ECX,DWORD PTR SS:[ESP+28]
00401782 |. C74424 1C FFF>MOV DWORD PTR SS:[ESP+1C],-1
0040178A |. E8 D7530100 CALL pyg.00416B66
0040178F |. 8B4C24 14 MOV ECX,DWORD PTR SS:[ESP+14]
00401793 |. 5F POP EDI
00401794 |. 5E POP ESI
00401795 |. B0 01 MOV AL,1
00401797 |. 5B POP EBX
00401798 |. 64:890D 00000>MOV DWORD PTR FS:[0],ECX
0040179F |. 83C4 14 ADD ESP,14
004017A2 \. C2 0800 RETN 8
|CALL pyg.004017B0
004017B0 /$ 8B41 60 MOV EAX,DWORD PTR DS:[ECX+60] ; 密码移到EAX
004017B3 |. 8B4C24 04 MOV ECX,DWORD PTR SS:[ESP+4]
004017B7 |. 8D0448 LEA EAX,DWORD PTR DS:[EAX+ECX*2]
004017BA |. 0FBE08 MOVSX ECX,BYTE PTR DS:[EAX] ; 密码第ECX*2位扩展到ECX
004017BD |. 0FBE40 01 MOVSX EAX,BYTE PTR DS:[EAX+1] ; 密码第ECX*2+1位到EAX
004017C1 |. 83F9 30 CMP ECX,30
004017C4 |. 7C 0A JL SHORT pyg.004017D0 ;小于数字0则跳
004017C6 |. 83F9 39 CMP ECX,39
004017C9 |. 7F 05 JG SHORT pyg.004017D0 ;大于数学9则跳
004017CB |. 83E9 30 SUB ECX,30 ;如果是数字0-9,则ASCII码值减30
004017CE |. EB 0D JMP SHORT pyg.004017DD
004017D0 |> 83F9 41 CMP ECX,41
004017D3 |. 7C 32 JL SHORT pyg.00401807 ;小于A则跳
004017D5 |. 83F9 5A CMP ECX,5A
004017D8 |. 7F 2D JG SHORT pyg.00401807 ;大于Z则跳
004017DA |. 83E9 37 SUB ECX,37 ;如果是A—Z则ASCII值减37
004017DD |> 83F8 30 CMP EAX,30 ;比较密码第ECX*2+1位与数字0
004017E0 |. 7C 10 JL SHORT pyg.004017F2
004017E2 |. 83F8 39 CMP EAX,39
004017E5 |. 7F 0B JG SHORT pyg.004017F2
004017E7 |. 83E8 30 SUB EAX,30
004017EA |. C1E0 04 SHL EAX,4 ;逻辑左移4位
004017ED |. 0BC1 OR EAX,ECX ;密码第ECX*2+1位或ECX*2位值
004017EF |. C2 0400 RETN 4
004017F2 |> 83F8 41 CMP EAX,41
004017F5 |. 7C 10 JL SHORT pyg.00401807
004017F7 |. 83F8 5A CMP EAX,5A
004017FA |. 7F 0B JG SHORT pyg.00401807
004017FC |. 83E8 37 SUB EAX,37
004017FF |. C1E0 04 SHL EAX,4
00401802 |. 0BC1 OR EAX,ECX
00401804 |. C2 0400 RETN 4
00401807 |> 66:33C0 XOR AX,AX
0040180A \. C2 0400 RETN 4
此函数功能:1、保证用户输入的密码为数字0—9,A—Z
2、将用户输入的密码值1、2位互换,3、4位互换,5、6位互换
整体思路:1、此密码(注册码)是利用用户名经过某种变化而来
2、对用户输入的密码(注册码)进入变化
3、F1(用户名)=F2(密码)
用户名:swzyzl0
注册码:C6A4D2
[ 本帖最后由 E之郎 于 2007-12-22 18:18 编辑 ] |
|