首页
论坛
课程
招聘
[原创]轻松换背景1.1算法详尽分析
2005-12-18 16:38 6093

[原创]轻松换背景1.1算法详尽分析

2005-12-18 16:38
6093
【原创】轻松换背景1.1算法详尽分析
【作者】WindayJiang
【破解声明】纯粹学习,算法简单,适合新手学习
【破解工具】OLLDBG, PEID
【破解难度】EASY
【软件保护】SN+TIME
【软件下载】http://www.stepok.com/chs/index.htm

运行软件,程序要注册,错误会有提示
先“程咬金三板斧”吧:查壳脱壳、静态分析、动态分析

Microsoft Visual C++ 6.0编写,没有加壳

静态分析作用不大,软件一开始就把字串初始化存入内存,没有明显的改跳转爆破口

只能跟踪查找了,用OD载入,F9运行,设置断点为 GETWINDOWTEXTA,回到界面输入注册码,按解锁就会被拦截,拦载后尽快返回程序领空,可

以见到:
0042A53E   .  E8 95F80200   CALL <JMP.&MFC42.#6334>                                     //这里取注册码
0042A543   .  8DB3 E0000000 LEA ESI,DWORD PTR DS:[EBX+E0]
0042A549   .  8BCE          MOV ECX,ESI       
0042A54B   .  E8 94F80200   CALL <JMP.&MFC42.#4171>
0042A550   .  50            PUSH EAX                                                    //注册码入栈
0042A551   .  B9 B0484700   MOV ECX,Recompos.004748B0     ;  ASCII "hQF"                //什么东东?
0042A556   .  E8 D5090000   CALL Recompos.0042AF30                                      //注册码比较CALL
0042A55B   .  85C0          TEST EAX,EAX                                                //比较EAX
0042A55D   .  74 7D         JE SHORT Recompos.0042A5DC                                  //跳就GAMEOVER
于是跟进42AF30:
0042AF30  /$  56            PUSH ESI                                                    //注册码地址
0042AF31  |.  8B7424 08     MOV ESI,DWORD PTR SS:[ESP+8]                                //注册码放到ESI
0042AF35  |.  57            PUSH EDI                                                    //EDI入栈
0042AF36  |.  8BFE          MOV EDI,ESI                                                 //注册码到EDI
0042AF38  |.  83C9 FF       OR ECX,FFFFFFFF                               
0042AF3B  |.  33C0          XOR EAX,EAX                                                 //清空EAX
0042AF3D  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]                                //
0042AF3F  |.  F7D1          NOT ECX                                                     //这里求注册码长度
0042AF41  |.  49            DEC ECX                                                     //
0042AF42  |.  83F9 1C       CMP ECX,1C                                                  //是不是1C长度?
0042AF45  |.  74 05         JE SHORT Recompos.0042AF4C                                  //不是GAMEOVER
0042AF47  |.  5F            POP EDI                                                     //恢复EDI
0042AF48  |.  5E            POP ESI                                                     //注册码地址出栈
0042AF49  |.  C2 0400       RETN 4
0042AF4C  |>  8A46 01       MOV AL,BYTE PTR DS:[ESI+1]                                  //顺利的话,将注册码第2位放到AL
0042AF4F  |.  40            INC EAX                                                     //加1
0042AF50  |.  83E0 06       AND EAX,6                                                   //跟6与运算
0042AF53  |.  3C 02         CMP AL,2                                                    //结果是否为2?
0042AF55  |.  74 07         JE SHORT Recompos.0042AF5E                                  //不跳GAMEOVER
0042AF57  |.  5F            POP EDI                                                     ///恢复EDI
0042AF58  |.  33C0          XOR EAX,EAX                                                 /EAX清空
0042AF5A  |.  5E            POP ESI                                                     //注册码地址出栈
0042AF5B  |.  C2 0400       RETN 4
0042AF5E  |>  33C0          XOR EAX,EAX                                                 //顺利的话,来到这里,清空EAX
0042AF60  |.  33C9          XOR ECX,ECX                                                 //ECX
0042AF62  |>  0FBE1431      /MOVSX EDX,BYTE PTR DS:[ECX+ESI]                            //注册码第1位到EDX
0042AF66  |.  03C2          |ADD EAX,EDX                                                //将EAX+EDX
0042AF68  |.  41            |INC ECX                                                    //ECX加1
0042AF69  |.  83F9 1B       |CMP ECX,1B                                                 //比较ECX是否1B
0042AF6C  |.^ 7C F4         \JL SHORT Recompos.0042AF62                                 //小于的话向上循环

