用户名:swzyzl0
注册码:C6A4D2
分析pyg程序算法
调试工具:Ollydbg 1.10输入用户名:swzyzl0
密码:6A5432
主程序
断点:
00401624 .C64424 28 00MOV BYTE PTR SS:,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: ; |
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:
0040169D|.50 PUSH EAX
0040169E|.64:8925 00000>MOV DWORD PTR FS:,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: ;用户名移到EAX
004016B1|.66:8B4F 68 MOV CX,WORD PTR DS: ;0050
004016B5|.66:8B57 6A MOV DX,WORD PTR DS:;0059
004016B9|.66:894C24 0CMOV WORD PTR SS:,CX
004016BE|.8B70 F8 MOV ESI,DWORD PTR DS: ;用户名长度
004016C1|.66:8B47 6C MOV AX,WORD PTR DS:;0047
004016C5|.33C9 XOR ECX,ECX ;ECX清零
004016C7|.C74424 1C 010>MOV DWORD PTR SS:,1
004016CF|.85F6 TEST ESI,ESI ;测试用户名长度是否为零
004016D1|.66:895424 0EMOV WORD PTR SS:,DX
004016D6|.66:894424 10MOV WORD PTR SS:,AX
004016DB|.7E 23 JLE SHORT pyg.00401700
004016DD|.55 PUSH EBP
;以下为处理用户名的循环
004016DE|>8B5424 28 /MOV EDX,DWORD PTR SS: ;用户名移到EDX
004016E2|.8BC1 |MOV EAX,ECX ;执行循环次数入EAX中
004016E4|.BD 03000000 |MOV EBP,3
004016E9|.8A1C11 |MOV BL,BYTE PTR DS: ;取用户名第ECX位到BL中
004016EC|.99 |CDQ ;EAX的内容符号扩展到EDX中
004016ED|.F7FD |IDIV EBP ;(EDX、EAX)/EBP商入EAX,余数入EDX
004016EF|.8D4454 10 |LEA EAX,DWORD PTR SS: ;0012F8B4(值为:00590050)
004016F3|.66:0FBED3 |MOVSX DX,BL
004016F7|.66:0110 |ADD WORD PTR DS:,DX ;将用户名第ECX位用户名ASCII码值与 WORD PTR DS:处值相加
004016FA|.41 |INC ECX ;循环次数加1
004016FB|.3BCE |CMP ECX,ESI ;用户名处理完了吗?
004016FD|.^ 7C DF \JL SHORT pyg.004016DE ;没有处理完跳到00401DE处
;以上对用户名进行变码,存在WORD PTR DS:处,以待备用
;对用户名的变码过程就是:用户名第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: ;密码移EAX中
00401704|.8378 F8 06 CMP DWORD PTR DS:,6 ;密码长度是否等于6
00401708|.74 35 JE SHORT pyg.0040173F
0040170A|>8D4C24 24 LEA ECX,DWORD PTR SS: ;用户名地址入ECX
0040170E|.C64424 1C 00MOV BYTE PTR SS:,0
00401713|.E8 4E540100 CALL pyg.00416B66
00401718|.8D4C24 28 LEA ECX,DWORD PTR SS: ;密码地地址入ECX
0040171C|.C74424 1C FFF>MOV DWORD PTR SS:,-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:
00401732|.64:890D 00000>MOV DWORD PTR FS:,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:;地址:0012F8B4(此地址对应内容来自用户名变法)
00401745|>56 /PUSH ESI
00401746|.8BCF |MOV ECX,EDI
00401748|.E8 63000000 |CALL pyg.004017B0 ;此对用户输入的密码进行变换,值返回在EAX(关键,跟入)
0040174D|.0FBF0B |MOVSX ECX,WORD PTR DS:;将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:
00401774|.C64424 1C 00MOV BYTE PTR SS:,0
00401779|.E8 E8530100 CALL pyg.00416B66
0040177E|.8D4C24 28 LEA ECX,DWORD PTR SS:
00401782|.C74424 1C FFF>MOV DWORD PTR SS:,-1
0040178A|.E8 D7530100 CALL pyg.00416B66
0040178F|.8B4C24 14 MOV ECX,DWORD PTR SS:
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:,ECX
0040179F|.83C4 14 ADD ESP,14
004017A2\.C2 0800 RETN 8
|CALL pyg.004017B0
004017B0/$8B41 60 MOV EAX,DWORD PTR DS: ;密码移到EAX
004017B3|.8B4C24 04 MOV ECX,DWORD PTR SS:
004017B7|.8D0448 LEA EAX,DWORD PTR DS:
004017BA|.0FBE08 MOVSX ECX,BYTE PTR DS: ;密码第ECX*2位扩展到ECX
004017BD|.0FBE40 01 MOVSX EAX,BYTE PTR DS: ;密码第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 编辑 ] 楼主厉害的说,学习了 算法总结:将PYG与用户名组合,计算出3组数据,以这3组数据为基础,计算出注册码,固定的6位.过程如下:
1\取 P 的ASCII码 + Name的1\4\7\10...位ASCII的和,记做 A
取 Y 的ASCII码 + Name的2\5\8\11...位ASCII的和,记做 B
取 G 的ASCII码 + Name的3\6\9\12...位ASCII的和,记做 C
2\
SN1为: A andF 的得数,大于 9,就 + 37,将结果转换成字符;小于 9,就 + 30,将结果转换成字符.
SN2为: (A sar4)and F 的得数,大于 9,就 + 37,将结果转换成字符;小于 9,就 + 30,将结果转换成字符.
SN3为: B andF 的得数,大于 9,就 + 37,将结果转换成字符;小于 9,就 + 30,将结果转换成字符.
SN4为: (B sar4)and F 的得数,大于 9,就 + 37,将结果转换成字符;小于 9,就 + 30,将结果转换成字符.
SN5为: C andF 的得数,大于 9,就 + 37,将结果转换成字符;小于 9,就 + 30,将结果转换成字符.
SN6为: (C sar4)and F 的得数,大于 9,就 + 37,将结果转换成字符;小于 9,就 + 30,将结果转换成字符.
(你可以把" B andF " "(C sar4)and F "直接的理解为:取低位的第1\2位) 不懂算法,这个我没有找到注册码/:002 原帖由 剑客之道 于 2007-12-26 21:36 发表 https://www.chinapyg.com/images/common/back.gif
不懂算法,这个我没有找到注册码/:002
已经被前面的两位 喀嚓 了/:002 菜啊,只能搞爆破。。。。/:002
向高手学习了。。。