首页
社区
课程
招聘
[讨论]一个VB,CRACKME的算法分析,适合新手
发表于: 2006-2-5 16:05 8073

[讨论]一个VB,CRACKME的算法分析,适合新手

2006-2-5 16:05
8073

1)PEID查壳,Microsoft Visual Basic 5.0 / 6.0。无壳
2)试运行,任意输入后,有错误提示"you get wrong try again"
3)OD载入程序,用超级字符串查找找错误提示"you get wrong try again"
超级字串参考+        , 条目 5
地址=004025E5
反汇编=PUSH CrackMe1.00401BC8
文本字串=you get wrong
双击来到004025E5,向上找,找程序开始比较注册码的地方。来到00402310处 下断
4)OD重新载入,任意输入后,程序被中断
00402310   > \55            PUSH EBP                                   断在这里。F8向下
00402311   .  8BEC          MOV EBP,ESP
00402313   .  83EC 0C       SUB ESP,0C
。。。。。。省略一些代码。
0040240F   .  8B45 E4       MOV EAX,DWORD PTR SS:[EBP-1C]
00402412   .  50            PUSH EAX                                 ;  假码入栈
00402413   .  8B1A          MOV EBX,DWORD PTR DS:[EDX]
00402415   .  FF15 E4404000 CALL DWORD PTR DS:[<&MSVBVM50.__vbaLenBs>;  MSVBVM50.__vbaLenBstr
0040241B   .  8BF8          MOV EDI,EAX                              ;  EAX=假码位数
0040241D   .  8B4D E8       MOV ECX,DWORD PTR SS:[EBP-18]            ;  EBP-18=假码
00402420   .  69FF FB7C0100 IMUL EDI,EDI,17CFB                       ;  EDI=EDI*17CFB
00402426   .  51            PUSH ECX
00402427   .  0F80 91020000 JO CrackMe1.004026BE
0040242D   .  FF15 F8404000 CALL DWORD PTR DS:[<&MSVBVM50.#516>]     ;  注意,先进人这个CALL
00402433   .  0FBFD0        MOVSX EDX,AX                             ;  EAX=32或31,
00402436   .  03FA          ADD EDI,EDX                              ;  EDI=EDI+EDX  (EDI=D64D3。EDX=32)
00402438   .  0F80 80020000 JO CrackMe1.004026BE                     ;  EDI=D6505
0040243E   .  57            PUSH EDI
0040243F   .  FF15 E0404000 CALL DWORD PTR DS:[<&MSVBVM50.__vbaStrI4>;  进!!计算注册码
00402445   .  8BD0          MOV EDX,EAX
00402447   .  8D4D E0       LEA ECX,DWORD PTR SS:[EBP-20]
0040244A   .  FF15 70414000 CALL DWORD PTR DS:[<&MSVBVM50.__vbaStrMo>;  MSVBVM50.__vbaStrMove
0040244A   .  FF15 70414000 CALL DWORD PTR DS:[<&MSVBVM50.__vbaStrMo>;  MSVBVM50.__vbaStrMove
00402450   .  8BBD 50FFFFFF MOV EDI,DWORD PTR SS:[EBP-B0]
。。。。。。省略一些代码 。
0040251C   .  50            PUSH EAX
0040251D   .  68 701B4000   PUSH CrackMe1.00401B70                   ;  aka-
00402522 > .  51            PUSH ECX                                 ;  在计算所得的注册码前+AKA
00402522 > .  51            PUSH ECX                                 ;  
00402523   .  FFD7          CALL EDI                                 ;  
00402525   .  8B1D 70414000 MOV EBX,DWORD PTR DS:[<&MSVBVM50.__vbaSt>;  
0040252B   .  8BD0          MOV EDX,EAX
0040252D   .  8D4D E0       LEA ECX,DWORD PTR SS:[EBP-20]
00402530   .  FFD3          CALL EBX                                 ;  
00402532   .  50            PUSH EAX
00402533   .  FF15 28414000 CALL DWORD PTR DS:[<&MSVBVM50.__vbaStrCm>;  
00402539   .  8BF0          MOV ESI,EAX
0040253B   .  8D55 E0       LEA EDX,DWORD PTR SS:[EBP-20]
0040253E   .  F7DE          NEG ESI
00402540   .  8D45 E8       LEA EAX,DWORD PTR SS:[EBP-18]
00402543   .  52            PUSH EDX
00402544   .  1BF6          SBB ESI,ESI
00402546   .  8D4D E4       LEA ECX,DWORD PTR SS:[EBP-1C]
00402549   .  50            PUSH EAX
0040254A   .  46            INC ESI
0040254B   .  51            PUSH ECX
0040254C   .  6A 03         PUSH 3
0040254E   .  F7DE          NEG ESI
00402550   .  FF15 5C414000 CALL DWORD PTR DS:[<&MSVBVM50.__vbaFreeS>;  MSVBVM50.__vbaFreeStrList
00402556   .  83C4 10       ADD ESP,10
00402559   .  8D55 D8       LEA EDX,DWORD PTR SS:[EBP-28]
0040255C   .  8D45 DC       LEA EAX,DWORD PTR SS:[EBP-24]
0040255F   .  52            PUSH EDX
00402560   .  50            PUSH EAX
00402561   .  6A 02         PUSH 2
00402563   .  FF15 F4404000 CALL DWORD PTR DS:[<&MSVBVM50.__vbaFreeO>;  MSVBVM50.__vbaFreeObjList
00402569   .  83C4 0C       ADD ESP,0C
0040256C   .  B9 04000280   MOV ECX,80020004
00402571   .  B8 0A000000   MOV EAX,0A
00402576   .  894D 9C       MOV DWORD PTR SS:[EBP-64],ECX
00402579   .  66:85F6       TEST SI,SI
0040257C   .  8945 94       MOV DWORD PTR SS:[EBP-6C],EAX
0040257F   .  894D AC       MOV DWORD PTR SS:[EBP-54],ECX
00402582   .  8945 A4       MOV DWORD PTR SS:[EBP-5C],EAX
00402585   .  894D BC       MOV DWORD PTR SS:[EBP-44],ECX
00402588   .  8945 B4       MOV DWORD PTR SS:[EBP-4C],EAX
0040258B   .  74 58         JE SHORT CrackMe1.004025E5              真假注册码比较,相等则跳向成功
以下是各个所进入的CALL的内容
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
进入第一个CALL
762BC89B >  55              PUSH EBP
762BC89C    B8 00000000     MOV EAX,0
762BC8A1    8BEC            MOV EBP,ESP
762BC8A3    83EC 04         SUB ESP,4
762BC8A6    56              PUSH ESI
762BC8A7    8B75 08         MOV ESI,DWORD PTR SS:[EBP+8]    EBP+8=注册名
762BC8AA    85F6            TEST ESI,ESI
762BC8AC    74 05           JE SHORT MSVBVM50.762BC8B3
762BC8AE    8B46 FC         MOV EAX,DWORD PTR DS:[ESI-4]
762BC8B1    D1E8            SHR EAX,1                        EAX*2
762BC8B3    85C0            TEST EAX,EAX
762BC8B5    0F84 D6D20300   JE MSVBVM50.762F9B91
762BC8BB    33C0            XOR EAX,EAX                      EAX清零
762BC8BD    8D4D FE         LEA ECX,DWORD PTR SS:[EBP-2]
762BC8C0    50              PUSH EAX
762BC8C1    50              PUSH EAX
762BC8C2    6A 02           PUSH 2
762BC8C4    51              PUSH ECX
762BC8C5    6A 01           PUSH 1
762BC8C7    56              PUSH ESI
762BC8C8    50              PUSH EAX
762BC8C9    50              PUSH EAX               
762BC8CA    FF15 00122876   CALL DWORD PTR DS:[<&KERNEL32.WideCharTo>; KERNEL32.WideCharToMultiByte
762BC8D0    83F8 02         CMP EAX,2
762BC8D3    66:0FB645 FE    MOVZX AX,BYTE PTR SS:[EBP-2]    取注册名第一位的ASCII值,并放入EAX
762BC8D8    0F84 BAD20300   JE MSVBVM50.762F9B98
762BC8DE    5E              POP ESI
762BC8DF    8BE5            MOV ESP,EBP
762BC8E1    5D              POP EBP
762BC8E2    C2 0400         RETN 4                                   计算完后返回
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
进入注册码计算CALL的内容:
7629BECF >  83EC 04         SUB ESP,4
7629BED2    8D4424 00       LEA EAX,DWORD PTR SS:[ESP]
7629BED6    50              PUSH EAX
7629BED7    6A 00           PUSH 0
7629BED9    E8 5BF5FEFF     CALL MSVBVM50.7628B439
7629BEDE    50              PUSH EAX
7629BEDF    FF7424 14       PUSH DWORD PTR SS:[ESP+14]
7629BEE3 >  FF15 641A2876   CALL DWORD PTR DS:[<&OLEAUT32.#110>]     ; 进入
7629BEE9    85C0            TEST EAX,EAX
7629BEEB    0F8C E5FE0400   JL MSVBVM50.762EBDD6
7629BEF1    8B4424 00       MOV EAX,DWORD PTR SS:[ESP]
7629BEF5    83C4 04         ADD ESP,4
7629BEF8    C2 0400         RETN 4
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
。。。到这里
779BF080 >  8B4C24 04       MOV ECX,DWORD PTR SS:[ESP+4]
779BF084    83EC 50         SUB ESP,50
779BF087    8D4424 00       LEA EAX,DWORD PTR SS:[ESP]
779BF08B    50              PUSH EAX
779BF08C    51              PUSH ECX
779BF08D    E8 EE33FEFF     CALL OLEAUT32.779A2480           进入这里
779BF092    8D4424 00       LEA EAX,DWORD PTR SS:[ESP]
779BF096    8B5424 60       MOV EDX,DWORD PTR SS:[ESP+60]
779BF09A    52              PUSH EDX
779BF09B    50              PUSH EAX
779BF09C    E8 AFA3FFFF     CALL OLEAUT32.779B9450
779BF0A1    83C4 50         ADD ESP,50
779BF0A4    C2 1000         RETN 10
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
。。。到这里
779A2480    8B4424 04       MOV EAX,DWORD PTR SS:[ESP+4]
779A2484    33C9            XOR ECX,ECX
779A2486    85C0            TEST EAX,EAX
779A2488    56              PUSH ESI
779A2489    8B7424 0C       MOV ESI,DWORD PTR SS:[ESP+C]
779A248D    0F9CC1          SETL CL
779A2490    51              PUSH ECX
779A2491    56              PUSH ESI
779A2492    50              PUSH EAX
779A2493    E8 48FFFFFF     CALL OLEAUT32.779A23E0           进入这个
779A2498    8BC6            MOV EAX,ESI
779A249A    5E              POP ESI
779A249B    C2 0800         RETN 8
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
。。。到这里,根据注册名来计算注册码!(关键)
779A23E8    53              PUSH EBX
779A23E9    56              PUSH ESI
779A23EA    85C0            TEST EAX,EAX
779A23EC    57              PUSH EDI
779A23ED    74 10           JE SHORT OLEAUT32.779A23FF
779A23EF    8B7424 10       MOV ESI,DWORD PTR SS:[ESP+10]
779A23F3    66:C701 2D00    MOV WORD PTR DS:[ECX],2D
779A23F8    83C1 02         ADD ECX,2
779A23FB    F7DE            NEG ESI
779A23FD    EB 04           JMP SHORT OLEAUT32.779A2403
779A23FF    8B7424 10       MOV ESI,DWORD PTR SS:[ESP+10]            ; ESP+10=A
779A2403    8BD9            MOV EBX,ECX
779A2405    8BC6            MOV EAX,ESI                              ; 把A送进EAX
779A2407    33D2            XOR EDX,EDX                              ; EDX清零
779A2409    BF 0A000000     MOV EDI,0A                               ; 令EDI=OA
779A240E    83C1 02         ADD ECX,2                                ; 每计算一次EXC的值加2
779A2411    F7F7            DIV EDI                                  ; 用EAX/EDX,商放进EAX,余数放进EDX
779A2413    B8 CDCCCCCC     MOV EAX,CCCCCCCD                         ; 给EAX赋值
779A2418    8BFA            MOV EDI,EDX                              ; EDX=O,既将EDI清零
779A241A    F7E6            MUL ESI
779A241C    C1EA 03         SHR EDX,3                                ; EDX中的值除以8(2的3次方)
779A241F    83C7 30         ADD EDI,30                               ; 每计算一次EDI加30
779A2422    8BF2            MOV ESI,EDX                              ; 将EDX的值赋给ESI
779A2424    66:8979 FE      MOV WORD PTR DS:[ECX-2],DI
779A2428    85F6            TEST ESI,ESI                             ; 计算完了吗?若没有则继续计算
779A242A  ^ 77 D9           JA SHORT OLEAUT32.779A2405
779A242C    66:C701 0000    MOV WORD PTR DS:[ECX],0                  ; 计算完毕则来到这里
779A2431    83E9 02         SUB ECX,2                                ; ECX值减2
779A2434    66:8B13         MOV DX,WORD PTR DS:[EBX]
779A2437    66:8B01         MOV AX,WORD PTR DS:[ECX]
779A243A    66:8911         MOV WORD PTR DS:[ECX],DX
779A243D    66:8903         MOV WORD PTR DS:[EBX],AX
779A2440    83E9 02         SUB ECX,2
779A2443    83C3 02         ADD EBX,2
779A2446    3BD9            CMP EBX,ECX
779A2448  ^ 72 EA           JB SHORT OLEAUT32.779A2434               ; 这段代码的意思就是把上面所得的数字倒序
779A244A    5F              POP EDI
779A244B    5E              POP ESI                                   寄存器出栈
779A244C    5B              POP EBX                                  ; 00CA4B90
779A244D    C2 0C00         RETN 0C                                    返回

------------------------------------------------------------------------
BY 逍遥风
算法总结。
1)取注册名第一位的ASCII码的值(若输入的是数字,则奇数为31,偶数为32),设这个值为A
2)用注册名乘以定值17CFB。得到一个值设为B
3)A+B得到一个值设为C
4)以B的位数为循环次数,用C除以定值OA,得数再除以OA。。。!直到循环结束
  例:假设B为5位字符串。
     C/0A=Q,余数为W 。Q/OA=E,余数为R。E/OA=T,余数为Y。T/OA=U,余数为I。U/OA=O,余数为P
     共计算5次。
5)将5步计算的余数组成一个字符串,例如这里的WRYIP
6)将所得字符串倒序,例如这里PIYRW
7)在倒序后的字符串前合并上AKA-,例如AKA-PIYRW。既得到注册码。
目前就分析到这里了,可能一些细节没有分析到位。有疏漏或不完善的地方请大家指出。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (12)
雪    币: 50161
活跃值: (20660)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
文章不错,另外麻烦将CrackMe传份上来保存。
2006-2-5 16:07
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
上传CrackMe来玩玩.
2006-2-5 16:21
0
雪    币: 2256
活跃值: (941)
能力值: (RANK:2210 )
在线值:
发帖
回帖
粉丝
4
权限不够,上不成附件呢。。。
2006-2-5 17:03
0
雪    币: 2256
活跃值: (941)
能力值: (RANK:2210 )
在线值:
发帖
回帖
粉丝
5
http://free.ys168.com/?tcxb
crackme1
我放到上面了,大家有空去看看
2006-2-5 17:09
0
雪    币: 50161
活跃值: (20660)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
6
最初由 逍遥风 发布
http://free.ys168.com/?tcxb
crackme1
我放到上面了,大家有空去看看


我还是帮你转份本地,呵~怕时间长了,你那空间失效
上传的附件:
2006-2-5 17:14
0
雪    币: 443
活跃值: (200)
能力值: ( LV9,RANK:1140 )
在线值:
发帖
回帖
粉丝
7
最初由 kanxue 发布


我还是帮你转份本地,呵~怕时间长了,你那空间失效


感谢看雪!!
2006-2-5 22:46
0
雪    币: 2256
活跃值: (941)
能力值: (RANK:2210 )
在线值:
发帖
回帖
粉丝
8
呵呵~谢谢啦
2006-2-6 12:48
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
粗略看了几篇crackme都很好,很详细,适合我等新手,但也发现一个问题,都是查以找字符串为突破口,不是说这种方法不好,而是可不可以换个角度去思考,比如用 bp MessageBoxA,菜鸟班门弄斧,见笑了,为什么我下 bp MessageBoxA,每次都断在系统空间,不知道怎么回程序空间,望老鸟指点.
2006-2-9 20:31
0
雪    币: 2506
活跃值: (1030)
能力值: (RANK:990 )
在线值:
发帖
回帖
粉丝
10
最初由 endofcool 发布
粗略看了几篇crackme都很好,很详细,适合我等新手,但也发现一个问题,都是查以找字符串为突破口,不是说这种方法不好,而是可不可以换个角度去思考,比如用 bp MessageBoxA,菜鸟班门弄斧,见笑了,为什么我下 bp MessageBoxA,每次都断在系统空间,不知道怎么回程序空间,望老鸟指点.

ALT+F9 返回。
2006-2-9 20:51
0
雪    币: 2256
活跃值: (941)
能力值: (RANK:2210 )
在线值:
发帖
回帖
粉丝
11
下断的方法有很多
我的习惯是先找字符串,如果没有的话再用命令行下断。
呵呵~!我主要练习的是算法分析。
2006-2-10 10:36
0
雪    币: 256
活跃值: (268)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
12
楼主的几篇文章都拜读了觉得对学习算法挺有帮助盼望楼主继续发好文章!
2006-2-10 20:20
0
雪    币: 2256
活跃值: (941)
能力值: (RANK:2210 )
在线值:
发帖
回帖
粉丝
13
谢谢~一起学习,一起进步
2006-2-11 13:22
0
游客
登录 | 注册 方可回帖
返回
//