PS:这里是将注册码前27位逐位相加

0042AF6E  |.  99            CDQ                                                         //看来要求余了
0042AF6F  |.  B9 34000000   MOV ECX,34                                                  //ECX为34
0042AF74  |.  F7F9          IDIV ECX                                                    //EAX除以34,余数到EDX
0042AF76  |.  83FA 1A       CMP EDX,1A                                                  //与1A比较
0042AF79  |.  7D 12         JGE SHORT Recompos.0042AF8D                                 //不小于到42AF8D处理
0042AF7B  |.  8A4E 1B       MOV CL,BYTE PTR DS:[ESI+1B]                                 //小于的话,将最后1个注册码到CL
0042AF7E  |.  80C2 41       ADD DL,41                                                   //将余数DL加41
0042AF81  |.  33C0          XOR EAX,EAX                                                 //清空EAX
0042AF83  |.  3ACA          CMP CL,DL                                                   //比较CL和DL
0042AF85  |.  5F            POP EDI                                                     ///恢复EDI
0042AF86  |.  5E            POP ESI                                                     //注册码地址出栈
0042AF87  |.  0F94C0        SETE AL                                                     //CL和DL相等设AL为1
0042AF8A  |.  C2 0400       RETN 4
0042AF8D  |>  8A4E 1B       MOV CL,BYTE PTR DS:[ESI+1B]                                 //将最后1个注册码到CL
0042AF90  |.  80C2 47       ADD DL,47                                                   //将余数DL加47
0042AF93  |.  33C0          XOR EAX,EAX                                                 //清空EAX
0042AF95  |.  3ACA          CMP CL,DL                                                   //比较CL和DL
0042AF97  |.  5F            POP EDI                                                     ///恢复EDI
0042AF98  |.  5E            POP ESI                                                     //注册码地址出栈
0042AF99  |.  0F94C0        SETE AL                                                     //CL和DL相等设AL为1
0042AF9C  \.  C2 0400       RETN 4

到这里为止,算法已经完全分析完!

总结一下:
将注册码或注册名累加在大多数软件中使用,这个程序的注册算法也是这样,由于较为简单,适合新手了解此类注册算法的基本特征

算法总结一下:
LEN(注册码)=1C
(第2位+1)AND 6=2
前27位总和/34,余数与1A比较:
大于等于1A,将余数+47
小于1A,将余数+41
前27位+最后一位=注册码

晚点把注册机补上,呵呵
////////////////////////////////////////////////////////////////
If you want to crack well, learn ASM well !

WiNDaYJiANg       2005-12-18
////////////////////////////////////////////////////////////////

[招生]科锐逆向工程师培训46期预科班将于 2023年02月09日 正式开班

收藏
点赞0
打赏
分享
最新回复 (3)
雪    币: 215
活跃值: 活跃值 (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
skyege 活跃值 2 2005-12-18 23:52
2
0
好,不错。学习!!!
雪    币: 202
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
HillCat 活跃值 1 2005-12-19 02:00
3
0
楼主分析的很详尽,稍微补充一下:

求余后与41或47加和即为注册码最后一位的ASCII值。

随便选了一组可用的注册码:
417444444444444444444444ANAA
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jjwangjun 活跃值 2005-12-19 12:19
4
0
学习中;
游客
登录 | 注册 方可回帖
返回