首页
社区
课程
招聘
PYG_CrackMe2005认证试题[VB-PCODE]算法简单分析
发表于: 2006-1-28 22:04 6726

PYG_CrackMe2005认证试题[VB-PCODE]算法简单分析

2006-1-28 22:04
6726

没有加壳,是VB-PCODE。试题已经做废,飘云允许公开讨论。
下载:http://bbs.chinapyg.cn/viewthread.php?tid=262&extra=page%3D1

我最初的调试环境是win2000+sp4,让WKTVBDE调试器能正常工作浪费我大量的时间,真郁闷。
如果你也遇到类似问题可以试试下面的方法:
1、被调试的程序要把只读属性去掉。
2、MSVBVM60.DLL的版本太低,建议从microsoft的Service Pack 6 for Visual Studio6.0中的Msvbvm60.cab中提取,
   或用其它版本高些的,复制到\windir\system32目录。好象用2001年以后的版本就不会有问题。
3、安装目录的bdasmdll.dll,WKTVBDE.dll复制到\windir\system32目录。
4、安装程序建立的快捷方式有问题,到安装目录直接运行。

下面的代码从[ VBExplorer1.0.1 ]中复制得来的。
用WKTVBDE打开程序,Action->Run。Ctrl+E打开Current Bpx对话框下断点40B04C,F5运行程序。
输入用户名和注册码单击确定就会中断在断点处。

[Label1.Click]
******Possible String Ref To->"5201314896788888888888888888888888"
                               |
:0040B04C  3A9CFE0400                      LitVarStr                  ;PushVarString ptr_00408C5C
上面一行F8过后,Stack显示0013F790: 0013F8DC ,Ctrl+M打开内存编辑输入13F8DC可以看到值是 08
这表示字符串类型,第8个字节之后是字符串的地址,13F8E4: 00408C5C,所以输入408C5C之后就会看到加载
到内存的字符串了,vb-pcode类型在调试的时候多注意观察栈,又比如 02 表示整型,第8个字节之后放
的是该整型数值的地址。以下类似内容略。
:0040B051  FD006CFF                        FStVarCopy                 ;[LOCAL_0094]=vbaVarCopy(Pop)
******Possible String Ref To->"chinapygabcdefghijklmopqrstuvwxyza"
                               |
:0040B055  3A9CFE0500                      LitVarStr                  ;PushVarString ptr_00408CA8
:0040B05A  FD005CFF                        FStVarCopy                 ;[LOCAL_00A4]=vbaVarCopy(Pop)
******Possible String Ref To->"piaoyunge"
                               |
:0040B05E  3A9CFE0600                      LitVarStr                  ;PushVarString ptr_00408CF4
:0040B063  FD00DCFE                        FStVarCopy                 ;[LOCAL_0124]=vbaVarCopy(Pop)
:0040B067  0494FE                          FLdRfVar                   ;Push LOCAL_016C
:0040B06A  21                              FLdPrThis                  ;[SR]=[stack2]
:0040B06B  0F0003                          VCallAd                    ;Return the control index 02
:0040B06E  1998FE                          FStAdFunc                  ;
:0040B071  0898FE                          FLdPr                      ;[SR]=[LOCAL_0168]
***********Reference To:[propget]TextBox.Text取机器码
                              |
:0040B074  0DA0000000                      VCallHresult               ;Call ptr_00408BC0
:0040B079  3E94FE                          FLdZeroAd                  ;Push DWORD [LOCAL_016C]; [LOCAL_016C]=0
:0040B07C  4684FE                          CVarStr                    ;
:0040B07F  FCF6BCFE                        FStVar                     ;
:0040B083  1A98FE                          FFree1Ad                   ;Push [LOCAL_0168]; Call [[[LOCAL_0168]]+8]; [[LOCAL_0168]]=0
:0040B086  0494FE                          FLdRfVar                   ;Push LOCAL_016C
:0040B089  21                              FLdPrThis                  ;[SR]=[stack2]
:0040B08A  0F0C03                          VCallAd                    ;Return the control index 05
:0040B08D  1998FE                          FStAdFunc                  ;
:0040B090  0898FE                          FLdPr                      ;[SR]=[LOCAL_0168]
***********Reference To:[propget]TextBox.Text取用户名
                              |
