冷血书生 发表于 2005-7-8 01:00:40

NAME:冷血书生
KEY:YFTnUFqN5zojGxA3tQYc

内存注册机!

中断地址:4015FB
中断次数:1
第一字节:FF
指令长度:6

寄存器,内存方式,EAX

指针1层!

[ Last edited by 冷血书生 on 2005-7-8 at 01:02 AM ]

xianju110 发表于 2006-1-8 10:41:36

clnkid 发表于 2006-1-9 10:13:28

算法call里还有GetVolumeInformationA这个函数啊~~每台机器还不一样啊~

busheler 发表于 2006-1-14 08:31:58

【破文标题】CrackMe By ErShu算法分析
【破文作者】Busheler
【作者邮箱】[email protected]
【作者主页】
【破解工具】odbg110,win32dasm,PEiD v0.94
【破解平台】Windows2000
【软件名称】CrackMe By ErShu
【软件大小】20.0KB
【原版下载】https://www.chinapyg.com/attachment.php?aid=51
【保护方式】
【软件简介】一个很简单的CRACKME,此为算法CRACKME,如果只找注册码没什么难度~~~~~~
------------------------------------------------------------------------
一、脱壳:
   PEiD v0.94查壳无发现,Microsoft Visual C++ 6.0,无马甲。

二、找资源:
   win32dasm载入找到如下信息:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004015BB(C)
|
:004015DD 8D542404                lea edx, dword ptr
:004015E1 50                      push eax
:004015E2 52                      push edx
:004015E3 8BCE                  mov ecx, esi
:004015E5 E866000000            call 00401650
:004015EA 8B4664                  mov eax, dword ptr
:004015ED C744241000000000      mov , 00000000
:004015F5 50                      push eax
:004015F6 8B442408                mov eax, dword ptr
:004015FA 50                      push eax

* Reference To: MSVCRT._mbscmp, Ord:0159h
                                  |
:004015FB FF15C8214000            Call dword ptr
:00401601 83C408                  add esp, 00000008
:00401604 85C0                  test eax, eax
:00401606 6A00                  push 00000000
:00401608 6A00                  push 00000000
:0040160A 750E                  jne 0040161A

* Possible StringData Ref from Data Obj ->"Great! pf! pf!"
                                  |
:0040160C 6828304000            push 00403028
:00401611 8BCE                  mov ecx, esi

* Reference To: MFC42.Ordinal:1080, Ord:1080h
                                  |
:00401613 E8FC040000            Call 00401B14
:00401618 EB15                  jmp 0040162F

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040160A(C)
|

* Possible StringData Ref from Data Obj ->"fail!"
                                  |
:0040161A 6820304000            push 00403020
:0040161F 8BCE                  mov ecx, esi

* Reference To: MFC42.Ordinal:1080, Ord:1080h
                                  |
:00401621 E8EE040000            Call 00401B14
:00401626 6A00                  push 00000000
:00401628 8BCE                  mov ecx, esi

* Reference To: MFC42.Ordinal:18BE, Ord:18BEh


三、踏上破解之路:

odbg110载入:

很容易找到要点:在401590处F2下断

用户名:busheler
试验码:123456789

确定,即被断下

00401590   . 6A FF          PUSH -1
00401592   . 68 381E4000    PUSH Crack_Me.00401E38                   ;SE handler installation
00401597   . 64:A1 00000000 MOV EAX,DWORD PTR FS:
0040159D   . 50             PUSH EAX
0040159E   . 64:8925 000000>MOV DWORD PTR FS:,ESP
004015A5   . 51             PUSH ECX
004015A6   . 56             PUSH ESI
004015A7   . 8BF1         MOV ESI,ECX
004015A9   . 6A 01          PUSH 1
004015AB   . E8 6A050000    CALL <JMP.&MFC42.#6334>
004015B0   . 8B4E 60      MOV ECX,DWORD PTR DS:            ;用户名入ECX
004015B3   . 8D46 60      LEA EAX,DWORD PTR DS:
004015B6   . 8B51 F8      MOV EDX,DWORD PTR DS:             ;用户名长度入EDX
004015B9   . 85D2         TEST EDX,EDX
004015BB   . 75 20          JNZ SHORT Crack_Me.004015DD            ;用户名不为0跳
004015BD   . 6A 00          PUSH 0
004015BF   . 6A 00          PUSH 0
004015C1   . 68 38304000    PUSH Crack_Me.00403038                   ;ASCII "User Name is empty!"
004015C6   . 8BCE         MOV ECX,ESI
004015C8   . E8 47050000    CALL <JMP.&MFC42.#4224>
004015CD   . 5E             POP ESI
004015CE   . 8B4C24 04      MOV ECX,DWORD PTR SS:
004015D2   . 64:890D 000000>MOV DWORD PTR FS:,ECX
004015D9   . 83C4 10      ADD ESP,10
004015DC   . C3             RET
004015DD   > 8D5424 04      LEA EDX,DWORD PTR SS:
004015E1   . 50             PUSH EAX                                 ; /Arg2
004015E2   . 52             PUSH EDX                                 ; |Arg1
004015E3   . 8BCE         MOV ECX,ESI                              ; |
004015E5   . E8 66000000    CALL Crack_Me.00401650                   ; \去计算注册码!!!
004015EA   . 8B46 64      MOV EAX,DWORD PTR DS:            ;试练码入EAX
004015ED   . C74424 10 0000>MOV DWORD PTR SS:,0
004015F5   . 50             PUSH EAX                                 ; /s2
004015F6   . 8B4424 08      MOV EAX,DWORD PTR SS:             ; |真注册码入EAX
004015FA   . 50             PUSH EAX                                 ; |s1
004015FB   . FF15 C8214000CALL DWORD PTR DS:[<&MSVCRT._mbscmp>]    ; \注册码对比!在这里下断点可直接看到注册码了,可是现在

