“银围棋剽窃的证据
我未能取得“银围棋”在第三届或第四届FOST杯的版本。下面的证据除第一节
外, 都来自市售的日文舨“银围棋”第一节的证据则得自第三届FOST杯的记录。
1. “银围棋”的着法为“手谈”所重现
这是在第三届FOST杯上的一局棋, 记录于文件SI-HT.SGF及SI-HT.GHT, “银围
棋”执白对“手谈”。
让市售英文98.10E版HT.EXE(HT)执白, 看“银围棋”的着法怎样和HT相似。
用HT读入SI-HT.GHT, 再现至第71手的黑1(图1)出现为止。点OK或打回车以停止
再现。
...................
.X.................
.XOOOOX.X.....X....
.XXOXXX....O....X..
..XXOO..X..........
.OOO............O..
...........1.7.....
...A...............
...............O...
...................
...O.5.............
...................
..O................
.O.OX3.........OOO.
2XOXO.......OOOXX..
..X.O......XXXXOXX.
.XOO...O..X..OOOOX.
46XXO.......X....X8
...............X...
图 1
打入B使HT执白。HT走在2位, 重现了“银围棋”的着法。
黑的次一手是3。在3位进黑子,HT走在4位, 重现了“银围棋”的着法。
在5位进黑子,HT走在6位, 重现了“银围棋”的着法。
HT重现了“银围棋”2,4,6等坏棋, 成为“银围棋”因袭HT的思考引擎的有力
证据。
次一手黑走7位后,HT走在A位, 不重现“银围棋”所走的8位。
现在用“修改”功能去掉A位的白子而置一白子在8位,如图2。
...................
.X.................
.XOOOOX.X.....X....
.XXOXXX....O....X..
..XXOO..X.....1....
.OOO............O..
...........X.X.....
...................
.............7.O...
...................
...O.X.............
...................
..O................
.O.OXX.........OOO.
OXOXO.......OOOXX..
..X.O......XXXXOXX.
.XOO...O..X.3OOOOX.
OOXXO..65...X2...XO
............84.X...
图 2
图2黑依次走1,3,5,7后, HT重现了“银围棋”2,4,6,8的着法。
在一局棋的初期,HT只能重现“银围棋”的小部分着法。较后的阶段则能重现
大部。
不能重现的原因可能是:
1. 定式着法或拆边时的随机选择;
2. “手谈”的版本不同;
3. 定式库的修改,业已在“银围棋”看到它用的与HT不同。
4. 剽窃者所作的其他修改。
1 和 3 是一局棋早期 HT 重现得少的主要原因。
2. “银围棋”中与“手谈”相同的数据
任何版本的“手谈”都有这么一组数据,可用下法构成一个典型的文件。用
DEBUG.EXE载入“手谈”的EXE文件, 设置适当断点(对英文98.10E版, 断点为CS:4CE5)
而使其运行。打入B令“手谈”执白, 再打P开始对弈。点右上星位以进黑子, 程序
立即停在4CE5。于是构成一个名为HT.DAT的文件以容纳DS:0-1931的数据。构成这
文件要用到特殊的方法, 见附录。
用Visual C++ 5.0 打开“银围棋”的名为PADUK.EXE的可执行文件。用功能
'Build'-'Start Debug'-'step into' 进入, 使disassembly窗及memory窗显示。
置断点于4391b8而使程序运行。选择程序执白而开一新局, 点击右上角星位以进黑
子。跟着把DS:7f454e至7f5c00的部分拷贝以构成名为SILVER.DAT的文件, 删去无用
部分。又用类似方法构成名为SILVER2.DAT的文件以容纳DS:4454f8至445660的部分。
HT.DAT是“手谈”中最重要的部分数据, 可以看到“银围棋”的数据与之相似。
开头的16字节从DS:0至DS:000F未包括在SILVER.DAT和SILVER2.DAT中。
从DS:0010至018F的部分与“银围棋”从7f455e到7f46cd相同。
靠后的部分从DS:0C80到1931与“银围棋”从7f4f4f到7f5c00相同。
中间部分从DS:0190到0c7f与“银围棋”从7f46ce到7f4f4e不同。然而若仔细考
察,就可以发现“银围棋”用了“手谈”的数据结构而仅作了小修改,内容还是一
样的。HT.DAT从DS:0190到032f, 若去掉具值FF的字节, 就和SILVER.DAT从7f46ce到
7f49bf一致。HT.DAT从DS:0330到04BF去掉FF的字节与SILVER.DAT从4454f8到445660
一致。HT.DAT从DS:04C0到064F去掉FF后与SILVER.DAT从7f4837到7f499f一致。HT.DAT
从DS:0650到0C7f去掉一些字节后与SILVER.DAT从7f49a0到7f4f4e一致。例如, 在
HT.DAT 0663下以及SILVER.DAT 7f49ae下, 有
HT.DAT SILVER.DAT
FD FA FA FA FA 及 14 个 0 FD FA FA FA FA 及 13 个 0
FE FB FA FA FA FA 及 14 个 0 FE FB FA FA FA FA 及 13 个 0
FE FB FA FA FA FA 及 14 个 0 FE FB FA FA FA FA 及 13 个 0
FE FB 01 FA FA FA 及 15 个 0 FE FB 01 FA FA FA 及 14 个 0
FD FB FB FB FD 及 16 个 0 FE FB FB FB FD 及 15 个 0
FE FE FE 00 00 ... FE FE FE 00 00 ...
HT.DAT每行去掉一个0, 就和SILVER.DAT的对应部分相同。
HT.DAT中绝大部分的数据在整个对局中是改变的。超过6000字节这样大的范围内
由“银围棋”和由“手谈”算出的数据一致, 就说明“银围棋”的这些计算与“手
谈”相同。这是“银围棋”抄袭“手谈”的强有力的证据。
附录 构成文件HT.DAT的手续:
在DOS下用命令DEBUG HT.EXE使HT.EXE在DEBUG.EXE上运行, 打入命令G4CE5, 显
示起始菜单。打B及P后出现棋盘。点击右上角星位, 抄起显示的DS值(第二行显示数
据如DS=nnnn, 记下这 nnnn)。打入Q以退出DEBUG。此时电脑仍处于特殊的显示模式,
须恢复正常的文本模式。在打了Q及回车键后, 立即打入命令DEBUG以再运行DEBUG.EXE,
在打入命令A后输入下列指令:
MOV AX,3
INT 10
INT 3
每行末须打回车。最后再打一次回车,然后打入命令G, 正常文本模式即行恢复。打
入Q退出。跟着就打入命令
DEBUG>HT.DAT
此后所有显示的东西都看不见了而送到文件HT.DAT中。从键盘打入命令
Dnnnn:0 1931
并打回车键, 其中nnnn是刚才抄下的DS值。再打Q和回车以退出。现在HT.DAT就存在
于磁盘的当前目录中。HT.DAT中的无用部分可用文字处理软件去掉。
3. C语言所需的翻译
从“手谈”所用的汇编语言翻译为C,须对数据和代码作某此改变。
下列一段代码了以作为例子。HT从CS:44B0到44D0用来传送某些数据到堆栈段的
某处。这种用法在C种不允许, 因此“银围棋”须构成另一结构以作此传送。
“银围棋”用了与“手谈”稍微不同的数据结构,如上节所述。对应的代码须
与这种结构相适应。然而,“银围棋”的引擎又是与“手谈”相同的。尽管数据结
构有所改变,代码仍须追随“手谈”而作些改变以适应数据结构的改变。
HT的CS:44B0下的代码可由DEBUG.EXE读出如下:
44B0 MOV BYTE PTR [4857],0
44B5 PUSH SS
44B6 POP ES 送数据到 SS:, 故令 ES=SS
44B7 CALL 448B
44BA MOV SI,0110
44BD MOV DI,SI
44BF MOV CX,0040
44C2 REPZ MOVSW 送80h字节
44C4 MOV SI,07E5
44C7 MOV DI,SI
44C9 MOV CX,0185
44CC REPZ MOVSW
44CE MOVSB 送30Bh字节
44CF PUSH DS
44D0 POP ES 恢复起初的 ES (=DS)
Paduk.exe (银围棋), 在Visual C 中读出 对应的HT指令
------------------------------------ (HT.EXE or HTBETA.EXE)
CS地址 指令 及解释
-------- ------------------------- -------------------------
0043C850 push ebx 其前ebx是一个结构的首址
0043C851 push esi 相当于HT的DS:
0043C852 mov ebx,dword ptr [esp+0Ch] ecx是另一结构的首址
0043C856 push edi 相当于SS:
0043C857 push ebp
0043C858 push ebx
0043C859 lea esi,dword ptr [ecx+112h] 112h = HT的[0110]
0043C85F lea edi,dword ptr [ebx+112h]
0043C865 mov byte ptr [ecx+1F98h],0 44B0 MOV BYTE PTR [4857],0
0043C86C mov ebp,ecx
0043C86E call 0043C7C0 44B7 CALL 448B
0043C873 mov ecx,20h 送80h字节
0043C878 rep movs dword ptr es:[edi],dword ptr [esi]
0043C87A lea esi,dword ptr [ebp+5CDh] 5CDh = HT的[07E5]
0043C880 lea edi,dword ptr [ebx+5CDh]
0043C886 mov ecx,5Ah 送 361(169h) 字节
0043C88B rep movs dword ptr es:[edi],dword ptr [esi]
0043C88D movs byte ptr es:[edi],byte ptr [esi]
0043C88E lea esi,dword ptr [ebp+736h] 736h = HT的[0975]
0043C894 lea edi,dword ptr [ebx+736h]
0043C89A mov ecx,5Ah 送361(169h)字节
0043C89F pop ebp 一共722(2D2h)字节
0043C8A0 rep movs dword ptr es:[edi],dword ptr [esi]
0043C8A2 movs byte ptr es:[edi],byte ptr [esi]
0043C8A3 pop edi
0043C8A4 pop esi
0043C8A5 pop ebx
0043C8A6 ret 4
银围棋在5CDh共送2D2h字节, 这少于HT在[07E5]送的30Bh字节。这是因为数据
结构的改变(略去一些字节, 见上面第二节)。故银围棋在这一段代码中执行的任务
是和HT在上述一段代码相同的。
4. “银围棋”嵌入了“手谈”一样的ASM指令
业已查明,“银围棋”(日文商品版,可执行文件为PADUK.EXE)的引擎是由HT作
还原工程而得, 但略施技巧。一般地, HT的一条指令翻译后成为一组指令。已经查
出大量对应。不少对应不容易理解而要小心阅读。下面举一简例。“手谈”的一个
英文版98.10E用作比较, HTBETA.EXE也可以用, 统称HT。HT的指令可由DEBUG.EXE
读出。
PADUK.EXE的CS:41bd1d至41bd62对应于HT从CS:4969到4984:
4969 CALL 5528
496C MOV BP,[DI]
496E MOV BL,[DI+2]
4971 MOV BH,[DI+8]
4974 MOV CX,[DI+3]
4977 MOV DL,[DI+5]
497A MOV DI,[DI+6]
497D ROL CX,1
497F ROL CX,1
4981 ROL DI,1
4983 ROL DI,1
4985 RET
Paduk.exe (银围棋),从Visual C读出 HT的对应指令及解释
CS地址 指令
-------- -------------------------
0041BD1D mov eax,[004454F0] 至41bd3b, 计算一个地址
0041BD22 lea eax,dword ptr [eax+eax*8] 对应于HT的
0041BD25 mov ecx,dword ptr ds:[4454F4h] CALL 5528
0041BD2B mov edx,ecx 返回这地址于DI
0041BD2D lea ecx,dword ptr [ecx+ecx*8]
0041BD30 lea ecx,dword ptr [edx+ecx*2]
0041BD33 lea ecx,dword ptr [ecx+ecx*8]
0041BD36 add eax,ecx
0041BD38 add eax,dword ptr [ebp-1Ch]
0041BD3B add eax,0A14h
0041BD40 mov dword ptr [ebp-18h],eax 贮存这地址
0041BD43 mov dh,byte ptr [ebp+8] HT中也是DH,
银围棋把它处理为参数
0041BD46 mov edi,dword ptr [ebp-18h] 把这地址送edi
0041BD49 mov si,word ptr [edi] MOV BP,[DI]
0041BD4C mov bl,byte ptr [edi+2] MOV BL,[DI+2]
0041BD4F mov bh,byte ptr [edi+8] MOV BH,[DI+8]
0041BD52 mov cx,word ptr [edi+3] MOV CX,[DI+3]
0041BD56 mov dl,byte ptr [edi+5] MOV DL,[DI+5]
0041BD59 mov di,word ptr [edi+6] MOV DI,[DI+6]
0041BD5D rol cx,2 ROL CX,1 ROL CX,1
0041BD61 rol di,2 ROL DI,1 ROL DI,1
棋盘上的位置在“银围棋”的表示与“手谈”不同。前者表为其x,y坐标(0-18,
0-18),x坐标贮于[4454f0],y坐标贮于[4454f4]。“手谈”则表为某些数组中的相
对地址,贮于SI中。对应的数组在这两个程序中有些不同(参见第2节数据的中间部
分)。结果, 在某个数组中的地址的计算, 在这两个程序中就有所不同。这里的数组
在“银围棋”中首址为0a14+结构首址, 在“手谈”中为DS:0C81。
算出地址后, 程序从这数组取出一些数据送到一些寄存器。“银围棋”的指令
41bd49-41bd61是和“手谈”在496C-4983一样的, 只是他们用si代替BP。
这些指令中包括ROL。在C语言中没有对应于ROL的语句, 显然他们是用_asm把汇
编指令直接嵌入。这是“银围棋”抄袭“手谈”的强有力的证据。
5. “手谈”巨大数量的指令被直接抄袭
上节已指出“银围棋”把“手谈”的指令嵌入。已经查出,“手谈”中被这样
嵌入的指令数量巨大。这是“银围棋”抄袭“手谈”的最强证据。
由于这些指令数量过于庞大,这里只能列出其中一小部分。这是“手谈”中一
个很大的子程序的一部分。它位于另一个代码段CS1,不同于入口处的CS段。要读出
这一段, 在MS-DOS状态下打入命令
DEBUG HT.EXE
再打U及回车键, 可以从最后显示的一行看到
0088 MOV AX, ...
逗号后的地址就是CS1段的段址。打入RCS及回车, 把这个段址输入以把CS改为CS1的
段址, 跟着就可以用命令U291读出CS1:0291以下的指令。
可以看出两个程序的这部分指令是几乎完全相同的,只是“银围棋”把“手谈”
所用的BP改为SI。
Paduk.exe (银围棋), 由 Visual C 读出
------------------------------------ HT中对应的指令及解释
CS中地址 指令
-------- -------------------------
0041C678 test bh,3 0291 TEST BH,03
0041C67B jp 0041C72A 0294 JPE 02E0
0041C681 mov al,bl 0296 MOV AL,BL
0041C683 and al,0C3h 0298 AND AL,C3
0041C685 je 0041C72A 029A JZ 02E0
0041C68B jnp 0041C72A 029C JPO 02E0
0041C691 test si,3C3h 029E TEST BP,03C3
0041C696 jne 0041C735 02A2 JNZ 02E6
0041C69C test bh,1 02A4 TEST BH,01
0041C69F je 0041C702 02A7 JZ 02CA
0041C6A5 cmp al,82h 02A9 CMP AL,82
0041C6A7 jne 0041C72A 02AB JNZ 02E0
0041C6AD test cl,5 02AD TEST CL,05
0041C6B0 jne 0041C6FD 02B0 JNZ 02C7
0041C6B6 test cl,0Ah 02B2 TEST CL,0A
0041C6B9 je 0041C72A 02B5 JZ 02E0
0041C6BF mov word ptr ds:[446CD4h],dx call前保护dx,cx
0041C6C6 mov word ptr ds:[446CD0h],cx
0041C6CD mov ecx,dword ptr [ebp-10h] 取参数
0041C6D0 call 0041EDE0 02B7 CALL 1178
0041C6D5 mov dx,word ptr ds:[446CD4h] 恢复dx,cx
0041C6DC mov cx,word ptr ds:[446CD0h]
0041C6E3 shr eax,10h “银围棋”另加的两条指令,
0041C6E6 or ah,al 相当于HT在CALL后返回的标志
0041C6E8 jne 0041C6FD 02BA JBE 02C7
0041C6EE add dh,2 02BC ADD DH,02
0041C6F1 test cl,0Fh 02BF TEST CL,0F
0041C6F4 jnp 0041C6FD 02C2 JPO 02C7
0041C6FA add dh,2 02C4 ADD DH,02
0041C6FD jmp 0041EC72 02C7 JMP 1148
0041C702 test bh,2 02CA TEST BH,02
0041C705 je 0041C72A 02CD JZ 02E0
0041C70B cmp al,41h 02CF CMP AL,41
0041C70D jne 0041C72A 02D1 JNZ 02E0
0041C713 test cl,0Ah 02D3 TEST CL,0A
0041C716 jne 0041C6FD 02D6 JNZ 02C7
0041C71C test cl,5 02D8 TEST CL,05
0041C71F jne 0041C6BF 02DB JNZ 02B7
0041C725 jmp 0041EC72 02DD JMP 1148
0041C72A test si,0FFFh 02E0 TEST BP,0FFF
0041C72F je 0041C73A 02E4 JZ 02E9
0041C735 jmp 0041C868 02E6 JMP 039E
0041C73A test bl,3 02E9 TEST BL,03
0041C73D jp 0041C6FD 02EC JPE 02C7
0041C743 test bl,1 02EE TEST BL,01
0041C746 je 0041C7E4 02F1 JZ 0350
0041C74C mov al,cl 02F3 MOV AL,CL
0041C74E and al,0EBh 02F5 AND AL,EB
0041C750 cmp al,82h 02F7 CMP AL,82
0041C752 je 0041C788 02F9 JZ 0317
0041C758 mov ah,bl 02FB MOV AH,BL
0041C75A and ah,0CCh 02FD AND AH,CC
0041C75D cmp ah,88h 0300 CMP AH,88
0041C760 je 0041C788 0303 JZ 0317
0041C766 cmp ax,8080h 0305 CMP AX,8080
0041C76A je 0041C788 0308 JZ 0317
0041C770 cmp ax,802h 030A CMP AX,0802
0041C774 je 0041C788 030D JZ 0317
0041C77A cmp cl,0 030F CMP CL,00
0041C77D jne 0041C7AE 0312 JNZ 032F
0041C783 jmp 0041EC72 0314 JMP 1148
0041C788 add dh,6 0317 ADD DH,06
0041C78B mov al,bl 031A MOV AL,BL
0041C78D and al,30h 031C AND AL,30
0041C78F cmp al,30h 031E CMP AL,30
0041C791 je 0041C7DF 0320 JZ 034D
0041C797 test ch,14h 0322 TEST CH,14
0041C79A jne 0041C7DC 0325 JNZ 034A
0041C7A0 test bl,10h 0327 TEST BL,10
0041C7A3 jne 0041C7DC 032A JNZ 034A
0041C7A9 jmp 0041EC72 032C JMP 1148
0041C7AE test bl,88h 032F TEST BL,88
0041C7B1 jne 0041C7DF 0332 JNZ 034D
0041C7B7 test cx,82AAh 0334 TEST CX,82AA
0041C7BC jne 0041C7DF 0338 JNZ 034D
0041C7C2 test cl,14h 033A TEST CL,14
0041C7C5 je 0041C7DF 033D JZ 034D
0041C7CB lahf 033F LAHF
0041C7CC dec dh 0340 DEC DH
0041C7CE sahf 0342 SAHF
0041C7CF jnp 0041C7DF 0343 JPO 034D
0041C7D5 dec dh 0345 DEC DH
0041C7D7 jmp 0041EC72 0347 JMP 1148
0041C7DC add dh,2 034A ADD DH,02
0041C7DF jmp 0041EC72 034D JMP 1148
0041C7E4 mov al,cl 0350 MOV AL,CL
0041C7E6 and al,0D7h 0352 AND AL,D7
0041C7E8 cmp al,41h 0354 CMP AL,41
0041C7EA je 0041C820 0356 JZ 0374
0041C7F0 mov ah,bl 0358 MOV AH,BL
0041C7F2 and ah,0CCh 035A AND AH,CC
0041C7F5 cmp ah,44h 035D CMP AH,44
0041C7F8 je 0041C820 0360 JZ 0374
0041C7FE cmp ax,4040h 0362 CMP AX,4040
0041C802 je 0041C820 0365 JZ 0374
0041C808 cmp ax,401h 0367 CMP AX,0401
0041C80C je 0041C820 036A JZ 0374
0041C812 cmp cl,0 036C CMP CL,00
0041C815 jne 0041C846 036F JNZ 038C
0041C81B jmp 0041EC72 0371 JMP 1148
0041C820 add dh,6 0374 ADD DH,06
0041C823 mov al,bl 0377 MOV AL,BL
0041C825 and al,30h 0379 AND AL,30
0041C827 cmp al,30h 037B CMP AL,30
0041C829 je 0041C7DF 037D JZ 034D
0041C82F test ch,28h 037F TEST CH,28
0041C832 jne 0041C7DC 0382 JNZ 034A
0041C838 test bl,20h 0384 TEST BL,20
0041C83B jne 0041C7DC 0387 JNZ 034A
0041C841 jmp 0041EC72 0389 JMP 1148
0041C846 test bl,44h 038C TEST BL,44
0041C849 jne 0041C7DF 038F JNZ 034D
0041C84F test cx,4155h 0391 TEST CX,4155
0041C854 jne 0041C7DF 0395 JNZ 034D
0041C85A test cl,28h 0397 TEST CL,28
0041C85D je 0041C7DF 039A JZ 034D
0041C863 jmp 0041C7CB 039C JMP 033F
0041C868 mov ax,si 039E MOV AX,BP
... ...