:0040B093  0DA0000000                      VCallHresult               ;Call ptr_00408BC0
:0040B098  3E94FE                          FLdZeroAd                  ;Push DWORD [LOCAL_016C]; [LOCAL_016C]=0
:0040B09B  4684FE                          CVarStr                    ;
:0040B09E  04DCFE                          FLdRfVar                   ;Push LOCAL_0124**********"piaoyunge"
:0040B0A1  FBEF74FE                        ConcatVar                  ;*************************"piaoyunge"加到用户名后面
:0040B0A5  0464FE                          FLdRfVar                   ;Push LOCAL_019C
**********Reference To->msvbvm60.rtcUpperCaseVar**********S1*********************************将用户名加上piaoyunge之后变成大写宽字串S1
                               |
:0040B0A8  0A07000800                      ImpAdCallFPR4              ;Call ptr_0040105C; check stack 0008; Push EAX
:0040B0AD  0464FE                          FLdRfVar                   ;Push LOCAL_019C
:0040B0B0  FCF6CCFE                        FStVar                     ;
:0040B0B4  1A98FE                          FFree1Ad                   ;Push [LOCAL_0168]; Call [[[LOCAL_0168]]+8]; [[LOCAL_0168]]=0
:0040B0B7  36040084FE74FE                  FFreeVar                   ;Free 0004/2 variants
:0040B0BE  0494FE                          FLdRfVar                   ;Push LOCAL_016C
:0040B0C1  21                              FLdPrThis                  ;[SR]=[stack2]
:0040B0C2  0F0803                          VCallAd                    ;Return the control index 04
:0040B0C5  1998FE                          FStAdFunc                  ;
:0040B0C8  0898FE                          FLdPr                      ;[SR]=[LOCAL_0168]
***********Reference To:[propget]TextBox.Text取输入的注册码
                              |
:0040B0CB  0DA0000000                      VCallHresult               ;Call ptr_00408BC0
:0040B0D0  3E94FE                          FLdZeroAd                  ;Push DWORD [LOCAL_016C]; [LOCAL_016C]=0
:0040B0D3  4684FE                          CVarStr                    ;
:0040B0D6  FCF654FE                        FStVar                     ;
:0040B0DA  1A98FE                          FFree1Ad                   ;Push [LOCAL_0168]; Call [[[LOCAL_0168]]+8]; [[LOCAL_0168]]=0
:0040B0DD  04CCFE                          FLdRfVar                   ;Push LOCAL_0134************S1入栈
:0040B0E0  FBEB84FE                        FnLenVar                   ;vbaLenVar********************求S1长度
******Possible String Ref To->""
                               |
:0040B0E4  3A9CFE0800                      LitVarStr                  ;PushVarString ptr_00408D0C
:0040B0E9  5D                              HardType                   ;
:0040B0EA  FB3C74FE                        NeVar                      ;
:0040B0EE  0454FE                          FLdRfVar                   ;Push LOCAL_01AC***********输入的注册码入栈
:0040B0F1  FBEB64FE                        FnLenVar                   ;vbaLenVar*****************输入的注册码长度
此时stack显示 13f78c:13f8a4 13f8a4值是03表示长整型,13f8ac内就是长度。
******Possible String Ref To->""
                               |
:0040B0F5  3A44FE0800                      LitVarStr                  ;PushVarString ptr_00408D0C
:0040B0FA  5D                              HardType                   ;
:0040B0FB  FB3C34FE                        NeVar                      ;
:0040B0FF  FB2724FE                        AndVar                     ;
:0040B103  FF1B                            CBoolVarNull               ;vbaBoolVarNull
:0040B105  1C2403                          BranchF                    ;If Pop=0 then ESI=0040B370没有输入注册码跳走
:0040B108  2844FE0100                      LitVarI2                   ;PushVarInteger 0001

:0040B10D  0414FE                          FLdRfVar                   ;Push LOCAL_01EC 13f854

