“银围棋剽窃的证据

  我未能取得“银围棋”在第三届或第四届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
...						...