秋雨梧桐 发表于 2007-12-17 13:49:12

没能追出码,/:010

E之郎 发表于 2007-12-20 11:14:44

(PYG)整个爆破的上来

katkat 发表于 2007-12-20 12:17:19

哈哈,那就下来玩一下!/:001

E之郎 发表于 2007-12-22 09:38:13

追出PYG注册码
用户名:swzyzl0
注册码:C6A4D2

E之郎 发表于 2007-12-22 18:12:45

分析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 编辑 ]

夜游神 发表于 2007-12-22 19:03:29

楼主厉害的说,学习了

xuhw 发表于 2007-12-22 19:20:43

算法总结:将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位)

剑客之道 发表于 2007-12-26 21:36:32

不懂算法,这个我没有找到注册码/:002

liuyun213 发表于 2007-12-27 10:15:42

原帖由 剑客之道 于 2007-12-26 21:36 发表 https://www.chinapyg.com/images/common/back.gif
不懂算法,这个我没有找到注册码/:002
已经被前面的两位 喀嚓 了/:002

nszy007 发表于 2007-12-27 12:13:03

菜啊,只能搞爆破。。。。/:002
向高手学习了。。。
页: 1 2 [3] 4 5
查看完整版本: 新学VC,做了个简单的Cracme(更新)