老文章档案 · 2003 年

OllyDbg破解系列——WinMatrix XP

破解教程 · 暴力破解 · 2003-10-08 · 作者:WinHack 人气: · 出处:赢政天下整理收藏)

Winmatrix XP 2.0

软件介绍:

看过黑客帝国没有? 这个超酷动态桌面Winmatrix xp可模拟电影黑客帝国的“数码瀑布”效果,赶快下载试试哦^_^

------

(1)前言

又来到OllyDbg菜鸟学堂(高手勿进,呵呵),这个软件与前几个不同的是:不使用老土的

F(用户名)= 注册码,最后进行真假注册码比较的验证方法;而是采用F(注册码)的验证手法,

不能再用一直盯住寄存器就能找出真注册码的方法了,而是要看懂算法,方向算法才能搞定哦。

(当然还可以 TNT,呵呵)

好了,不多废话,进入正题——

(2) 寻找切入点:

先打开程序,尝试注册,发现弹出注册码错误提示对话框,哈哈,我想我们的切入点

又是MessageBox了:)

用OllyDbg打开程序,在MessageBoxA上设断,尝试注册——

程序在此处停下:

00412F79 |> FF7424 10 PUSH DWORD PTR SS:[ESP+10] ; /style

00412F7D |. 50 PUSH EAX ; |Title

00412F7E |. FF7424 10 PUSH DWORD PTR SS:[ESP+10] ; |Text

00412F82 |. 51 PUSH ECX ; |hOwner

00412F83 |. FF15 E0B34100 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA

00412F89 |. 5E POP ESI

00412F8A \. C2 0C00 RETN 0C

察看堆栈,可以看见MessageBox的参数:

0012F914 00000000 |hOwner = NULL

0012F918 004220CC |Text = "Wrong registration code. Perhaps, you mistype some symbols."

0012F91C 00920EB0 |Title = "WinMatrixXP"

0012F920 00000000 \style = MB_OK|MB_APPLMODAL

跟出上面那个Return语句,来到程序主控代码:

00401293 |. 68 CC204200 PUSH WinMatri.004220CC ; ASCII "Wrong registration code. Perhaps, you mistype some symbols."

00401298 |. E8 BE1C0100 CALL WinMatri.00412F5B ;这里就是刚才那个调用MessageBox的函数

0040129D |. EB 3B JMP SHORT WinMatri.004012DA ; return 到这里

(3)跟踪——注册码验证算法

对上面那段代码进行分析可以分析出注册码算法了,详细过程请见注释:

00401246 |. B9 06000000 MOV ECX,6

0040124B |. 394D F8 CMP DWORD PTR SS:[EBP-8],ECX ; [EBP-8]->strlen(注册码1)8],

0040124E |. 75 3B JNZ SHORT WinMatri.0040128B ; 注册码1长度==6 ???atri.004

00401250 |. 8B47 60 MOV EAX,DWORD PTR DS:[EDI+60]

00401253 |. 894424 10 MOV DWORD PTR SS:[ESP+10],EAX

00401257 |. 8378 F8 04 CMP DWORD PTR DS:[EAX-8],4 ; [EAX-8]->strlen(注册码2)8],

0040125B |. 75 2E JNZ SHORT WinMatri.0040128B ; 注册码2长度==4 ???atri.004

0040125D |. 8B77 64 MOV ESI,DWORD PTR DS:[EDI+64]

00401260 |. 394E F8 CMP DWORD PTR DS:[ESI-8],ECX ; [ESI-8]->strlen(注册码3)8],

00401263 |. 75 26 JNZ SHORT WinMatri.0040128B ; 注册码3长度==6 ???atri.004

00401265 |. 32D2 XOR DL,DL

00401267 |. 32C9 XOR CL,CL

00401269 |. 53 PUSH EBX

0040126A |. 33C0 XOR EAX,EAX

0040126C |> 8A1C06 /MOV BL,BYTE PTR DS:[ESI+EAX] ; BL->注册码3[EAX]TR

0040126F |. 021C28 |ADD BL,BYTE PTR DS:[EAX+EBP] ; BL+=注册码1[EAX]TR

00401272 |. 02D3 |ADD DL,BL ; DL += BL

00401274 |. 83F8 04 |CMP EAX,4

00401277 |. 7D 07 |JGE SHORT WinMatri.00401280 ; EAX >= 4

00401279 |. 8B5C24 14 |MOV EBX,DWORD PTR SS:[ESP+14]

0040127D |. 020C03 |ADD CL,BYTE PTR DS:[EBX+EAX] ; CL+=注册码2[EAX]TR

00401280 |> 40 |INC EAX

00401281 |. 83F8 06 |CMP EAX,6

00401284 |.^ 7C E6 \JL SHORT WinMatri.0040126C