第一步,这一部分,用机器码每一位数字做为索引值取5201314896788888888888888888888888中数字得到一个字符串s2
{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
:0040B110  04BCFE                          FLdRfVar                   ;Push LOCAL_0144***********取机器码
:0040B113  FBEB84FE                        FnLenVar                   ;vbaLenVar*****************机器码长度
:0040B117  FE68F4FD2E01                    ForVar                     ;
:0040B11D  2884FE0100                      LitVarI2                   ;PushVarInteger 0001
:0040B122  0414FE                          FLdRfVar                   ;Push LOCAL_01EC***********计数
:0040B125  FC22                            CI4Var                     ;vbaI4Var
:0040B127  04BCFE                          FLdRfVar                   ;Push LOCAL_0144***********机器码地址入栈
:0040B12A  0474FE                          FLdRfVar                   ;Push LOCAL_018C
**********Reference To->msvbvm60.rtcMidCharVar
                               |
:0040B12D  0A09001000                      ImpAdCallFPR4              ;Call ptr_00401062; check stack 0010; Push EAX
:0040B132  0474FE                          FLdRfVar                   ;Push LOCAL_018C***********取一个机器码
:0040B135  FCF64CFF                        FStVar                     ;
:0040B139  3584FE                          FFree1Var                  ;Free LOCAL_017C
:0040B13C  040CFF                          FLdRfVar                   ;Push LOCAL_00F4
:0040B13F  2874FE0100                      LitVarI2                   ;PushVarInteger 0001
:0040B144  044CFF                          FLdRfVar                   ;Push LOCAL_00B4
:0040B147  289CFE0100                      LitVarI2                   ;PushVarInteger 0001
:0040B14C  FB9484FE                        AddVar                     ;
:0040B150  FC22                            CI4Var                     ;vbaI4Var
:0040B152  046CFF                          FLdRfVar                   ;Push LOCAL_0094****"5201314896788888888888888888888888"
:0040B155  0464FE                          FLdRfVar                   ;Push LOCAL_019C
**********Reference To->msvbvm60.rtcMidCharVar
                               |
:0040B158  0A09001000                      ImpAdCallFPR4              ;Call ptr_00401062; check stack 0010; Push EAX用机器码作为索引从上面的字串取一个字符
:0040B15D  0464FE                          FLdRfVar                   ;Push LOCAL_019C
:0040B160  FBEF34FE                        ConcatVar                  ;把字符连接成字符串
:0040B164  FCF60CFF                        FStVar                     ;
:0040B168  36060084FE74FE64                FFreeVar                   ;Free 0006/2 variants
:0040B171  0414FE                          FLdRfVar                   ;Push LOCAL_01EC
:0040B174  FE7EF4FDD100                    NextStepVar                ;*****************循环0040B110
}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
:0040B17A  2844FE0100                      LitVarI2                   ;PushVarInteger 0001
:0040B17F  04E4FD                          FLdRfVar                   ;Push LOCAL_021C
:0040B182  04CCFE                          FLdRfVar                   ;Push LOCAL_0134
:0040B185  FBEB84FE                        FnLenVar                   ;vbaLenVar***********取S1长度
:0040B189  FE68C4FD9001                    ForVar                     ;

这里又是一个循环用字符串S1继续下面,
将首个字母的ASCII十六进制值跟0x3异或之后的结果,加上下一个字母的ASCII十六进制值
再跟0x3异或,循环完后得到一个十六进制值,变成十进制与第一步得到的字符串变成十进
制数字相加,结果保存为一个字符串。
{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
:0040B18F  04ECFE                          FLdRfVar                   ;Push LOCAL_0114
:0040B192  2884FE0100                      LitVarI2                   ;PushVarInteger 0001
:0040B197  04E4FD                          FLdRfVar                   ;Push LOCAL_021C*******用户名位置序数。
:0040B19A  FC22                            CI4Var                     ;vbaI4Var
:0040B19C  04CCFE                          FLdRfVar                   ;Push LOCAL_0134*******S1
:0040B19F  0474FE                          FLdRfVar                   ;Push LOCAL_018C
**********Reference To->msvbvm60.rtcMidCharVar
                               |
:0040B1A2  0A09001000                      ImpAdCallFPR4              ;Call ptr_00401062; check stack 0010; Push EAX
:0040B1A7  0474FE                          FLdRfVar                   ;Push LOCAL_018C
:0040B1AA  FDFE94FE                        CStrVarVal                 ;
**********Reference To->msvbvm60.rtcAnsiValueBstr取 S1 中的每个字符的ASCII值
                               |
:0040B1AE  0B0A000400                      ImpAdCallI2                ;Call ptr_00401068; check stack 0004; Push EAX
:0040B1B3  4444FE                          CVarI2                     ;
:0040B1B6  FB9464FE                        AddVar                     ;与上次结果相加
:0040B1BA  28B4FD0300                      LitVarI2                   ;PushVarInteger 0003
:0040B1BF  FB1734FE                        XorVar                     ;用户名字符ansi值与0x3 xor,,,,,,,相加之后异或
:0040B1C3  FCF6ECFE                        FStVar                     ;
:0040B1C7  2F94FE                          FFree1Str                  ;SysFreeString [LOCAL_016C]; [LOCAL_016C]=0
:0040B1CA  36060084FE74FE64                FFreeVar                   ;Free 0006/2 variants
:0040B1D3  04E4FD                          FLdRfVar                   ;Push LOCAL_021C
:0040B1D6  FE7EC4FD4301                    NextStepVar                ;
}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
:0040B1DC  040CFF                          FLdRfVar                   ;Push LOCAL_00F4***************s2
:0040B1DF  04ECFE                          FLdRfVar                   ;Push LOCAL_0114***************循环完后的结果
:0040B1E2  FB9484FE                        AddVar                     ;相加
:0040B1E6  FCF6FCFE                        FStVar                     ;
:0040B1EA  2844FE0100                      LitVarI2                   ;PushVarInteger 0001