的软件有几个有这等好事啊?
00401601   . 83C4 08      ADD ESP,8
00401604   . 85C0         TEST EAX,EAX
00401606   . 6A 00          PUSH 0
00401608   . 6A 00          PUSH 0
0040160A   . 75 0E          JNZ SHORT Crack_Me.0040161A            ;不等跳!
0040160C   . 68 28304000    PUSH Crack_Me.00403028                   ;ASCII "Great! pf! pf!"
00401611   . 8BCE         MOV ECX,ESI
00401613   . E8 FC040000    CALL <JMP.&MFC42.#4224>
00401618   . EB 15          JMP SHORT Crack_Me.0040162F
0040161A   > 68 20304000    PUSH Crack_Me.00403020                   ;ASCII "fail!"
0040161F   . 8BCE         MOV ECX,ESI
00401621   . E8 EE040000    CALL <JMP.&MFC42.#4224>
00401626   . 6A 00          PUSH 0
00401628   . 8BCE         MOV ECX,ESI
0040162A   . E8 EB040000    CALL <JMP.&MFC42.#6334>
0040162F   > 8D4C24 04      LEA ECX,DWORD PTR SS:
00401633   . C74424 10 FFFF>MOV DWORD PTR SS:,-1
0040163B   . E8 C0030000    CALL <JMP.&MFC42.#800>
00401640   . 8B4C24 08      MOV ECX,DWORD PTR SS:
00401644   . 5E             POP ESI
00401645   . 64:890D 000000>MOV DWORD PTR FS:,ECX
0040164C   . 83C4 10      ADD ESP,10
0040164F   . C3             RET

--------------

跟随CALL Crack_Me.00401650进取看看注册码是如何炼成的......哇这么厉害,好长一段代码啊!

