mathe 发表于 2008-1-14 12:04:55

算法破译

我写的一个数独游戏程序中,有一个文件存盘游戏,将一个数独局面(9*9的矩阵,每个格子里面可以是空格或者数字1-9)以一定的压缩格式保存在文件中。
现在我可以提供任意多的数据,看看谁能够破译出来,文件是采用什么算法保存的。
先提供一些数据:
分别是文件中保存的数据加上9*9的矩阵(用.表示空格)。
大家也可以自己产生更多的数据,程序可以在
http://blog.csdn.net/mathe/archive/2007/08/23/1755672.aspx
下载,
运行以后,按Ctrl+N可以产生新的游戏,然后按Ctrl+C可以将局面以文本可是复制到剪切板,然后可以复制到任何文本文件。
选择菜单“游戏/另存为...”可以保存游戏到数据文件,然后用任何二进制编辑器打开文件。
此外还可以在游戏中按Ctrl+E,自己手动输入任何特殊格式的局面,游戏有个BUG,即使局面是非法的游戏,还是可以保存的,这个反而给我们提供了更多的测试数据。

0000000 ad06 b078 002c 5d16 fee0 5780 1b69 ee01
0000010 0327 be7b 0004
..6...7..
28.....4.
.......96
...6...54
.....81..
7...43..9
.6..95.2.
3..72...5
...3.6...

0000000 58de a2ca 5224 4340 7243 59a0 06e2 0234
0000010 3243 385e
.6..57.1.
8.5.....2
2........
..1.46..8
63.7...21
......7..
.5...1..4
3....4.5.
..7..2...

0000000 58de a2ca 5224 4340 7243 cd2c 3752 11a0
0000010 9218 1c21
.6..57.1.
8.5.....2
2........
..1.46...
63.7...21
......7..
.5..63..4
3....4.5.
..7..2...

0000000 58de a2ca 5224 4340 7243 cd04 6ef2 2340
0000010 2430 3843
.6..57.1.
8.5.....2
2........
..1.46...
63.7...21
......7..
.5..18..4
3....4.5.
..7..2...

0000000 58de a2ca 5224 4340 7243 59a0 0dfe 0468
0000010 6486 384a
.6..57.1.
8.5.....2
2.......3
..1.46...
63.7...21
......7..
.5...9..4
3....4.5.
..7..2...

0000000 14d6 8f50 1ff0 057c 1468 ff1b 0c01 00c4
0000010 a5b4 cb05 0001
..8.....7
6...3....
.3......1
28....1..
3...6.27.
..9.1...6
.1.79..6.
..3.82...
.9......4

0000000 02d8 a8f0 a7c5 2bdf 1220 c278 2469 8a19
0000010 bc66 b805 0000
..6851...
...3.....
.....452.
6.....1..
3.9..7.8.
.8....364
........1
..7.8....
.381.57..

0000000 8792 7c7b 2394 a1a1 37ac 40eb 0002 7fe1
0000010 4d06 8978 0002
.84.25.9.
5...6...1
.........
.95.4..28
8..3....5
.........
...6..1..
.3.....7.
4.78..9.3

0000000 9a00 c00a 51be 61c4 61f0 b3d5 1640 d0b0
0000010 05e5 039e
.7...85..
...19.3..
...4.6...
.36.....8
.18....7.
..2....34
...26....
..3....8.
....3.61.

gxqcn 发表于 2008-1-14 19:20:50

to mathe:

 
  我已将你的无限数独2.41版安装程序上传到我的主页空间,下载链接为:http://www.emath.ac.cn/download/mathe/sudoku.zip (931KB)

  关于数独,我没有玩过,感觉与正交拉丁方和幻方会攀上点关系。以后有空时琢磨琢磨。

mathe 发表于 2008-1-14 20:53:43

多谢了。
不过可惜这个程序我的源代码丢掉了,现在没有心思继续更新了。
所以上面文件保存过程我也没有源代码了。

gxqcn 发表于 2008-1-14 21:18:28

这确实是很令人遗憾的。:(
我也碰到过类似情况,当时都傻眼了,不过好在主要思路还在,一切从头来过,兴许框架搭得更好呢。:)

风云剑 发表于 2008-1-16 08:39:30

反汇编一下看看,呵呵。

mathe 发表于 2008-1-16 11:06:10

呵呵,反汇编也是一种手段,不过我不觉得会很容易。找到函数入口也挺麻烦的,找到以后看懂汇编代码估计也不容易:lol

kenmark 发表于 2008-1-21 09:35:53

“源代码丢掉”。。。
C写的几乎不可能逆向~

mathe 发表于 2008-1-21 14:28:29

看你这里的逆向是什么意思了。如果我自己重写,那只是时间的问题,自己写过的代码当然很快可以基本恢复。
而如果其他人,如果懂汇编,单单破译上面一个文件存储部分的算法,由于这部分算法不大,所以也不是不可能。只是对于这个题目,其实算法还是挺有规律的,应该直接用数据破译更加快。
比如看我给出的第2到第5个数据,输入相差都很小,而它们对应的输出也是挺有规律的。

kenmark 发表于 2008-1-22 14:57:18

自己重写不叫逆向,逆向是根据低等指令代码猜测组合语义相类似的高级语言模型,人工逆向的成本也很高,尤其对于C这样的语言。所以才称为逆向工程,和编译原理有得一拼,需要很复杂的自动化理论保证,目前理论支持还很差~

风云剑 发表于 2008-1-23 08:44:30

完全逆向确实没多大希望,不过就楼主的问题而言,对于精通汇编语言的人是小意思了。
而且,要看楼主是debug还是release,debug要容易多了,release因为有优化,汇编码很难懂。
页: [1] 2
查看完整版本: 算法破译