机器码的每一位数字加1后从"chinapygabcdefghijklmopqrstuvwxyza"取相应位置的字母连
接成字符串.要注意变成大写的哦!
把这个字符串加到第二步等到的字符串的后面,将生成的字符串长度被24减,得数是几就在
末尾加几个上"0",最后第五位后面加上"-",得到的这个字符串就是中间结果,
{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
:0040B1EF  04A4FD                          FLdRfVar                   ;Push LOCAL_025C
:0040B1F2  04FCFE                          FLdRfVar                   ;Push LOCAL_0104
:0040B1F5  FBEB84FE                        FnLenVar                   ;vbaLenVar
:0040B1F9  FE6884FD1D02                    ForVar                     ;
:0040B1FF  2884FE0100                      LitVarI2                   ;PushVarInteger 0001
:0040B204  04A4FD                          FLdRfVar                   ;Push LOCAL_025C
:0040B207  FC22                            CI4Var                     ;vbaI4Var
:0040B209  04BCFE                          FLdRfVar                   ;Push LOCAL_0144
:0040B20C  0474FE                          FLdRfVar                   ;Push LOCAL_018C
**********Reference To->msvbvm60.rtcMidCharVar
                               |
:0040B20F  0A09001000                      ImpAdCallFPR4              ;Call ptr_00401062; check stack 0010; Push EAX
:0040B214  0474FE                          FLdRfVar                   ;Push LOCAL_018C
:0040B217  FCF63CFF                        FStVar                     ;
:0040B21B  3584FE                          FFree1Var                  ;Free LOCAL_017C
:0040B21E  04FCFE                          FLdRfVar                   ;Push LOCAL_0104
:0040B221  2874FE0100                      LitVarI2                   ;PushVarInteger 0001
:0040B226  043CFF                          FLdRfVar                   ;Push LOCAL_00C4
:0040B229  289CFE0100                      LitVarI2                   ;PushVarInteger 0001
:0040B22E  FB9484FE                        AddVar                     ;
:0040B232  FC22                            CI4Var                     ;vbaI4Var
:0040B234  045CFF                          FLdRfVar                   ;Push LOCAL_00A4"chinapygabcdefghijklmopqrstuvwxyza"
:0040B237  0464FE                          FLdRfVar                   ;Push LOCAL_019C
**********Reference To->msvbvm60.rtcMidCharVar
                               |
:0040B23A  0A09001000                      ImpAdCallFPR4              ;Call ptr_00401062; check stack 0010; Push EAX
:0040B23F  0464FE                          FLdRfVar                   ;Push LOCAL_019C
:0040B242  0434FE                          FLdRfVar                   ;Push LOCAL_01CC
**********Reference To->msvbvm60.rtcUpperCaseVar
                               |
:0040B245  0A07000800                      ImpAdCallFPR4              ;Call ptr_0040105C; check stack 0008; Push EAX
:0040B24A  0434FE                          FLdRfVar                   ;Push LOCAL_01CC
:0040B24D  FBEF24FE                        ConcatVar                  ;
:0040B251  FCF6FCFE                        FStVar                     ;
:0040B255  36080084FE74FE64                FFreeVar                   ;Free 0008/2 variants
:0040B260  04A4FD                          FLdRfVar                   ;Push LOCAL_025C
:0040B263  FE7E84FDB301                    NextStepVar                ;
}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
:0040B269  04FCFE                          FLdRfVar                   ;Push LOCAL_0104
:0040B26C  FBEB84FE                        FnLenVar                   ;vbaLenVar
:0040B270  289CFE1900                      LitVarI2                   ;PushVarInteger 0019
:0040B275  5D                              HardType                   ;
:0040B276  FB67                            LtVarBool                  ;Push (Pop1 < Pop2)
:0040B278  1CB702                          BranchF                    ;If Pop=0 then ESI=0040B303
:0040B27B  04FCFE                          FLdRfVar                   ;Push LOCAL_0104
******Possible String Ref To->"0"将生成的字符串长度被24减,得数是几就在末尾加几个上"0"
                               |