00401650/$ 6A FF          PUSH -1
00401652|. 68 6F1E4000    PUSH Crack_Me.00401E6F                   ;SE handler installation
00401657|. 64:A1 00000000 MOV EAX,DWORD PTR FS:
0040165D|. 50             PUSH EAX
0040165E|. 64:8925 000000>MOV DWORD PTR FS:,ESP
00401665|. 83EC 34      SUB ESP,34
00401668|. 33C0         XOR EAX,EAX
0040166A|. 53             PUSH EBX
0040166B|. 894424 21      MOV DWORD PTR SS:,EAX
0040166F|. 55             PUSH EBP
00401670|. 894424 29      MOV DWORD PTR SS:,EAX
00401674|. 56             PUSH ESI
00401675|. 894424 31      MOV DWORD PTR SS:,EAX
00401679|. 33DB         XOR EBX,EBX
0040167B|. 894424 35      MOV DWORD PTR SS:,EAX
0040167F|. 57             PUSH EDI
00401680|. 8D4C24 18      LEA ECX,DWORD PTR SS:
00401684|. 895C24 20      MOV DWORD PTR SS:,EBX
00401688|. 885C24 2C      MOV BYTE PTR SS:,BL
0040168C|. 894424 3D      MOV DWORD PTR SS:,EAX
00401690|. E8 55040000    CALL <JMP.&MFC42.#540>
00401695|. 6A 0A          PUSH 0A                                  ; /pFileSystemNameSize = 0000000A
00401697|. 53             PUSH EBX                                 ; |pFileSystemNameBuffer
00401698|. 53             PUSH EBX                                 ; |pFileSystemFlags
00401699|. 8D4C24 1C      LEA ECX,DWORD PTR SS:            ; |
0040169D|. 53             PUSH EBX                                 ; |pMaxFilenameLength
0040169E|. 51             PUSH ECX                                 ; |pVolumeSerialNumber
0040169F|. 6A 0C          PUSH 0C                                  ; |MaxVolumeNameSize = C (12.)
004016A1|. BE 01000000    MOV ESI,1                              ; |
004016A6|. 53             PUSH EBX                                 ; |VolumeNameBuffer
004016A7|. 68 50304000    PUSH Crack_Me.00403050                   ; |RootPathName = "C:\"
004016AC|. 897424 6C      MOV DWORD PTR SS:,ESI            ; |
004016B0|. 895C24 34      MOV DWORD PTR SS:,EBX            ; |
004016B4|. 33ED         XOR EBP,EBP                              ; |
004016B6|. 895C24 30      MOV DWORD PTR SS:,EBX            ; |
004016BA|. FF15 00204000CALL DWORD PTR DS:[<&KERNEL32.GetVolumeI>; \GetVolumeInformationA
004016C0|. 8B4424 10      MOV EAX,DWORD PTR SS:            ;磁盘信息:即C盘序列号A40D9506入EAX
004016C4|. 8B5424 58      MOV EDX,DWORD PTR SS:
004016C8|. 35 26038319    XOR EAX,19830326                         ;C盘序列号与19830326做异或运算,结果入EAX ,也就是第四

段基础数据
004016CD|. 83C9 FF      OR ECX,FFFFFFFF
004016D0|. 8B12         MOV EDX,DWORD PTR DS:               ;用户名入EDX
004016D2|. 894424 10      MOV DWORD PTR SS:,EAX
004016D6|. 8BFA         MOV EDI,EDX
004016D8|. 33C0         XOR EAX,EAX
004016DA|. F2:AE          REPNE SCAS BYTE PTR ES:
004016DC|. F7D1         NOT ECX
004016DE|. 49             DEC ECX
004016DF|. 895424 1C      MOV DWORD PTR SS:,EDX
004016E3|. 8BF9         MOV EDI,ECX
004016E5|. 0F84 BC010000JE Crack_Me.004018A7
004016EB|. 3BFE         CMP EDI,ESI
004016ED|. 897424 58      MOV DWORD PTR SS:,ESI
004016F1|. 0F8C AF000000JL Crack_Me.004017A6
004016F7|. DD05 30254000FLD QWORD PTR DS:                ;ST(0)=0
004016FD|. EB 04          JMP SHORT Crack_Me.00401703
004016FF|> 8B5424 1C      /MOV EDX,DWORD PTR SS:         ;第一段基础数据开始:用户名入EDX
00401703|> 8A5C32 FF       MOV BL,BYTE PTR DS:          ;用户名ASCII码入BL
00401707|. DB4424 58      |FILD DWORD PTR SS:            ;用户名位数入ST(0)
0040170B|. 0FBEC3         |MOVSX EAX,BL                            ;EAX=BL
0040170E|. DD5C24 24      |FSTP QWORD PTR SS:            ;用户名位数入ST(7)
00401712|. 894424 58      |MOV DWORD PTR SS:,EAX         ;用户名ASCII入SS:
00401716|. DB4424 58      |FILD DWORD PTR SS:            ;用户名入ST(0) 10进制
0040171A|. 0FBECB         |MOVSX ECX,BL                            ;ECX=BL
0040171D|. D9FA         |FSQRT                                 ;ST(0)开平方
0040171F|. 0FAFCE         |IMUL ECX,ESI                            ;用户名位数与其对应注册码ASCII码相乘
00401722|. DC4C24 24      |FMUL QWORD PTR SS:            ;用户名位数与其对应注册码ASCII码(10进制)平方根相乘
00401726|. DC05 28254000|FADD QWORD PTR DS:            ;乘积+1
0040172C|. 0FAFCE         |IMUL ECX,ESI                            ;40171F乘积与用户名位数相乘
0040172F|. 894C24 58      |MOV DWORD PTR SS:,ECX
00401733|. DB4424 58      |FILD DWORD PTR SS:            ;用户名入ST(0) 10进制
00401737|. DEC9         |FMULP ST(1),ST                        ;ST(0)*ST(1)结果入ST(0)
00401739|. D8C1         |FADD ST,ST(1)                           ;ST(0)+ST(1)结果入ST(7)
0040173B|. E8 36040000    |CALL <JMP.&MSVCRT._ftol>
00401740|. 99             |CDQ
00401741|. DDD8         |FSTP ST
00401743|. B9 A0860100    |MOV ECX,186A0
00401748|. F7F9         |IDIV ECX                              ;求前面求出数除以100000的余数,第一段基础数据
0040174A|. 895424 14      |MOV DWORD PTR SS:,EDX
0040174E|. 0FBED3         |MOVSX EDX,BL                            ;第二段基础数据开始:
00401751|. 895424 58      |MOV DWORD PTR SS:,EDX
00401755|. DB4424 58      |FILD DWORD PTR SS:
00401759|. DD05 20254000|FLD QWORD PTR DS:
0040175F|. E8 0C040000    |CALL <JMP.&MSVCRT._CIpow>               ;用户名ASCII码平方
00401764|. DC4C24 24      |FMUL QWORD PTR SS:            ;再乘以位数
00401768|. E8 09040000    |CALL <JMP.&MSVCRT._ftol>
0040176D|. DB4424 14      |FILD DWORD PTR SS:
00401771|. 8BCE         |MOV ECX,ESI
00401773|. 0FAFCD         |IMUL ECX,EBP                            ;上次算出本段算出值乘以用户名位数
00401776|. D9C0         |FLD ST
00401778|. D9FA         |FSQRT                                 ;求开方
0040177A|. 03C1         |ADD EAX,ECX
0040177C|. B9 A0860100    |MOV ECX,186A0
00401781|. 99             |CDQ
00401782|. F7F9         |IDIV ECX                              ;求前面求出数除以100000的余数,第二段基础数据
00401784|. 8BEA         |MOV EBP,EDX
00401786|. E8 EB030000    |CALL <JMP.&MSVCRT._ftol>                ;第三段基础数据开始:
0040178B|. 03C5         |ADD EAX,EBP
0040178D|. B9 A0860100    |MOV ECX,186A0
00401792|. 99             |CDQ
00401793|. F7F9         |IDIV ECX                              ;求前面求出数除以100000的余数,第三段基础数据
00401795|. 46             |INC ESI
00401796|. 3BF7         |CMP ESI,EDI
00401798|. 897424 58      |MOV DWORD PTR SS:,ESI
0040179C|. 8BDA         |MOV EBX,EDX
0040179E|.^0F8E 5BFFFFFF\JLE Crack_Me.004016FF                   ; 循环次数小于等于用户名位数继续循环
004017A4|. DDD8         FSTP ST
004017A6|> 33C0         XOR EAX,EAX                              ;置循环头0
004017A8|> 8BD0         /MOV EDX,EAX                           ;循环5次:0--4
004017AA|. 8B4C24 14      |MOV ECX,DWORD PTR SS:
004017AE|. 0FAFD0         |IMUL EDX,EAX
004017B1|. 0FAFD0         |IMUL EDX,EAX
004017B4|. 8D540A 1F      |LEA EDX,DWORD PTR DS:       ;EAX^3+第一段数据+31
004017B8|. 81E2 7F000080|AND EDX,8000007F
004017BE|. 79 05          |JNS SHORT Crack_Me.004017C5
004017C0|. 4A             |DEC EDX
004017C1|. 83CA 80      |OR EDX,FFFFFF80
004017C4|. 42             |INC EDX
004017C5|> 885404 2C      |MOV BYTE PTR SS:,DL         ;DL入 SS:,后面用来计算1-5位注册码用。
004017C9|. 40             |INC EAX                                 ;EAX+1
004017CA|. 83F8 05      |CMP EAX,5                              
004017CD|.^7C D9          \JL SHORT Crack_Me.004017A8
004017CF|. B8 05000000    MOV EAX,5                              ;置循环头
004017D4|> 8BC8         /MOV ECX,EAX                           ;循环5次:5--9
004017D6|. 0FAFC8         |IMUL ECX,EAX
004017D9|. 0FAFC8         |IMUL ECX,EAX
004017DC|. 8D5429 1F      |LEA EDX,DWORD PTR DS:       ;EAX^3+第二段基础数据数据+31
004017E0|. 81E2 7F000080|AND EDX,8000007F
004017E6|. 79 05          |JNS SHORT Crack_Me.004017ED
004017E8|. 4A             |DEC EDX
004017E9|. 83CA 80      |OR EDX,FFFFFF80
004017EC|. 42             |INC EDX
004017ED|> 885404 2C      |MOV BYTE PTR SS:,DL         ;DL入 SS:,后面用来计算6-10位注册码用
004017F1|. 40             |INC EAX                                 ;EAX+1
004017F2|. 83F8 0A      |CMP EAX,0A                              
004017F5|.^7C DD          \JL SHORT Crack_Me.004017D4
004017F7|. B8 0A000000    MOV EAX,0A                               ;置循环头
004017FC|> 8BC8         /MOV ECX,EAX                           ;循环5次:10--14
004017FE|. 0FAFC8         |IMUL ECX,EAX
00401801|. 0FAFC8         |IMUL ECX,EAX
00401804|. 8D5419 1F      |LEA EDX,DWORD PTR DS:       ;EAX^3+第三段基础数据数据+31
00401808|. 81E2 7F000080|AND EDX,8000007F
0040180E|. 79 05          |JNS SHORT Crack_Me.00401815
00401810|. 4A             |DEC EDX
00401811|. 83CA 80      |OR EDX,FFFFFF80
00401814|. 42             |INC EDX
00401815|> 885404 2C      |MOV BYTE PTR SS:,DL         ;DL入 SS:,后面用来计算11-15位注册码用
00401819|. 40             |INC EAX                                 ;EAX+1
0040181A|. 83F8 0F      |CMP EAX,0F                              
0040181D|.^7C DD          \JL SHORT Crack_Me.004017FC
0040181F|. B8 0F000000    MOV EAX,0F                               ;置循环头
00401824|> 8BC8         /MOV ECX,EAX                           ;循环5次:15--19
00401826|. 8B5424 10      |MOV EDX,DWORD PTR SS:
0040182A|. 0FAFC8         |IMUL ECX,EAX
0040182D|. 0FAFC8         |IMUL ECX,EAX
00401830|. 8D4C11 1F      |LEA ECX,DWORD PTR DS:       ;EAX^3+第四段基础数据+31
00401834|. 81E1 7F000080|AND ECX,8000007F
0040183A|. 79 05          |JNS SHORT Crack_Me.00401841
0040183C|. 49             |DEC ECX
0040183D|. 83C9 80      |OR ECX,FFFFFF80
00401840|. 41             |INC ECX
00401841|> 884C04 2C      |MOV BYTE PTR SS:,CL         ;DL入 SS:,后面用来计算15-20位注册码用
00401845|. 40             |INC EAX                                 ;EAX+1
00401846|. 83F8 14      |CMP EAX,14                              
00401849|.^7C D9          \JL SHORT Crack_Me.00401824
0040184B|. 33D2         XOR EDX,EDX
0040184D|. 33C9         XOR ECX,ECX                              ;计算注册码开始,循环头置0
0040184F|> 8A4414 2C      /MOV AL,BYTE PTR SS:         ;
00401853|. 3C 30          |CMP AL,30
00401855|. 7C 04          |JL SHORT Crack_Me.0040185B            ;小于跳
00401857|. 3C 39          |CMP AL,39
00401859|. 7E 29          |JLE SHORT Crack_Me.00401884             ;小于等于跳
0040185B|> 3C 41          |CMP AL,41
0040185D|. 7C 04          |JL SHORT Crack_Me.00401863            ;小于跳
0040185F|. 3C 5A          |CMP AL,5A
00401861|. 7E 21          |JLE SHORT Crack_Me.00401884             ;小于等于跳
00401863|> 3C 61          |CMP AL,61
00401865|. 7C 04          |JL SHORT Crack_Me.0040186B            ;小于跳
00401867|. 3C 7A          |CMP AL,7A
00401869|. 7E 19          |JLE SHORT Crack_Me.00401884             ;小于等于跳
0040186B|> 0FBEC0         |MOVSX EAX,AL
0040186E|. 8D4408 1F      |LEA EAX,DWORD PTR DS:
00401872|. 25 7F000080    |AND EAX,8000007F
00401877|. 79 05          |JNS SHORT Crack_Me.0040187E
00401879|. 48             |DEC EAX
0040187A|. 83C8 80      |OR EAX,FFFFFF80
0040187D|. 40             |INC EAX
0040187E|> 884414 2C      |MOV BYTE PTR SS:,AL
00401882|.^EB CB          |JMP SHORT Crack_Me.0040184F
00401884|> 83C1 07      |ADD ECX,7                               ;ECX循环加7
00401887|. 42             |INC EDX
00401888|. 81F9 8C000000|CMP ECX,8C                              ; ECX和140比较小于继续循环,大于等于跳出循环,也就是循

环20次俄!
0040188E|.^7C BF          \JL SHORT Crack_Me.0040184F
00401890|. 8D4C24 2C      LEA ECX,DWORD PTR SS:            ;计算注册码结束,来这里,注册码入ECX
00401894|. 8D5424 18      LEA EDX,DWORD PTR SS:
00401898|. 51             PUSH ECX
00401899|. 68 4C304000    PUSH Crack_Me.0040304C                   ;ASCII "%s"
0040189E|. 52             PUSH EDX
0040189F|. E8 82020000    CALL <JMP.&MFC42.#2818>
004018A4|. 83C4 0C      ADD ESP,0C
004018A7|> 8B7424 54      MOV ESI,DWORD PTR SS:
004018AB|. 8D4424 18      LEA EAX,DWORD PTR SS:
004018AF|. 50             PUSH EAX
004018B0|. 8BCE         MOV ECX,ESI
004018B2|. E8 69020000    CALL <JMP.&MFC42.#535>
004018B7|. C74424 20 0100>MOV DWORD PTR SS:,1
004018BF|. 8D4C24 18      LEA ECX,DWORD PTR SS:
004018C3|. C64424 4C 00   MOV BYTE PTR SS:,0
004018C8|. E8 33010000    CALL <JMP.&MFC42.#800>
004018CD|. 8B4C24 44      MOV ECX,DWORD PTR SS:
004018D1|. 8BC6         MOV EAX,ESI
004018D3|. 5F             POP EDI
004018D4|. 5E             POP ESI
004018D5|. 5D             POP EBP
004018D6|. 5B             POP EBX
004018D7|. 64:890D 000000>MOV DWORD PTR FS:,ECX
004018DE|. 83C4 40      ADD ESP,40
004018E1\. C2 0800      RET 8




四、算法分析总结

   注册码的计算分为三个阶段:

1、计算四段基础数据,前三段是用用户名计算出,第四组是用C盘序列号计算出。

2、分别用前面四组基础数据分别计算出5组数据码,总为20组数据码,用以计算注册码。

3、用20组数据码计算出20位注册码。

五、注册算法

用户名:busheler
注册码:G0kXIDhnGvowqm0vN2AR

好繁哪!!做个注册机可能比写算法简单多了。

贴上易语言注册机过程码(我正在学习易语言中。。。。),因代码没有优化,显得有点乱,但不影响理解。
可以对照上面的注册分析看。
===================================================
.版本 2

.程序集 窗口程序集1

.子程序 _取消_被单击

销毁 ()

.子程序 _确定_被单击
.局部变量 用户名, 文本型
.局部变量 用户名长度, 长整数型

用户名 = 删全部空 (输入编辑框.内容)
用户名长度 = 取文本长度 (用户名)
.如果 (用户名长度 < 1)
    结果编辑框.内容 = “请输入用户名!”
.否则
    结果编辑框.内容 = 注册码 (用户名, 用户名长度)
    返回 ()
.如果结束
返回 ()

.子程序 __启动窗口_创建完毕

结果编辑框.内容 = busheler@****.com

.子程序 注册码, 文本型
.参数 用户名, 文本型
.参数 用户名长度, 长整数型
.局部变量 c盘序列号, 文本型
.局部变量 异或值, 长整数型
.局部变量 a, 整数型
.局部变量 基础1, 长整数型
.局部变量 基础2, 长整数型
.局部变量 基础3, 长整数型
.局部变量 基础4, 长整数型
.局部变量 数据码, 文本型
.局部变量 数据码1, 文本型
.局部变量 数据码2, 文本型
.局部变量 数据码3, 文本型
.局部变量 数据码4, 文本型
.局部变量 注册码, 文本型
.局部变量 中间码, 文本型
.局部变量 n, 整数型
.局部变量 最后注册码, 文本型
.局部变量 aa, 整数型
.局部变量 bb, 长整数型
.局部变量 cc, 长整数型
.局部变量 ee, 文本型


' 程序第一部分:计算四段基础数据:
基础1 = 0
基础2 = 0
基础3 = 0
基础4 = 0

' 取C盘序列号。
c盘序列号 = 取磁盘序列号 ()

' C盘序列号与19830326做异或运算,并是第四段基础数据。
异或值 = 位异或 (428016422, 到数值 (取十进制文本 (c盘序列号, 16)))


' 开始用用户名计算出四段基础数据:
.变量循环首 (1, 用户名长度, 1, n)
    a = 取代码 (用户名, n)
    基础1 = 取整 ((求次方 (a, 1 ÷ 2) × n + 1) × a × n × n + 基础1) % 100000
    基础2 = (求次方 (a, 2) × n + 基础2 × n) % 100000
    基础3 = (基础2 + 取整 (求次方 (基础1, 1 ÷ 2))) % 100000
.变量循环尾 ()
基础4 = 异或值
' 计算结束!

' 程序第二部分,计算出20组数据码:
数据码 = “”
数据码1 = “”
数据码2 = “”
数据码3 = “”
数据码4 = “”

' 计算第一组1-5组数据码:
数据码1 = 计算数据码 (基础1, 0, 4)

' 计算第二组5-10组数据码:
数据码2 = 计算数据码 (基础2, 5, 9)

' 计算第三组10-15组数据码:
数据码3 = 计算数据码 (基础3, 10, 14)

' 计算第四组15-20组数据码:
数据码4 = 计算数据码 (基础4, 15, 19)

数据码 = 数据码1 + 数据码2 + 数据码3 + 数据码4

' 程序第三部分,计算注册码:
注册码 = 计算注册码 (数据码, 0, 133)

返回 (注册码)



.子程序 取磁盘序列号, 文本型, , 读取磁盘序列号,你可以更改盘符来取不同盘的序列号
.局部变量 pos, 整数型
.局部变量 HiWord, 整数型
.局部变量 LoWord, 长整数型
.局部变量 VolumeSN, 整数型
.局部变量 MaxFNLen, 整数型
.局部变量 Temp1, 文本型
.局部变量 Temp2, 文本型
.局部变量 DriveVolume, 文本型


DriveVolume = “C:\”
Temp1 = 取空白文本 (255)
Temp2 = 取空白文本 (255)

pos = GetVolumeInformation (DriveVolume, Temp1, 255, VolumeSN, 0, 0, Temp2, 255)

返回 (到文本 (取十六进制文本 (VolumeSN)))



.子程序 计算数据码, 文本型
.参数 基础, 长整数型
.参数 x1, 整数型
.参数 x2, 整数型
.局部变量 y, 整数型
.局部变量 a1, 长整数型
.局部变量 a2, 长整数型
.局部变量 aa, 整数型
.局部变量 ab, 整数型
.局部变量 数据码, 文本型

数据码 = “”

.变量循环首 (x1, x2, 1, y)
    a1 = y × y × y + 基础 + 31
    aa = 位与 (a1, -2147483521)
    .如果 (aa < 0)
      aa = 位或 (aa - 1, -128) + 1
    .否则

    .如果结束

    .如果 (取文本长度 (取文本右边 (到文本 (取十六进制文本 (aa)), 2)) = 1)
      数据码 = 数据码 + “0”
    .否则
      .如果 (取文本长度 (取文本右边 (到文本 (取十六进制文本 (aa)), 2)) = 0)
            数据码 = 数据码 + “00”
      .否则

      .如果结束

    .如果结束

    数据码 = 数据码 + 取文本右边 (到文本 (取十六进制文本 (aa)), 2)

.变量循环尾 ()
返回 (数据码)


.子程序 计算注册码, 文本型
.参数 数据码, 文本型
.参数 x1, 整数型
.参数 x2, 整数型
.局部变量 n, 整数型
.局部变量 a, 长整数型
.局部变量 b, 长整数型
.局部变量 c, 长整数型
.局部变量 f, 文本型
.局部变量 xunhuan, 整数型
.局部变量 zhucema, 文本型
.局部变量 g, 长整数型

zhucema = “”
f = “”
xunhuan = 0

x1 = 0
x2 = 133

.变量循环首 (x1, x2, 7, n)
    a = 到数值 (取十进制文本 (取文本中间 (数据码, n ÷ 7 × 2 + 1, 2), 16))

    ' 输出调试文本 (到文本 (a))
    g = a
    .循环判断首 ()
      输出调试文本 (到文本 (g))
      .如果 (g ≥ 48)
            .如果 (g > 57)
                .如果 (g ≥ 65)
                  .如果 (g > 90)
                        .如果 (g ≥ 97)
                            .如果 (g > 122)
                              b = g + n + 31
                              c = 位与 (b, -2147483521)
                              .如果 (c < 0)
                                    c = 位或 (c - 1, -128) + 1
                              .否则

                              .如果结束

                              .如果 (取文本长度 (取文本右边 (到文本 (取十六进制文本 (c)), 2)) = 1)
                                    f = “0” + 取文本右边 (到文本 (取十六进制文本 (c)), 2)
                              .否则
                                    .如果 (取文本长度 (取文本右边 (到文本 (取十六进制文本 (c)), 2)) = 0)
                                        f = “00” + 取文本右边 (到文本 (取十六进制文本 (c)), 2)
                                    .否则
                                        f = 取文本右边 (到文本 (取十六进制文本 (c)), 2)
                                    .如果结束

                              .如果结束
                              g = 到数值 (取十进制文本 (f, 16))
                              到循环尾 ()

                            .否则
                              跳出循环 ()
                            .如果结束

                        .否则
                            b = g + n + 31
                            c = 位与 (b, -2147483521)
                            .如果 (c < 0)
                              c = 位或 (c - 1, -128) + 1
                            .否则

                            .如果结束

                            .如果 (取文本长度 (取文本右边 (到文本 (取十六进制文本 (c)), 2)) = 1)
                              f = “0” + 取文本右边 (到文本 (取十六进制文本 (c)), 2)
                            .否则
                              .如果 (取文本长度 (取文本右边 (到文本 (取十六进制文本 (c)), 2)) = 0)
                                    f = “00” + 取文本右边 (到文本 (取十六进制文本 (c)), 2)
                              .否则
                                    f = 取文本右边 (到文本 (取十六进制文本 (c)), 2)
                              .如果结束

                            .如果结束
                            g = 到数值 (取十进制文本 (f, 16))
                            到循环尾 ()

                        .如果结束

                  .否则
                        跳出循环 ()
                  .如果结束

                .否则
                  b = g + n + 31
                  c = 位与 (b, -2147483521)
                  .如果 (c < 0)
                        c = 位或 (c - 1, -128) + 1
                  .否则

                  .如果结束

                  .如果 (取文本长度 (取文本右边 (到文本 (取十六进制文本 (c)), 2)) = 1)
                        f = “0” + 取文本右边 (到文本 (取十六进制文本 (c)), 2)
                  .否则
                        .如果 (取文本长度 (取文本右边 (到文本 (取十六进制文本 (c)), 2)) = 0)
                            f = “00” + 取文本右边 (到文本 (取十六进制文本 (c)), 2)
                        .否则
                            f = 取文本右边 (到文本 (取十六进制文本 (c)), 2)
                        .如果结束

                  .如果结束
                  g = 到数值 (取十进制文本 (f, 16))
                  到循环尾 ()

                .如果结束

            .否则
                跳出循环 ()
            .如果结束

      .否则
            b = g + n + 31
            c = 位与 (b, -2147483521)
            .如果 (c < 0)
                c = 位或 (c - 1, -128) + 1
            .否则

            .如果结束

            .如果 (取文本长度 (取文本右边 (到文本 (取十六进制文本 (c)), 2)) = 1)
                f = “0” + 取文本右边 (到文本 (取十六进制文本 (c)), 2)
            .否则
                .如果 (取文本长度 (取文本右边 (到文本 (取十六进制文本 (c)), 2)) = 0)
                  f = “00” + 取文本右边 (到文本 (取十六进制文本 (c)), 2)
                .否则
                  f = 取文本右边 (到文本 (取十六进制文本 (c)), 2)
                .如果结束

            .如果结束
            g = 到数值 (取十进制文本 (f, 16))
            到循环尾 ()

      .如果结束

    .循环判断尾 (xunhuan = 0)

    ' 输出调试文本 (到文本 (字符 (g)))
    zhucema = zhucema + 到文本 (字符 (g))

.变量循环尾 ()

返回 (zhucema)

-------------------------------------------------------------------------
【版权声明】交流学习,非商业应用,转载时请保证其完整!

[ 本帖最后由 busheler 于 2006-1-31 00:41 编辑 ]

busheler 发表于 2006-1-15 22:29:27

已贴上易语言注册机过程码(我正在学习易语言中。。。。),因代码没有优化,显得有点乱,但不影响理解。
可以对照上面的注册分析看。

[ 本帖最后由 busheler 于 2006-1-16 01:33 编辑 ]

索尼克 发表于 2006-1-23 05:26:06

4015fa
1
50
1
内存
eax

顺便问一句,内存方式和寄存器方式有啥区别,为啥内存方式里还有寄存器这一项?

hongxin2005 发表于 2006-2-8 03:49:38

对于刚学的菜鸟是很不错的,非常感谢!!!!

baoyinan 发表于 2006-2-8 04:30:23

很适合像我一样的菜鸟啊!!
baoyinan
jkr9efHNUxl7DuA373QG

[ 本帖最后由 baoyinan 于 2006-2-7 20:42 编辑 ]

lzc627 发表于 2006-3-6 18:06:22

纯支持一下

野猫III 发表于 2006-3-23 22:26:46

原帖由 busheler 于 2006-1-14 00:31 发表
【破文标题】CrackMe By ErShu算法分析
【破文作者】Busheler
【作者邮箱】[email protected]
【作者主页】
【破解工具】odbg110,win32dasm,PEiD v0.94
【破解平台】Windows2000
【软件名称】CrackMe By...

弦呼。。。
页: 1 [2] 3
查看完整版本: 一个很简单的CRACKME