飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 7815|回复: 6

[原创] 某驾考软件 算法分析

[复制链接]
  • TA的每日心情
    郁闷
    2018-1-26 16:44
  • 签到天数: 149 天

    [LV.7]常住居民III

    发表于 2016-1-30 02:15:54 | 显示全部楼层 |阅读模式
    【破文标题】某驾考软件算法分析
    【破文作者】JZL
    破解工具】OD
    【破解平台】XP SP3
    【软件名称】某驾考软件
    【保护方式】有壳
    【破解声明】破解在于交流思路和过程,请不要用于非法用途;
    ------------------------------------------------------------------------
    【破解过程】注册错误提示:

    ---------------------------
    错误
    ---------------------------
    注册码不正确,请重新输入!
    ---------------------------
    确定   
    ---------------------------

    OD载入后,直接运行起来。
    在可执行模块中,选择
    路径=C:\Documents and Settings\Administrator\桌面\*****.exe  //我隐藏了软件名称



    搜索字符串: 注册码不正确


    [Asm] 纯文本查看 复制代码
    0074AA72    5D              POP     EBP
    0074AA73    C3              RETN
    0074AA74    55              PUSH    EBP                                          ; 1、在提示 注册错误  的段首下断点
    0074AA75    8BEC            MOV     EBP, ESP
    0074AA77    83C4 F0         ADD     ESP, -0x10
    0074AA7A    33C9            XOR     ECX, ECX
    0074AA7C    894D F4         MOV     DWORD PTR SS:[EBP-0xC], ECX
    0074AA7F    894D F0         MOV     DWORD PTR SS:[EBP-0x10], ECX
    0074AA82    8955 F8         MOV     DWORD PTR SS:[EBP-0x8], EDX
    0074AA85    8945 FC         MOV     DWORD PTR SS:[EBP-0x4], EAX
    0074AA88    33C0            XOR     EAX, EAX
    0074AA8A    55              PUSH    EBP
    0074AA8B    68 32AB7400     PUSH    0074AB32
    0074AA90    64:FF30         PUSH    DWORD PTR FS:[EAX]
    0074AA93    64:8920         MOV     DWORD PTR FS:[EAX], ESP
    
    ……
    0074AAC5    E8 DEFEFFFF     CALL    0074A9A8                                     ; 跟过以后,才知道这个CALL是验证的CALL
    0074AACA    8B45 FC         MOV     EAX, DWORD PTR SS:[EBP-0x4]
    0074AACD    8B90 F8030000   MOV     EDX, DWORD PTR DS:[EAX+0x3F8]
    0074AAD3    8B45 FC         MOV     EAX, DWORD PTR SS:[EBP-0x4]
    0074AAD6    8B80 F4030000   MOV     EAX, DWORD PTR DS:[EAX+0x3F4]
    0074AADC    E8 5FEDFFFF     CALL    00749840                                     ; 2、这可能是验证的call
    		00749840    55              PUSH    EBP
    		00749841    8BEC            MOV     EBP, ESP
    		00749843    33C9            XOR     ECX, ECX
    		00749845    51              PUSH    ECX
    		00749846    51              PUSH    ECX
    		00749847    51              PUSH    ECX
    		00749848    51              PUSH    ECX
    		00749849    51              PUSH    ECX
    		0074984A    51              PUSH    ECX
    		0074984B    51              PUSH    ECX
    		0074984C    51              PUSH    ECX
    		0074984D    8955 F8         MOV     DWORD PTR SS:[EBP-0x8], EDX
    		00749850    8945 FC         MOV     DWORD PTR SS:[EBP-0x4], EAX
    		00749853    8B45 F8         MOV     EAX, DWORD PTR SS:[EBP-0x8]
    		00749856    E8 D1DECBFF     CALL    0040772C
    		0074985B    33C0            XOR     EAX, EAX
    		0074985D    55              PUSH    EBP
    		0074985E    68 12997400     PUSH    00749912
    		00749863    64:FF30         PUSH    DWORD PTR FS:[EAX]
    		00749866    64:8920         MOV     DWORD PTR FS:[EAX], ESP
    		00749869    C645 F7 00      MOV     BYTE PTR SS:[EBP-0x9], 0x0
    		0074986D    A0 20997400     MOV     AL, BYTE PTR DS:[0x749920]
    		00749872    50              PUSH    EAX
    		00749873    8D45 F0         LEA     EAX, DWORD PTR SS:[EBP-0x10]
    		00749876    50              PUSH    EAX
    		00749877    33C9            XOR     ECX, ECX
    		00749879    BA 30997400     MOV     EDX, 00749930                                ; -
    		0074987E    8B45 F8         MOV     EAX, DWORD PTR SS:[EBP-0x8]
    		00749881    E8 22F7CDFF     CALL    00428FA8
    		00749886    A0 20997400     MOV     AL, BYTE PTR DS:[0x749920]
    		0074988B    50              PUSH    EAX
    		0074988C    8D45 EC         LEA     EAX, DWORD PTR SS:[EBP-0x14]
    		0074988F    50              PUSH    EAX
    		00749890    8D55 E8         LEA     EDX, DWORD PTR SS:[EBP-0x18]
    		00749893    8B45 FC         MOV     EAX, DWORD PTR SS:[EBP-0x4]
    		00749896    E8 F9FDFFFF     CALL    00749694                                     ; 3、此CALL产生了真码
    				00749694    55              PUSH    EBP
    				00749695    8BEC            MOV     EBP, ESP
    				00749697    83C4 EC         ADD     ESP, -0x14
    				0074969A    33C9            XOR     ECX, ECX
    				0074969C    894D EC         MOV     DWORD PTR SS:[EBP-0x14], ECX
    				0074969F    894D F4         MOV     DWORD PTR SS:[EBP-0xC], ECX
    				007496A2    8955 F8         MOV     DWORD PTR SS:[EBP-0x8], EDX
    				007496A5    8945 FC         MOV     DWORD PTR SS:[EBP-0x4], EAX
    				007496A8    33C0            XOR     EAX, EAX
    				007496AA    55              PUSH    EBP
    				007496AB    68 32977400     PUSH    00749732
    				007496B0    64:FF30         PUSH    DWORD PTR FS:[EAX]
    				007496B3    64:8920         MOV     DWORD PTR FS:[EAX], ESP
    				007496B6    A0 40977400     MOV     AL, BYTE PTR DS:[0x749740]
    				007496BB    50              PUSH    EAX
    				007496BC    8D45 F4         LEA     EAX, DWORD PTR SS:[EBP-0xC]
    				007496BF    50              PUSH    EAX
    				007496C0    8D55 EC         LEA     EDX, DWORD PTR SS:[EBP-0x14]
    				007496C3    8B45 FC         MOV     EAX, DWORD PTR SS:[EBP-0x4]
    				007496C6    E8 91F9FFFF     CALL    0074905C
    				007496CB    8B45 EC         MOV     EAX, DWORD PTR SS:[EBP-0x14]                 ; 机器码给EAX
    				007496CE    33C9            XOR     ECX, ECX
    				007496D0    BA 50977400     MOV     EDX, 00749750                                ; -
    				007496D5    E8 CEF8CDFF     CALL    00428FA8
    				007496DA    8B45 F4         MOV     EAX, DWORD PTR SS:[EBP-0xC]
    				007496DD    8945 F0         MOV     DWORD PTR SS:[EBP-0x10], EAX
    				007496E0    837D F0 00      CMP     DWORD PTR SS:[EBP-0x10], 0x0
    				007496E4    74 0B           JE      SHORT 007496F1
    				007496E6    8B45 F0         MOV     EAX, DWORD PTR SS:[EBP-0x10]
    				007496E9    83E8 04         SUB     EAX, 0x4
    				007496EC    8B00            MOV     EAX, DWORD PTR DS:[EAX]
    				007496EE    8945 F0         MOV     DWORD PTR SS:[EBP-0x10], EAX
    				007496F1    837D F0 10      CMP     DWORD PTR SS:[EBP-0x10], 0x10                ; 检查机器码位数 要求是16位
    				007496F5    75 10           JNZ     SHORT 00749707
    				007496F7    8B4D F8         MOV     ECX, DWORD PTR SS:[EBP-0x8]
    				007496FA    8B55 F4         MOV     EDX, DWORD PTR SS:[EBP-0xC]
    				007496FD    8B45 FC         MOV     EAX, DWORD PTR SS:[EBP-0x4]
    				00749700    E8 9BFDFFFF     CALL    007494A0                                     ; 4、上面是检查机器码是否合法,又把机器码作为参数传进来,这个CALL必定和真码有关
    						007494A0    55              PUSH    EBP
    						007494A1    8BEC            MOV     EBP, ESP
    						007494A3    51              PUSH    ECX
    						007494A4    B9 08000000     MOV     ECX, 0x8
    						007494A9    6A 00           PUSH    0x0
    						007494AB    6A 00           PUSH    0x0
    						007494AD    49              DEC     ECX
    						007494AE  ^ 75 F9           JNZ     SHORT 007494A9
    						007494B0    51              PUSH    ECX
    						007494B1    874D FC         XCHG    DWORD PTR SS:[EBP-0x4], ECX
    						007494B4    53              PUSH    EBX
    						007494B5    894D F4         MOV     DWORD PTR SS:[EBP-0xC], ECX
    						007494B8    8955 F8         MOV     DWORD PTR SS:[EBP-0x8], EDX
    						007494BB    8945 FC         MOV     DWORD PTR SS:[EBP-0x4], EAX
    						007494BE    8B45 F8         MOV     EAX, DWORD PTR SS:[EBP-0x8]
    						007494C1    E8 66E2CBFF     CALL    0040772C
    						007494C6    33C0            XOR     EAX, EAX
    						007494C8    55              PUSH    EBP
    						007494C9    68 74967400     PUSH    00749674
    						007494CE    64:FF30         PUSH    DWORD PTR FS:[EAX]
    						007494D1    64:8920         MOV     DWORD PTR FS:[EAX], ESP
    						007494D4    A0 80967400     MOV     AL, BYTE PTR DS:[0x749680]
    						007494D9    50              PUSH    EAX
    						007494DA    8D45 BC         LEA     EAX, DWORD PTR SS:[EBP-0x44]
    						007494DD    50              PUSH    EAX
    						007494DE    33C9            XOR     ECX, ECX
    						007494E0    BA 90967400     MOV     EDX, 00749690                                ; -
    						007494E5    8B45 F8         MOV     EAX, DWORD PTR SS:[EBP-0x8]
    						007494E8    E8 BBFACDFF     CALL    00428FA8
    						007494ED    8B55 BC         MOV     EDX, DWORD PTR SS:[EBP-0x44]
    						007494F0    8D45 F8         LEA     EAX, DWORD PTR SS:[EBP-0x8]
    						007494F3    E8 78E5CBFF     CALL    00407A70
    						007494F8    8B45 F8         MOV     EAX, DWORD PTR SS:[EBP-0x8]
    						007494FB    8945 C0         MOV     DWORD PTR SS:[EBP-0x40], EAX
    						007494FE    837D C0 00      CMP     DWORD PTR SS:[EBP-0x40], 0x0
    						00749502    74 0B           JE      SHORT 0074950F
    						00749504    8B45 C0         MOV     EAX, DWORD PTR SS:[EBP-0x40]
    						00749507    83E8 04         SUB     EAX, 0x4                                     ; EAX=01CD8B7C, (UNICODE "2203450100000001")
    						0074950A    8B00            MOV     EAX, DWORD PTR DS:[EAX]
    						0074950C    8945 C0         MOV     DWORD PTR SS:[EBP-0x40], EAX
    						0074950F    8B45 C0         MOV     EAX, DWORD PTR SS:[EBP-0x40]
    						00749512    85C0            TEST    EAX, EAX
    						00749514    7E 42           JLE     SHORT 00749558
    						00749516    8945 C4         MOV     DWORD PTR SS:[EBP-0x3C], EAX
    						00749519    C745 F0 0100000>MOV     DWORD PTR SS:[EBP-0x10], 0x1
    						00749520    8B45 F8         MOV     EAX, DWORD PTR SS:[EBP-0x8]
    						00749523    8B55 F0         MOV     EDX, DWORD PTR SS:[EBP-0x10]
    						00749526    66:8B4450 FE    MOV     AX, WORD PTR DS:[EAX+EDX*2-0x2]
    						0074952B    66:8945 EA      MOV     WORD PTR SS:[EBP-0x16], AX                   ; AX=0032 机器码第一个字符:2 的ASCII码 32
    						0074952F    66:8B55 EA      MOV     DX, WORD PTR SS:[EBP-0x16]
    						00749533    8B45 FC         MOV     EAX, DWORD PTR SS:[EBP-0x4]                  ; 堆栈 SS:[0012F074]=01CAC5F0
    						00749536    E8 D9FEFFFF     CALL    00749414                                     ; 5、算法CALL
    								00749414    55              PUSH    EBP                                          ; 6、真正的算法段首
    								00749415    8BEC            MOV     EBP, ESP
    								00749417    83C4 F4         ADD     ESP, -0xC
    								0074941A    66:8955 FA      MOV     WORD PTR SS:[EBP-0x6], DX
    								0074941E    8945 FC         MOV     DWORD PTR SS:[EBP-0x4], EAX
    								00749421    0FB745 FA       MOVZX   EAX, WORD PTR SS:[EBP-0x6]
    								00749425    8945 F4         MOV     DWORD PTR SS:[EBP-0xC], EAX
    								00749428    8B45 F4         MOV     EAX, DWORD PTR SS:[EBP-0xC]
    								0074942B    83C0 D0         ADD     EAX, -0x30
    								0074942E    83E8 0A         SUB     EAX, 0xA
    								00749431    72 12           JB      SHORT 00749445
    								00749433    83C0 F9         ADD     EAX, -0x7
    								00749436    83E8 1A         SUB     EAX, 0x1A
    								00749439    72 23           JB      SHORT 0074945E
    								0074943B    83C0 FA         ADD     EAX, -0x6
    								0074943E    83E8 1A         SUB     EAX, 0x1A
    								00749441    72 34           JB      SHORT 00749477
    								00749443    EB 49           JMP     SHORT 0074948E
    								00749445    8B45 F4         MOV     EAX, DWORD PTR SS:[EBP-0xC]                  ; 计算开始
    								00749448    8B55 FC         MOV     EDX, DWORD PTR SS:[EBP-0x4]                  ; 逐位取机器码
    								0074944B    8B4482 04       MOV     EAX, DWORD PTR DS:[EDX+EAX*4+0x4]            ; 查询密码表,每个0到9的数字都有一个对应的值
    								0074944F    0145 F4         ADD     DWORD PTR SS:[EBP-0xC], EAX                  ; 0x32 + 0x9 =0x3B  数字的ASCII值 加上 对应的密码表值
    								00749452    837D F4 39      CMP     DWORD PTR SS:[EBP-0xC], 0x39
    								00749456    7E 36           JLE     SHORT 0074948E                               ; 如果结果小于0x39就跳转实现
    								00749458    836D F4 0A      SUB     DWORD PTR SS:[EBP-0xC], 0xA                  ; 0000003B-0xA=0x31  如果结果大于0x39 那么减0xA
    								0074945C    EB 30           JMP     SHORT 0074948E
    								0074945E    8B45 F4         MOV     EAX, DWORD PTR SS:[EBP-0xC]
    								00749461    8B55 FC         MOV     EDX, DWORD PTR SS:[EBP-0x4]
    								00749464    8B4482 04       MOV     EAX, DWORD PTR DS:[EDX+EAX*4+0x4]
    								00749468    0145 F4         ADD     DWORD PTR SS:[EBP-0xC], EAX
    								0074946B    837D F4 5A      CMP     DWORD PTR SS:[EBP-0xC], 0x5A
    								0074946F    7E 1D           JLE     SHORT 0074948E
    								00749471    836D F4 1A      SUB     DWORD PTR SS:[EBP-0xC], 0x1A
    								00749475    EB 17           JMP     SHORT 0074948E
    								00749477    8B45 F4         MOV     EAX, DWORD PTR SS:[EBP-0xC]
    								0074947A    8B55 FC         MOV     EDX, DWORD PTR SS:[EBP-0x4]
    								0074947D    8B4482 04       MOV     EAX, DWORD PTR DS:[EDX+EAX*4+0x4]
    								00749481    0145 F4         ADD     DWORD PTR SS:[EBP-0xC], EAX
    								00749484    837D F4 7A      CMP     DWORD PTR SS:[EBP-0xC], 0x7A
    								00749488    7E 04           JLE     SHORT 0074948E
    								0074948A    836D F4 1A      SUB     DWORD PTR SS:[EBP-0xC], 0x1A
    								0074948E    66:8B45 F4      MOV     AX, WORD PTR SS:[EBP-0xC]                    ; 接下来就是把ASCII转换成十进制的数字
    								00749492    66:8945 F8      MOV     WORD PTR SS:[EBP-0x8], AX
    								00749496    66:8B45 F8      MOV     AX, WORD PTR SS:[EBP-0x8]
    								0074949A    8BE5            MOV     ESP, EBP
    								0074949C    5D              POP     EBP
    								0074949D    C3              RETN
    						……
    						00749608    FF75 D8         PUSH    DWORD PTR SS:[EBP-0x28]                      ; 查完表后,还要重新排列下顺序,
    						0074960B    FF75 CC         PUSH    DWORD PTR SS:[EBP-0x34]                      ; 具体来说就是两个数字为一组,共ABCDEFGH 8组
    						0074960E    68 90967400     PUSH    00749690                                     ; -
    						00749613    FF75 D4         PUSH    DWORD PTR SS:[EBP-0x2C]                      ; 最后的顺序:DG-EB-FH-AC
    						00749616    FF75 E0         PUSH    DWORD PTR SS:[EBP-0x20]
    						00749619    68 90967400     PUSH    00749690                                     ; -
    						0074961E    FF75 D0         PUSH    DWORD PTR SS:[EBP-0x30]
    						00749621    FF75 C8         PUSH    DWORD PTR SS:[EBP-0x38]
    						00749624    68 90967400     PUSH    00749690                                     ; -
    						00749629    FF75 E4         PUSH    DWORD PTR SS:[EBP-0x1C]
    						0074962C    FF75 DC         PUSH    DWORD PTR SS:[EBP-0x24]
    						0074962F    8B45 F4         MOV     EAX, DWORD PTR SS:[EBP-0xC]
    						00749632    BA 0B000000     MOV     EDX, 0xB
    						00749637    E8 7CF0CBFF     CALL    004086B8
    						……
    				……
    
    		0074989B    8B45 E8         MOV     EAX, DWORD PTR SS:[EBP-0x18]                 ; 堆栈 SS:[0012F0C4]=012DB6CC, (UNICODE "2522-2222-2225-1198")
    		0074989E    33C9            XOR     ECX, ECX
    		007498A0    BA 30997400     MOV     EDX, 00749930                                ; -
    		……
    
    0074AAE1    84C0            TEST    AL, AL
    0074AAE3    74 25           JE      SHORT 0074AB0A
    0074AAE5    8B45 FC         MOV     EAX, DWORD PTR SS:[EBP-0x4]
    0074AAE8    8B90 F8030000   MOV     EDX, DWORD PTR DS:[EAX+0x3F8]
    0074AAEE    8B45 FC         MOV     EAX, DWORD PTR SS:[EBP-0x4]
    0074AAF1    8B80 F4030000   MOV     EAX, DWORD PTR DS:[EAX+0x3F4]
    0074AAF7    E8 38EEFFFF     CALL    00749934
    0074AAFC    84C0            TEST    AL, AL
    0074AAFE    74 14           JE      SHORT 0074AB14
    0074AB00    8B45 FC         MOV     EAX, DWORD PTR SS:[EBP-0x4]
    0074AB03    E8 C88AE7FF     CALL    005C35D0
    0074AB08    EB 0A           JMP     SHORT 0074AB14
    0074AB0A    B8 4CAB7400     MOV     EAX, 0074AB4C                                ; 注册码不正确,请重新输入!
    0074AB0F    E8 9CF8FFFF     CALL    0074A3B0
    0074AB14    33C0            XOR     EAX, EAX
    
    …………
    
    





    对应的密码表
    0        1        2        3        4        5        6        7        8        9       
    2        4        9        9        5        3        2        8        3        0


    实际上可以计算出一份最终的密码表,省去了计算过程,直接查询就能得到注册码

    0        1        2        3        4        5        6        7        8        9       
    2        5        1        2        9        8        8        5        1        9
    以我的机器码为例
    2                2                0                3                4                5                0                1                0                0                0                0                0                0                0                1
    A                                B                                C                                D                                E                                F                                G                                H
    1                1                2                2                9                8                2                5                2                2                2                2                2                2                2                5       
                   
    最终的注册码如下:
    2                5                2                2                2                2                2                2                2                2                2                5                1                1                9                8               

    2522-2222-2225-1198       



    ------------------------------------------------------------------------
    【破解总结】
                    作者给软件加了壳,我也没查是什么壳。代码也是加了密的。但是算法太简单,完全凭一个密码表就可以查出来。查出来还要调整下顺序。
                    步骤繁琐了点,但是没有难度。好歹也应该有个特殊位置的校验啊。
    ------------------------------------------------------------------------
    【版权声明】
    本文原创于JZL/P.Y.G,转载请注明作者及论坛并保存文章的完整!

    评分

    参与人数 5威望 +32 飘云币 +100 收起 理由
    yosen2001 + 20 PYG有你更精彩!
    pentium450 + 20 + 20 PYG有你更精彩!
    tree_fly + 20 PYG有你更精彩!
    GeekCat + 12 + 20 PYG有你更精彩!
    GGLHY + 20 赞一个!

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    前天 06:11
  • 签到天数: 2754 天

    [LV.Master]伴坛终老

    发表于 2016-1-30 02:53:26 | 显示全部楼层
    我是菜鸟,我看不懂
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-23 23:49
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    发表于 2016-1-30 08:19:04 | 显示全部楼层
    赞!
    前排学习!

    嗯,远方 的风景这边独好!

    点评

    JZL
    GG大人,大驾光临,蓬荜生辉啊  详情 回复 发表于 2016-1-30 17:51
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2019-3-25 14:18
  • 签到天数: 881 天

    [LV.10]以坛为家III

    发表于 2016-1-30 09:37:06 | 显示全部楼层
    前排学习~~
    谢谢分享

    点评

    JZL
    我觉得录视频比文字更好。  详情 回复 发表于 2016-1-30 17:53
    PYG19周年生日快乐!
  • TA的每日心情
    郁闷
    2018-1-26 16:44
  • 签到天数: 149 天

    [LV.7]常住居民III

     楼主| 发表于 2016-1-30 17:51:36 | 显示全部楼层
    GGLHY 发表于 2016-1-30 08:19
    赞!
    前排学习!

    GG大人,大驾光临,蓬荜生辉啊
    PYG19周年生日快乐!
  • TA的每日心情
    郁闷
    2018-1-26 16:44
  • 签到天数: 149 天

    [LV.7]常住居民III

     楼主| 发表于 2016-1-30 17:53:26 | 显示全部楼层
    GeekCat 发表于 2016-1-30 09:37
    前排学习~~
    谢谢分享

    我觉得录视频比文字更好。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2023-4-4 10:28
  • 签到天数: 96 天

    [LV.6]常住居民II

    发表于 2016-1-31 11:58:20 | 显示全部楼层
    风景这边独好!
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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