:0040B27E  3A44FE0B00                      LitVarStr                  ;PushVarString ptr_00408D14
:0040B283  4E64FE                          FStVarCopyObj              ;[LOCAL_019C]=vbaVarDup(Pop)
:0040B286  0464FE                          FLdRfVar                   ;Push LOCAL_019C
:0040B289  289CFE1800                      LitVarI2                   ;PushVarInteger 0018 *****24减去上面连接成字符串的长度得L
:0040B28E  04FCFE                          FLdRfVar                   ;Push LOCAL_0104
:0040B291  FBEB84FE                        FnLenVar                   ;vbaLenVar
:0040B295  FB9C74FE                        SubVar                     ;
:0040B299  FC22                            CI4Var                     ;vbaI4Var
**********Reference To->msvbvm60.rtcStringBstr
                               |
:0040B29B  0B0C000800                      ImpAdCallI2                ;Call ptr_0040106E; check stack 0008; Push EAX
:0040B2A0  4634FE                          CVarStr                    ;
:0040B2A3  FB9424FE                        AddVar                     ;**************************加L个0
:0040B2A7  FCF6FCFE                        FStVar                     ;
:0040B2AB  36040064FE34FE                  FFreeVar                   ;Free 0004/2 variants
:0040B2B2  2884FE0500                      LitVarI2                   ;PushVarInteger 0005
:0040B2B7  F501000000                      LitI4                      ;Push 00000001
:0040B2BC  04FCFE                          FLdRfVar                   ;Push LOCAL_0104
:0040B2BF  0474FE                          FLdRfVar                   ;Push LOCAL_018C
**********Reference To->msvbvm60.rtcMidCharVar
                               |
:0040B2C2  0A09001000                      ImpAdCallFPR4              ;Call ptr_00401062; check stack 0010; Push EAX
:0040B2C7  0474FE                          FLdRfVar                   ;Push LOCAL_018C
******Possible String Ref To->"-"最后第五位后面加上"-",得到的这个字符串就是中间结果,
                               |
:0040B2CA  3A44FE0D00                      LitVarStr                  ;PushVarString ptr_00408D1C
:0040B2CF  FB9464FE                        AddVar                     ;第五位后面加个-
:0040B2D3  2834FE1400                      LitVarI2                   ;PushVarInteger 0014
:0040B2D8  F506000000                      LitI4                      ;Push 00000006
:0040B2DD  04FCFE                          FLdRfVar                   ;Push LOCAL_0104
:0040B2E0  0424FE                          FLdRfVar                   ;Push LOCAL_01DC
**********Reference To->msvbvm60.rtcMidCharVar
                               |
:0040B2E3  0A09001000                      ImpAdCallFPR4              ;Call ptr_00401062; check stack 0010; Push EAX
:0040B2E8  0424FE                          FLdRfVar                   ;Push LOCAL_01DC
:0040B2EB  FB9474FD                        AddVar                     ;和原来的接起来,相当于原来的串5位后加个-
:0040B2EF  FCF6ACFE                        FStVar                     ;
:0040B2F3  360A0084FE74FE34                FFreeVar                   ;Free 000A/2 variants
:0040B300  1E2403                          Branch                     ;ESI=0040B370
:0040B303  2884FE1800                      LitVarI2                   ;PushVarInteger 0018<--要够24位
:0040B308  F501000000                      LitI4                      ;Push 00000001
:0040B30D  04FCFE                          FLdRfVar                   ;Push LOCAL_0104
:0040B310  0474FE                          FLdRfVar                   ;Push LOCAL_018C
**********Reference To->msvbvm60.rtcMidCharVar
                               |
