飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

楼主: yijun

一个很简单的CRACKME

[复制链接]
  • TA的每日心情
    无聊
    2020-4-10 17:02
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 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 ]
    PYG19周年生日快乐!
    xianju110 该用户已被删除
    发表于 2006-1-8 10:41:36 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-1-9 10:13:28 | 显示全部楼层
    算法call里还有GetVolumeInformationA这个函数啊~~每台机器还不一样啊~
    PYG19周年生日快乐!

    该用户从未签到

    发表于 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 [esp+04]
    :004015E1 50                      push eax
    :004015E2 52                      push edx
    :004015E3 8BCE                    mov ecx, esi
    :004015E5 E866000000              call 00401650
    :004015EA 8B4664                  mov eax, dword ptr [esi+64]
    :004015ED C744241000000000        mov [esp+10], 00000000
    :004015F5 50                      push eax
    :004015F6 8B442408                mov eax, dword ptr [esp+08]
    :004015FA 50                      push eax

    * Reference To: MSVCRT._mbscmp, Ord:0159h
                                      |
    :004015FB FF15C8214000            Call dword ptr [004021C8]
    :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:[0]
    0040159D   . 50             PUSH EAX
    0040159E   . 64:8925 000000>MOV DWORD PTR FS:[0],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:[ESI+60]            ;  用户名入ECX
    004015B3   . 8D46 60        LEA EAX,DWORD PTR DS:[ESI+60]
    004015B6   . 8B51 F8        MOV EDX,DWORD PTR DS:[ECX-8]             ;  用户名长度入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:[ESP+4]
    004015D2   . 64:890D 000000>MOV DWORD PTR FS:[0],ECX
    004015D9   . 83C4 10        ADD ESP,10
    004015DC   . C3             RET
    004015DD   > 8D5424 04      LEA EDX,DWORD PTR SS:[ESP+4]
    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:[ESI+64]            ;  试练码入EAX
    004015ED   . C74424 10 0000>MOV DWORD PTR SS:[ESP+10],0
    004015F5   . 50             PUSH EAX                                 ; /s2
    004015F6   . 8B4424 08      MOV EAX,DWORD PTR SS:[ESP+8]             ; |真注册码入EAX
    004015FA   . 50             PUSH EAX                                 ; |s1
    004015FB   . FF15 C8214000  CALL 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:[ESP+4]
    00401633   . C74424 10 FFFF>MOV DWORD PTR SS:[ESP+10],-1
    0040163B   . E8 C0030000    CALL <JMP.&MFC42.#800>
    00401640   . 8B4C24 08      MOV ECX,DWORD PTR SS:[ESP+8]
    00401644   . 5E             POP ESI
    00401645   . 64:890D 000000>MOV DWORD PTR FS:[0],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:[0]
    0040165D  |. 50             PUSH EAX
    0040165E  |. 64:8925 000000>MOV DWORD PTR FS:[0],ESP
    00401665  |. 83EC 34        SUB ESP,34
    00401668  |. 33C0           XOR EAX,EAX
    0040166A  |. 53             PUSH EBX
    0040166B  |. 894424 21      MOV DWORD PTR SS:[ESP+21],EAX
    0040166F  |. 55             PUSH EBP
    00401670  |. 894424 29      MOV DWORD PTR SS:[ESP+29],EAX
    00401674  |. 56             PUSH ESI
    00401675  |. 894424 31      MOV DWORD PTR SS:[ESP+31],EAX
    00401679  |. 33DB           XOR EBX,EBX
    0040167B  |. 894424 35      MOV DWORD PTR SS:[ESP+35],EAX
    0040167F  |. 57             PUSH EDI
    00401680  |. 8D4C24 18      LEA ECX,DWORD PTR SS:[ESP+18]
    00401684  |. 895C24 20      MOV DWORD PTR SS:[ESP+20],EBX
    00401688  |. 885C24 2C      MOV BYTE PTR SS:[ESP+2C],BL
    0040168C  |. 894424 3D      MOV DWORD PTR SS:[ESP+3D],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:[ESP+1C]            ; |
    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:[ESP+6C],ESI            ; |
    004016B0  |. 895C24 34      MOV DWORD PTR SS:[ESP+34],EBX            ; |
    004016B4  |. 33ED           XOR EBP,EBP                              ; |
    004016B6  |. 895C24 30      MOV DWORD PTR SS:[ESP+30],EBX            ; |
    004016BA  |. FF15 00204000  CALL DWORD PTR DS:[<&KERNEL32.GetVolumeI>; \GetVolumeInformationA
    004016C0  |. 8B4424 10      MOV EAX,DWORD PTR SS:[ESP+10]            ;  磁盘信息:即C盘序列号A40D9506入EAX
    004016C4  |. 8B5424 58      MOV EDX,DWORD PTR SS:[ESP+58]
    004016C8  |. 35 26038319    XOR EAX,19830326                         ;  C盘序列号与19830326做异或运算,结果入EAX ,也就是第四

    段基础数据
    004016CD  |. 83C9 FF        OR ECX,FFFFFFFF
    004016D0  |. 8B12           MOV EDX,DWORD PTR DS:[EDX]               ;  用户名入EDX
    004016D2  |. 894424 10      MOV DWORD PTR SS:[ESP+10],EAX
    004016D6  |. 8BFA           MOV EDI,EDX
    004016D8  |. 33C0           XOR EAX,EAX
    004016DA  |. F2:AE          REPNE SCAS BYTE PTR ES:[EDI]
    004016DC  |. F7D1           NOT ECX
    004016DE  |. 49             DEC ECX
    004016DF  |. 895424 1C      MOV DWORD PTR SS:[ESP+1C],EDX
    004016E3  |. 8BF9           MOV EDI,ECX
    004016E5  |. 0F84 BC010000  JE Crack_Me.004018A7
    004016EB  |. 3BFE           CMP EDI,ESI
    004016ED  |. 897424 58      MOV DWORD PTR SS:[ESP+58],ESI
    004016F1  |. 0F8C AF000000  JL Crack_Me.004017A6
    004016F7  |. DD05 30254000  FLD QWORD PTR DS:[402530]                ;  ST(0)=0
    004016FD  |. EB 04          JMP SHORT Crack_Me.00401703
    004016FF  |> 8B5424 1C      /MOV EDX,DWORD PTR SS:[ESP+1C]           ;  第一段基础数据开始:用户名入EDX
    00401703  |> 8A5C32 FF       MOV BL,BYTE PTR DS:[EDX+ESI-1]          ;  用户名ASCII码入BL
    00401707  |. DB4424 58      |FILD DWORD PTR SS:[ESP+58]              ;  用户名位数入ST(0)
    0040170B  |. 0FBEC3         |MOVSX EAX,BL                            ;  EAX=BL
    0040170E  |. DD5C24 24      |FSTP QWORD PTR SS:[ESP+24]              ;  用户名位数入ST(7)
    00401712  |. 894424 58      |MOV DWORD PTR SS:[ESP+58],EAX           ;  用户名ASCII入SS:[ESP+58]
    00401716  |. DB4424 58      |FILD DWORD PTR SS:[ESP+58]              ;  用户名入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:[ESP+24]              ;  用户名位数与其对应注册码ASCII码(10进制)平方根相乘
    00401726  |. DC05 28254000  |FADD QWORD PTR DS:[402528]              ;  乘积+1
    0040172C  |. 0FAFCE         |IMUL ECX,ESI                            ;  40171F乘积与用户名位数相乘
    0040172F  |. 894C24 58      |MOV DWORD PTR SS:[ESP+58],ECX
    00401733  |. DB4424 58      |FILD DWORD PTR SS:[ESP+58]              ;  用户名入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:[ESP+14],EDX
    0040174E  |. 0FBED3         |MOVSX EDX,BL                            ;  第二段基础数据开始:
    00401751  |. 895424 58      |MOV DWORD PTR SS:[ESP+58],EDX
    00401755  |. DB4424 58      |FILD DWORD PTR SS:[ESP+58]
    00401759  |. DD05 20254000  |FLD QWORD PTR DS:[402520]
    0040175F  |. E8 0C040000    |CALL <JMP.&MSVCRT._CIpow>               ;  用户名ASCII码平方
    00401764  |. DC4C24 24      |FMUL QWORD PTR SS:[ESP+24]              ;  再乘以位数
    00401768  |. E8 09040000    |CALL <JMP.&MSVCRT._ftol>
    0040176D  |. DB4424 14      |FILD DWORD PTR SS:[ESP+14]
    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:[ESP+58],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:[ESP+14]
    004017AE  |. 0FAFD0         |IMUL EDX,EAX
    004017B1  |. 0FAFD0         |IMUL EDX,EAX
    004017B4  |. 8D540A 1F      |LEA EDX,DWORD PTR DS:[EDX+ECX+1F]       ;  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:[ESP+EAX+2C],DL         ;  DL入 SS:[ESP+EAX+2C],后面用来计算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:[ECX+EBP+1F]       ;  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:[ESP+EAX+2C],DL         ;  DL入 SS:[ESP+EAX+2C],后面用来计算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:[ECX+EBX+1F]       ;  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:[ESP+EAX+2C],DL         ;  DL入 SS:[ESP+EAX+2C],后面用来计算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:[ESP+10]
    0040182A  |. 0FAFC8         |IMUL ECX,EAX
    0040182D  |. 0FAFC8         |IMUL ECX,EAX
    00401830  |. 8D4C11 1F      |LEA ECX,DWORD PTR DS:[ECX+EDX+1F]       ;  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:[ESP+EAX+2C],CL         ;  DL入 SS:[ESP+EAX+2C],后面用来计算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:[ESP+EDX+2C]         ;  
    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:[EAX+ECX+1F]
    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:[ESP+EDX+2C],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:[ESP+2C]            ;  计算注册码结束,来这里,注册码入ECX
    00401894  |. 8D5424 18      LEA EDX,DWORD PTR SS:[ESP+18]
    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:[ESP+54]
    004018AB  |. 8D4424 18      LEA EAX,DWORD PTR SS:[ESP+18]
    004018AF  |. 50             PUSH EAX
    004018B0  |. 8BCE           MOV ECX,ESI
    004018B2  |. E8 69020000    CALL <JMP.&MFC42.#535>
    004018B7  |. C74424 20 0100>MOV DWORD PTR SS:[ESP+20],1
    004018BF  |. 8D4C24 18      LEA ECX,DWORD PTR SS:[ESP+18]
    004018C3  |. C64424 4C 00   MOV BYTE PTR SS:[ESP+4C],0
    004018C8  |. E8 33010000    CALL <JMP.&MFC42.#800>
    004018CD  |. 8B4C24 44      MOV ECX,DWORD PTR SS:[ESP+44]
    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:[0],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 编辑 ]

    评分

    参与人数 1威望 +32 飘云币 +4 收起 理由
    飘云 + 32 + 4 精品文章

    查看全部评分

    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-1-15 22:29:27 | 显示全部楼层
    已贴上易语言注册机过程码(我正在学习易语言中。。。。),因代码没有优化,显得有点乱,但不影响理解。
    可以对照上面的注册分析看。

    [ 本帖最后由 busheler 于 2006-1-16 01:33 编辑 ]
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-1-23 05:26:06 | 显示全部楼层
    4015fa
    1
    50
    1
    内存
    eax

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

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?加入我们

    x
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-2-8 03:49:38 | 显示全部楼层
    对于刚学的菜鸟是很不错的,非常感谢!!!!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-2-8 04:30:23 | 显示全部楼层
    很适合像我一样的菜鸟啊!!
    baoyinan
    jkr9efHNUxl7DuA373QG

    [ 本帖最后由 baoyinan 于 2006-2-7 20:42 编辑 ]
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2019-1-26 00:41
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2006-3-6 18:06:22 | 显示全部楼层
    纯支持一下
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2018-5-6 16:27
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    发表于 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  ...


    弦呼。。。
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表