-
-
[原创]轻松换背景1.1算法详尽分析
-
发表于:
2005-12-18 16:38
7169
-
【原创】轻松换背景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
////////////////////////////////////////////////////////////////
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!