:0040B313  0A09001000                      ImpAdCallFPR4              ;Call ptr_00401062; check stack 0010; Push EAX
:0040B318  0474FE                          FLdRfVar                   ;Push LOCAL_018C
:0040B31B  FCF6FCFE                        FStVar                     ;
:0040B31F  3584FE                          FFree1Var                  ;Free LOCAL_017C
:0040B322  2884FE0500                      LitVarI2                   ;PushVarInteger 0005<--第五位后加'-'
:0040B327  F501000000                      LitI4                      ;Push 00000001
:0040B32C  04FCFE                          FLdRfVar                   ;Push LOCAL_0104
:0040B32F  0474FE                          FLdRfVar                   ;Push LOCAL_018C
**********Reference To->msvbvm60.rtcMidCharVar
                               |
:0040B332  0A09001000                      ImpAdCallFPR4              ;Call ptr_00401062; check stack 0010; Push EAX
:0040B337  0474FE                          FLdRfVar                   ;Push LOCAL_018C
******Possible String Ref To->"-"
                               |
:0040B33A  3A44FE0D00                      LitVarStr                  ;PushVarString ptr_00408D1C
:0040B33F  FB9464FE                        AddVar                     ;
:0040B343  2834FE1400                      LitVarI2                   ;PushVarInteger 0014
:0040B348  F506000000                      LitI4                      ;Push 00000006
:0040B34D  04FCFE                          FLdRfVar                   ;Push LOCAL_0104
:0040B350  0424FE                          FLdRfVar                   ;Push LOCAL_01DC
**********Reference To->msvbvm60.rtcMidCharVar
                               |
:0040B353  0A09001000                      ImpAdCallFPR4              ;Call ptr_00401062; check stack 0010; Push EAX
:0040B358  0424FE                          FLdRfVar                   ;Push LOCAL_01DC
:0040B35B  FB9474FD                        AddVar                     ;
:0040B35F  FCF6ACFE                        FStVar                     ;
:0040B363  360A0084FE74FE34                FFreeVar                   ;Free 000A/2 variants
:0040B370  289CFE0100                      LitVarI2                   ;PushVarInteger 0001
:0040B375  FCF62CFF                        FStVar                     ;
:0040B379  0454FE                          FLdRfVar                   ;Push LOCAL_01AC
:0040B37C  FBEB84FE                        FnLenVar                   ;vbaLenVar
:0040B380  289CFE0000                      LitVarI2                   ;PushVarInteger 0000
:0040B385  5D                              HardType                   ;
:0040B386  FB3C74FE                        NeVar                      ;
:0040B38A  04CCFE                          FLdRfVar                   ;Push LOCAL_0134
:0040B38D  FBEB64FE                        FnLenVar                   ;vbaLenVar
:0040B391  2844FE0000                      LitVarI2                   ;PushVarInteger 0000
:0040B396  5D                              HardType                   ;
:0040B397  FB3C34FE                        NeVar                      ;
:0040B39B  FB2724FE                        AndVar                     ;
:0040B39F  FF1B                            CBoolVarNull               ;vbaBoolVarNull
:0040B3A1  1C4404                          BranchF                    ;If Pop=0 then ESI=0040B490
:0040B3A4  2884FE0100                      LitVarI2                   ;PushVarInteger 0001
:0040B3A9  042CFF                          FLdRfVar                   ;Push LOCAL_00D4
:0040B3AC  FC22                            CI4Var                     ;vbaI4Var
:0040B3AE  0454FE                          FLdRfVar                   ;Push LOCAL_01AC输入的注册号地址入栈
:0040B3B1  0474FE                          FLdRfVar                   ;Push LOCAL_018C
**********Reference To->msvbvm60.rtcMidCharVar
                               |
:0040B3B4  0A09001000                      ImpAdCallFPR4              ;Call ptr_00401062; check stack 0010; Push EAX
:0040B3B9  0474FE                          FLdRfVar                   ;Push LOCAL_018C取一个注册号值为16进制
:0040B3BC  FCF61CFF                        FStVar                     ;
:0040B3C0  3584FE                          FFree1Var                  ;Free LOCAL_017C
:0040B3C3  041CFF                          FLdRfVar                   ;Push LOCAL_00E4
:0040B3C6  FDFE94FE                        CStrVarVal                 ;
**********Reference To->msvbvm60.rtcAnsiValueBstr
                               |
