- UID
- 59635
注册时间2009-1-30
阅读权限30
最后登录1970-1-1
龙战于野
TA的每日心情 | 慵懒 2019-4-26 10:19 |
---|
签到天数: 14 天 [LV.3]偶尔看看II
|
CrackMe V2.2里面的算法模型采用的是九宫格的数学游戏,先简单介绍下九宫格的游戏吧,O(∩_∩)O~
“九宫格”是我国书法史上临帖写仿的一种界格,又叫“九方格”,即在纸上画出若干大方框,再于每个方框内分出九个小方格,以便对照法帖范字的笔画部位进行练字。
九宫格游戏对人们的思维锻炼有着极大的作用,从古时起人们便意识到九宫的教育意义。千百年来影响巨大,在文学、影视中都曾出现过。九宫格最早叫“洛书”,现在也叫“幻方” 。
游戏规则:在3×3方格里,填入1至9九个数字,使每行、每列以及两个对角线上的三数之和都等于15。
在《射雕英雄传》中黄蓉曾破解九宫格,口诀:戴九履一,右三左七,二四为肩,六八为足。
还有口诀:“一居上行正中央,依次斜填切莫忘;上出框时向下放,右出框时向左放;排重便在下格填,右上排重一个样。” 这口诀不仅适用于九宫,也适用于推广的奇数九宫,如五五图、七七图等等。
下面就是设计思路:
1.先定义一个3*3的数组tb来设计出9个格子:- var
- UserName,RegCode:string;
- i,j,reg:integer;
- tb:array[1..9] of byte;
复制代码 2.将用户名和注册码进行简单的运算得出9个数字来,并将这9个数字填充到刚生成的9个格子中,也即数组中去。- begin
- if (length(edit1.Text)>0) and (length(edit2.Text)>=9) then
- try
- begin
- UserName:=edit1.Text;
- RegCode:=edit2.Text;
- reg:=0;
- //处理用户名使之长度>=9
- while length(UserName)<9 do
- begin
- UserName:=UserName+'A';
- end;
- for i:=1 to 9 do
- begin
- tb[i]:=abs(ord(UserName[i])-ord(RegCode[i]));//填充9个格子
- for j:=2 to i-1 do //每填一个格子,就要把从第二个格子开始的数字和新填的数字进行比较,不能相同,相同就挂!
- begin
- if tb[j]=tb[i] then exit;
- end;
- end;
复制代码 3.填好数字以后,就是比较是否满足要求了,也即每一行,每一列和对角线的数据之和是否等于15,如果不等则失败,相等则成功。- if tb[3]+tb[5]+tb[7]<>15 then reg:=reg+1; //对角线/的数据之和必须=15
- UserName:=chr(87);
- for i:=1 to 3 do
- begin
- if tb[3*(i-1)+1]+tb[3*(i-1)+2]+tb[3*(i-1)+3]<>15 then reg:=reg+1; //每一行的数据之和必须=15
- if tb[i]+tb[i+3]+tb[i+6]<>15 then reg:=reg+1; //每一列的数据之和必须=15
- end;
- UserName:=UserName+chr(105);
- if tb[1]+tb[5]+tb[9]<>15 then reg:=reg+1; //对角线\的数据之和必须=15
- UserName:=UserName+chr(110)+chr(33);
- i:=j div reg; //利用除数为0来异常处理弹出成功注册框
- RegCode:=inttostr(i*j*8); //用来迷惑破解者的!
- end;
- except
- begin
- showmessage(UserName);
- end;
- end;
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入我们
x
|