00401286 |. 3AD1 CMP DL,CL ; DL == CL ??? 相当则注册码正确!!!! @龌铉A

00401288 |. 5B POP EBX

00401289 |. 74 14 JE SHORT WinMatri.0040129F ; 关键跳转,哈哈 ^_^Matri.0

0040128B |> 8B4C24 0C MOV ECX,DWORD PTR SS:[ESP+C]

0040128F |. 6A 00 PUSH 0

00401291 |. 6A 00 PUSH 0

00401293 |. 68 CC204200 PUSH WinMatri.004220CC ; ASCII "Wrong registration code. Perhaps, you mistype some

symbols."

00401298 |. E8 BE1C0100 CALL WinMatri.00412F5B ; 提示用户WinM

0040129D |. EB 3B JMP SHORT WinMatri.004012DA

把上面的注册码验证过程写成C代码为:

char szSn1[16],szSn2[16],szSn3[16]; //用户输入的注册码1,2,3

if(strlen(szSn1) != 6)

{

go to Sn_Error;

}

if(strlen(szSn2) != 4)

{

go to Sn_Error;

}

if(strlen(szSn3) != 6)

{

go to Sn_Error;

}

short CL =0, DL = 0,BL;

for(int i=0;i < 6;i++)

{

BL = szSn1[i] + szSn3[i];

DL += BL;

if(i < 4)

{

CL += szSn2[i];

}

}

if(DL == CL)

{

go to Sn_Right; //正确!!

}

Sn_Wrong: //注册码错误

MessageBox(NULL,"Wrong registration code. Perhaps, you mistype some symbols.",

"WinMatrixXP",MB_OK|MB_APPLMODAL);

return 0;

Sn_Right: //注册码正确

return 1;

(4)反向——注册码生成算法

可以看出,注册码2的字符Ascii要远大与注册码13的Ascii,这样才能保证最后可以通过。

我们取注册码2的最大Ascii值为122(字符'z'),可以计算出值区间

n13 = [33,40] //注册码1,3的Ascii

n2 = [99,122] //注册码2的Ascii

于是可以写出一个简单的注册码生成算法:

void KeyGen(){

char nStr1[8],nStr2[8],nStr3[8];

short nSum13 =0,nSum2 =0,n1;

srand(time(NULL));

for(int i = 0; i< 4; i++)

{

nStr2[i] = (char)RandomRange(99,122);

nSum2 += (short)nStr2[i];

}

nStr2[4] = '\0';

n1 = nSum2/12;

for(i=0; i< 6; i++)

{

nStr1[i] = (char)n1;

nStr3[i] = (char)n1;

}

nStr1[5] = nSum2 - n1* 11;

nStr1[6] = '\0';

nStr3[6] = '\0';

}

int RandomRange(int nBegin, int nEnd)

{

int nRange = nEnd - nBegin;

return nBegin + rand()*nRange/RAND_MAX;

}

(5)总结

这个软件验证算法不复杂,所以注册码还是比较好算的。而且,这也是一种典型的多段注册码验证

方法(我已经遇到过多次类似情况),初学者可以尝试一下。

欢迎大家和我交流OllyDbg的破解技术,QQ: 85436

(出处:赢政天下整理收藏)

相关文章:

·Tornado2之Licence暴力破解

·万能五笔2001注册码分析及暴力破解

·万能五笔2001注册码分析及暴力破解

·万能五笔2001注册码分析及暴力破解 ---可怜的思考者 (27千字)

·一个拨号软件的Win32Dasm暴力破解法

·CuteFTP V4.2.4之暴力破解

相关软件:

·电话卡暴力破解器 v2.0 (0425版)

→ 特别推荐

→ 热点TOP10

我为人人《《==》》人人为我

关于我们 |

帮助(?)

| 广告服务 |

版权声明 |

商业合作 |

发展历程 |

加盟我们 |

联系我们

Copyright © 1999-2003

winzheng.com All Rights Reserved.

繁体版:由华琦数码技术提供

Powered

by:MeSky.Net

2003-2004 年,宽带刚刚普及,下载站的文章区是许多人学电脑的第一课堂。
🕰 → 🤖 从那时到现在

当年一篇教程能让一台电脑焕然一新;今天的效率工具换成了 AI。 想知道当下最可靠的 AI 模型怎么选?看 赢政指数——我们用了 28 年的选软件严谨,现在用来评测大模型。

档案性质声明:本页为赢政天下(1998-2011)老文章的历史档案复原, 内容反映当年发表时的原貌——包括当年的技术表述、软件版本与观点,部分方法在今天已不适用或不合规,仅作互联网历史记录与研究用途, 不提供任何形式的下载。原始数据经由公共网络存档(Internet Archive)复原。发现问题请联系我们
← 返回老文章档案 · 软件史档案馆 · 赢政天下站史