:0040B3CA  0B0A000400                      ImpAdCallI2                ;Call ptr_00401068; check stack 0004; Push EAX
:0040B3CF  F404                            LitI2_Byte                 ;Push 04
:0040B3D1  A9                              AddI2                      ;取一个注册号加4
:0040B3D2  449CFE                          CVarI2                     ;
:0040B3D5  042CFF                          FLdRfVar                   ;Push LOCAL_00D4
:0040B3D8  FB9484FE                        AddVar                     ;加上位置的序号
:0040B3DC  FCF61CFF                        FStVar                     ;
:0040B3E0  2F94FE                          FFree1Str                  ;SysFreeString [LOCAL_016C]; [LOCAL_016C]=0
:0040B3E3  041CFF                          FLdRfVar                   ;Push LOCAL_00E4
:0040B3E6  F501000000                      LitI4                      ;Push 00000001
:0040B3EB  0484FE                          FLdRfVar                   ;Push LOCAL_017C
**********Reference To->msvbvm60.rtcStringVar
                               |
:0040B3EE  0A0E000C00                      ImpAdCallFPR4              ;Call ptr_00401074; check stack 000C; Push EAX
:0040B3F3  0484FE                          FLdRfVar                   ;Push LOCAL_017C
:0040B3F6  FCF61CFF                        FStVar                     ;
:0040B3FA  0464FD                          FLdRfVar                   ;Push LOCAL_029C
:0040B3FD  041CFF                          FLdRfVar                   ;Push LOCAL_00E4
:0040B400  FBEF84FE                        ConcatVar                  ;
:0040B404  FCF664FD                        FStVar                     ;
:0040B408  042CFF                          FLdRfVar                   ;Push LOCAL_00D4
:0040B40B  289CFE0100                      LitVarI2                   ;PushVarInteger 0001
:0040B410  FB9484FE                        AddVar                     ;
:0040B414  FCF62CFF                        FStVar                     ;
:0040B418  042CFF                          FLdRfVar                   ;Push LOCAL_00D4
:0040B41B  0454FE                          FLdRfVar                   ;Push LOCAL_01AC注册号地址
:0040B41E  FBEB84FE                        FnLenVar                   ;vbaLenVar
:0040B422  FB4D                            LeVarBool                  ;
:0040B424  1D5803                          BranchT                    ;If Pop<>0 then ESI=0040B3A4
这里是关键的比较处,
***********************************************************************************************
:0040B427  0464FD                          FLdRfVar                   ;Push LOCAL_029C
:0040B42A  04ACFE                          FLdRfVar                   ;Push LOCAL_0154
:0040B42D  FB33                            EqVarBool                  ;
:0040B42F  1C1A04                          BranchF                    ;If Pop=0 then ESI=0040B466把1c改为1d就爆了~_~
************************************************************************************************
:0040B432  2734FE                          LitVar                     ;PushVar LOCAL_01CC
:0040B435  2764FE                          LitVar                     ;PushVar LOCAL_019C
******Possible String Ref To->"??"
                               |
:0040B438  3A44FE0F00                      LitVarStr                  ;PushVarString ptr_00408D3C
:0040B43D  4E74FE                          FStVarCopyObj              ;[LOCAL_018C]=vbaVarDup(Pop)
:0040B440  0474FE                          FLdRfVar                   ;Push LOCAL_018C
:0040B443  F540000000                      LitI4                      ;Push 00000040
******Possible String Ref To->"??键?
PYG?"
                               |
:0040B448  3A9CFE1000                      LitVarStr                  ;PushVarString ptr_00408D24
:0040B44D  4E84FE                          FStVarCopyObj              ;[LOCAL_017C]=vbaVarDup(Pop)
:0040B450  0484FE                          FLdRfVar                   ;Push LOCAL_017C
**********Reference To->msvbvm60.rtcMsgBox
                               |
:0040B453  0A11001400                      ImpAdCallFPR4              ;Call ptr_0040107A; check stack 0014; Push EAX
:0040B458  36080084FE74FE64                FFreeVar                   ;Free 0008/2 variants
:0040B463  1E4404                          Branch                     ;ESI=0040B490
******Possible String Ref To->""
                               |
:0040B466  1B0800                          LitStr                     ;Push ptr_00408D0C
:0040B469  21                              FLdPrThis                  ;[SR]=[stack2]
:0040B46A  0F0C03                          VCallAd                    ;Return the control index 05
:0040B46D  1998FE                          FStAdFunc                  ;
:0040B470  0898FE                          FLdPr                      ;[SR]=[LOCAL_0168]
***********Reference To:[propput]TextBox.Text
                              |
