这是一个很好的五子棋小程序.由于我的水平不高,常常需要悔棋,然而这个程序只能够悔棋3步,对我来说太少了,至少悔个百十来步 -:)。于是用w32dasm修改它。
用w32dasm打开程序,查找字符串“一盘棋只能悔三步!不行了吧?:>”见下面代码:
<<<<<<<<<<
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046BC37(C)
|
:0046BC89 FF0D10D34700 dec dword ptr [0047D310]
:0046BC8F EB34 jmp 0046BCC5
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0046BBA1(C), :0046BBAE(C), :0046BBBB(C), :0046BBD1(C)
|
:0046BC91 803D999A470000 cmp byte ptr [00479A99], 00
:0046BC98 7411 je 0046BCAB
* Possible StringData Ref from Code Obj ->"现在不能悔棋!"
|
:0046BC9A BA54BD4600 mov edx, 0046BD54
* Possible StringData Ref from Code Obj ->"Can not Pull Back Now!"(这个程序好像可以使用两种语言,我不懂,不管他)
|
:0046BC9F B86CBD4600 mov eax, 0046BD6C
:0046BCA4 E88F9CFFFF call 00465938
:0046BCA9 EB6E jmp 0046BD19
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046BC98(C)
|
:0046BCAB 833D10D3470000 cmp dword ptr [0047D310], 00000000
:0046BCB2 7F11 jg 0046BCC5
* Possible StringData Ref from Code Obj ->"一盘棋只能悔三步!不行了吧?:>"
|
:0046BCB4 BA98BD4600 mov edx, 0046BD98
* Possible StringData Ref from Code Obj ->"Only Pull Back 3 Steps in a Game!"(这个程序好像可以使用两种语言,我不懂,不管他)
|
:0046BCB9 B8C0BD4600 mov eax, 0046BDC0
:0046BCBE E8759CFFFF call 00465938
:0046BCC3 EB54 jmp 0046BD19
>>>>>>>>>>>>
看到了吧,“一盘棋只能悔三步!不行了吧?:>”(这句话是从0046BC98跳过来的,那里可能是在判断是否发生悔棋行为。)在这句话之上有一个比较语句,
######
0046BCAB 833D10D3470000 cmp dword ptr [0047D310], 00000000
######
是0047D310和00000000作比较,看看0047D310是什么呢?可是并没有发现有0047D310这个行代码,于是搜索0047D310这个字符串,看到有一段这样代码
######
:00471DCD C70510D3470003000000 mov dword ptr [0047D310], 00000003
######
悔棋3步会不会与这个00000003有关,试着修改它为1保存程序后运行,只悔棋一步就出现了不能再悔棋的对话框,看来就是这里了。
但是他还是傻乎乎的告诉我不能悔棋三步----@#$#@^%(*$&^%----,不管那些了。以后想悔棋几步就用16进制编辑器查找“C70510D3470003000000”修改03000000为悔棋的步数.必须注意顺序,例如改为123456789步,16进制的123456789为“15 cd 5b 07”,则应该改为“07 5b cd 15”
小弟初次写文章,有错误还请大虾们指出!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)