:0040B473  0DA4000000                      VCallHresult               ;Call ptr_00408BC0
:0040B478  1A98FE                          FFree1Ad                   ;Push [LOCAL_0168]; Call [[[LOCAL_0168]]+8]; [[LOCAL_0168]]=0
******Possible String Ref To->""
                               |
:0040B47B  1B0800                          LitStr                     ;Push ptr_00408D0C
:0040B47E  21                              FLdPrThis                  ;[SR]=[stack2]
:0040B47F  0F0803                          VCallAd                    ;Return the control index 04
:0040B482  1998FE                          FStAdFunc                  ;
:0040B485  0898FE                          FLdPr                      ;[SR]=[LOCAL_0168]
***********Reference To:[propput]TextBox.Text
                              |
:0040B488  0DA4000000                      VCallHresult               ;Call ptr_00408BC0
:0040B48D  1A98FE                          FFree1Ad                   ;Push [LOCAL_0168]; Call [[[LOCAL_0168]]+8]; [[LOCAL_0168]]=0
:0040B490  13                              ExitProcHresult            ;
:0040B491  0000                            LargeBos                   ;IDE beginning of line with 00 byte codes

==============================================================================
PYG_CrackMe2005认证试题算法总结:

第一步:
机器码为索引值从"5201314896788888888888888888888888"取相应位置的数字连
接成字符串。该数组下标按C语言标准是从0开始的。

第二步:
用户名加上字符串"piaoyunge"之后全部变成大写字母,得到一个字符串继续下面,
将首个字母的ASCII十六进制值跟0x3异或之后的结果,
加上下一个字母的ASCII十六进制值再跟0x3异或,
循环完后得到一个十六进制值,
变成十进制与第一步得到的字符串变成十进制数字相加,结果保存为一个字符串。

第三步:
机器码为索引值从"chinapygabcdefghijklmopqrstuvwxyza"取相应位置的字母连
接成字符串,变成大写。如果上一步得到的串长度比机器码长度少,那么少几位
就把这个串最后几位变为'0'。
把这个字符串加到第二步等到的字符串的后面,末尾加几个'0'补足24位。
第五位后面加上'-',得到的这个字符串就是中间结果。

第四步:
注册码每一位ASCII十六进制值加上4,加上所在位置的序号,得到的这个字符串就是中间结
果,与第三步得到的中间结果相等就OK。
-------------------------------------------------------------------
说明:做注册机到第三步中间结果时,对第四步进行逆变换,每一位减4,再减所在位置序号就是注册码.

void key(char * machinecode,char * username,char * key)
{

        char s0[]="piaoyunge";
        char s1[]="5201314896788888888888888888888888";
        char s2[]="chinapygabcdefghijklmopqrstuvwxyza";
        char s3[]="-                                 ";

       
        int i,j,k;
        unsigned long int m;
        char k1[34]={0};
        char k2[34]={0};

        /*通过机器码查表得到一个数字k1串一个字母串k2*/
        j = lstrlen(machinecode);
        for (i=0; i<j; i++)
                {
                k1[i]=s1[machinecode[i]-'0'];
                k2[i]=s2[machinecode[i]-'0'];
                }

        lstrcat(username,s0);//用户名加piaoyunge
        CharUpper(username);//变成大写串
        for (i=0,k=0; i<lstrlen(username); i++)
                {
                k = (k+username[i])^3;
                }
        m = atol(k1) + k;
        wsprintf(key,"%lu",m);
/*---------------------------------------------------*/
        j=strlen(machinecode)-strlen(key);
    if (j)
                {
                for(i=(strlen(k2)-1);j>0;j--)
                        k2[i]='0';
                }
/*---------------------------------------------------*/
        strcat(key,k2);

    j = 24 - lstrlen(key);

        for(i=0;i<j;i++)
                {
                lstrcat(key,"0");//加'0'补足24位
                }

        lstrcpy(s3+1,key+5);//第五位后加'-'
        lstrcpy(key+5,s3);
        CharUpper(key);//变成大写串
//------------------------------
        //逆变换出注册码
        j=lstrlen(key);
        for(i=0;i<j;i++)
                {
                key[i] = key[i]-i-5;
                }
}

surge[PYG]
surgefree@163.com
写于河北衡水


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//