【文章标题】: TOM对弈围棋客户端的去“形势判断”功能限制
【作    者】: laoqian[FCG]
【邮    箱】: -
【主    页】: www.fcgchina.com
【QQ    号】: -
【软件名称】: TOMweiqi.exe
【下载地址】: http://weiqi.tom.com/down/TomWeiqi.exe
【加壳方式】: 无
【编写语言】: VC
【工    具】: OllyDbg1.10 fly, W32DSM
【操作平台】: windows系列
【软件介绍】: TOM对弈围棋客户端
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
       狗年就不打狗了,我们来一个简单的爆破吧!
       本文只适合初学者,高手略过!
       前两天在这里看到一篇【XX围棋客户端的去功能限制】的文章,搞的是新浪围棋,看了有些启发。但是我不用新浪围棋,主要是里面的

人比较赖,我发现TOM对弈围棋里面的人都比较君子!
    遂想到TOM围棋也有限制,不妨拿来看看。
       TOM对弈围棋其他也没什么,只有其中的“形势判断”极为有用,可以省去你自己数目判断的麻烦(——不过对于高手有些多余甚至降

低水平之嫌了)!
    但他有限制,主要是下面2个:
    
    1.在押分对局中使用加倍卡或者在对局中进行最多押分时(比如,一般的9段对局为5000万)押分时,可以使用形势分析功能。
      此限制,就是在观看高手对弈和棋谱时,无法在试下情况下使用“形势判断”。
    2.根据双方协议,本局不能使用形势分析功能。此限制,就是在对弈时,双方比赛前协议不能使用“形势判断”,无法使用“形势判断”


    
    由于分析得知,客户端是有代码的,但是他的出错提示都是加过密的,反汇编是看不到关键点的。那我们就来爆破他实现,工作很简单,

我只是说一下如何入手。其实对于新手破解时最困难的是如何入手,如何最恰当的下断点!
    
    用OllyDbg1.10 打开LiveBaduk.exe,中断在入口,因为没有加壳,因此直接调试,忽略所有异常,取消所有断点。
    
    F9运行,登录帐号,进入大厅!
    由于是联网调试,如果我们选择和其他人对弈时调试,肯定会有调试中断甚至掉线,会影响他人的,还连累自己的分数!那我们就选择观

看棋局进入,再调试,即使被踢出来也无所谓。
    进入某对弈房间观棋,此时切换到od,下断点bp MessageBoxA ,再切换回程序来(btw,od对函数的大小写敏感,开始没注意老是断点设

置不成功,唉)
    点击“形势判断”按钮,假设房主的协议是 “本局不能使用形势分析功能”,此时会中断,出现提示窗口的,但是我当时进的房间是可以

使用,没有中断!不要紧,那我们点击“试下”按钮,进入试下窗口,此时再点击“形势判断”按钮,中断!如下:
    
    
    77D504EA U>  8BFF                 mov edi,edi    ; 我们的bp MessageBoxA 断点,停在这
    77D504EC     55                   push ebp       ;F8一路走
    77D504ED     8BEC                 mov ebp,esp
    77D504EF     833D BC04D777 00     cmp dword ptr ds:[77D704BC],0
    77D504F6     74 24                je short USER32.77D5051C
    77D504F8     64:A1 18000000       mov eax,dword ptr fs:[18]
    77D504FE     6A 00                push 0
    77D50500     FF70 24              push dword ptr ds:[eax+24]
    77D50503     68 240BD777          push USER32.77D70B24
    77D50508     FF15 C812D177        call dword ptr ds:[<&KERNEL32.InterlockedCompa>
    77D5050E     85C0                 test eax,eax
    77D50510     75 0A                jnz short USER32.77D5051C
    77D50512     C705 200BD777 010000>mov dword ptr ds:[77D70B20],1
    77D5051C     6A 00                push 0
    77D5051E     FF75 14              push dword ptr ss:[ebp+14]
    77D50521     FF75 10              push dword ptr ss:[ebp+10]
    77D50524     FF75 0C              push dword ptr ss:[ebp+C]
    77D50527     FF75 08              push dword ptr ss:[ebp+8]
    77D5052A     E8 2D000000          call USER32.MessageBoxExA  ;F8一路走
    77D5052F     5D                   pop ebp
    77D50530     C2 1000              retn 10    ;返回到下面
   
   
  .......
    6C14C8D7     FF7424 10            push dword ptr ss:[esp+10]
    6C14C8DB     50                   push eax
    6C14C8DC     FF7424 10            push dword ptr ss:[esp+10]
    6C14C8E0     51                   push ecx                   ;F8一路走到这,看堆栈窗口如下提示
    6C14C8E1     FF15 D0B5186C        call dword ptr ds:[<&USER32.MessageBoxA>]      ;返回到这里
    6C14C8E7     5E                   pop esi
    6C14C8E8     C2 0C00              retn 0C      ;返回到jmp.&MFC42.#4224
    6C14C8EB     8B4E 20              mov ecx,dword ptr ds:[esi+20]
    6C14C8EE   ^ EB E7                jmp short MFC42.6C14C8D7
    6C14C8F0     E8 4F49FAFF          call MFC42.#2864
    6C14C8F5   ^ E9 EE8AFAFF          jmp MFC42.6C0F53E8
    
    0012CD94   000A09FE  |hOwner = 000A09FE ('摆718房间的棋',class='#32770')
    0012CD98   016157F0  |Text = "在押分对局中使用加倍卡
    
    或者在对局中进行最多押分时(比如,一般的9段对局为5000万)押分时,
    
    可以使用形势分析功能。"
    0012CD9C   00D04F50  |Title = "Tom对弈"
    0012CDA0   00000030  \Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
    0012CDA4   0483A2D0
    0012CDA8   00438FC4  返回到 LiveBadu.00438FC4 来自 <jmp.&MFC42.#4224>
  
  
    00438F60     8B4E 74              mov ecx,dword ptr ds:[esi+74]
    00438F63     8D4424 08            lea eax,dword ptr ss:[esp+8]
    00438F67     50                   push eax
    00438F68     81C1 14050000        add ecx,514
    00438F6E     E8 8D7AFDFF          call LiveBadu.00410A00
    00438F73     8B0D 08065600        mov ecx,dword ptr ds:[560608]
    00438F79     8B81 E0060000        mov eax,dword ptr ds:[ecx+6E0]
    00438F7F     85C0                 test eax,eax
    00438F81     75 52                jnz short LiveBadu.00438FD5     ; jmp,这里就是爆破点
    00438F83     8B46 68              mov eax,dword ptr ds:[esi+68]
    00438F86     85C0                 test eax,eax
    00438F88     75 4B                jnz short LiveBadu.00438FD5    ; jmp,这里也是爆破点
    00438F8A     8D4C24 10            lea ecx,dword ptr ss:[esp+10]
    00438F8E     E8 05270D00          call <jmp.&MFC42.#540>
    00438F93     68 04030000          push 304
    00438F98     8D4C24 14            lea ecx,dword ptr ss:[esp+14]
    00438F9C     C74424 38 01000000   mov dword ptr ss:[esp+38],1
    00438FA4     E8 A5280D00          call <jmp.&MFC42.#4160>
    00438FA9     8B15 00065600        mov edx,dword ptr ds:[560600]   ; LiveBadu.0055FB78
    00438FAF     6A 30                push 30
    00438FB1     8BCE                 mov ecx,esi
    00438FB3     8B82 34020000        mov eax,dword ptr ds:[edx+234]
    00438FB9     50                   push eax
    00438FBA     8B4424 18            mov eax,dword ptr ss:[esp+18]
    00438FBE     50                   push eax
    00438FBF     E8 7A290D00          call <jmp.&MFC42.#4224>      ; 从bp MessageBoxA断点返回到这里程序领空,出现提示窗口!
    00438FC4     C74424 34 FFFFFFFF   mov dword ptr ss:[esp+34],-1
    00438FCC     8D4C24 10            lea ecx,dword ptr ss:[esp+10]
    00438FD0     E9 37010000          jmp LiveBadu.0043910C
    00438FD5     8DBE E8060000        lea edi,dword ptr ds:[esi+6E8]    ;这里,飞向光明!
    00438FDB     8BCF                 mov ecx,edi
    00438FDD     E8 EE89FDFF          call LiveBadu.004119D0
    00438FE2     8D4C24 14            lea ecx,dword ptr ss:[esp+14]
    00438FE6     8D5424 18            lea edx,dword ptr ss:[esp+18]
    00438FEA     85C0                 test eax,eax
    00438FEC     51                   push ecx
    00438FED     8D4424 20            lea eax,dword ptr ss:[esp+20]
    00438FF1     52                   push edx
    00438FF2     8D4C24 28            lea ecx,dword ptr ss:[esp+28]
     .......
     
    来到了程序领空,出现了出错窗口!我们往上看,怎样才能避开这里呢,我们发现了00438F81  jnz short LiveBadu.00438FD5,取消所有

断点,下断点在 00438F7F,重复点击试下窗口的“形势判断”按钮,中断后,我们发现走到这里不跳,我们试着改为jmp,然后F9,“形势判

断”出现了!爆破他吧!
  
  再来看第二个,此时需要进入一个禁用“形势判断”的房间,如果没有,只好自己开房了!
  进入房间后同样重复上面的工作,取消所有断点,下断点bp MessageBoxA,点击“形势判断”按钮,假设房主的协议是 “本局不能使用形势

分析功能”,此时会中断,出现提示窗口的,中断点同上,只是堆栈窗口换了下面:
  
    0012CE64   001E04DE  |hOwner = 001E04DE (class='AfxWnd42',parent=00130698)
    0012CE68   04618710  |Text = "根据双方协议,本局不能使用形势分析功能。"
    0012CE6C   00D04F50  |Title = "Tom对弈"
    0012CE70   00000030  \Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
    0012CE74   0465DCC8
    0012CE78   004F5420  返回到 LiveBadu.004F5420 来自 <jmp.&MFC42.#4224>
    
  F8一路返回到LiveBadu程序领空,如下
    004F539D     90                   nop
    004F539E     90                   nop
    004F539F     90                   nop
    004F53A0     64:A1 00000000       mov eax,dword ptr fs:[0]
    004F53A6     6A FF                push -1
    004F53A8     68 A25C5200          push LiveBadu.00525CA2
    004F53AD     50                   push eax
    004F53AE     A1 08065600          mov eax,dword ptr ds:[560608]
    004F53B3     64:8925 00000000     mov dword ptr fs:[0],esp
    004F53BA     83EC 40              sub esp,40
    004F53BD     55                   push ebp
    004F53BE     56                   push esi
    004F53BF     8BF1                 mov esi,ecx
    004F53C1     57                   push edi
    004F53C2     8B88 E0060000        mov ecx,dword ptr ds:[eax+6E0]
    004F53C8     85C9                 test ecx,ecx
    004F53CA     75 65                jnz short LiveBadu.004F5431    ; jmp,这里就是爆破点
    004F53CC     8B86 9C000000        mov eax,dword ptr ds:[esi+9C]
    004F53D2     85C0                 test eax,eax
    004F53D4     75 5B                jnz short LiveBadu.004F5431   ; jmp,这里就是爆破点
    004F53D6     8B0D 00065600        mov ecx,dword ptr ds:[560600]                  
    004F53DC     8B81 4C040000        mov eax,dword ptr ds:[ecx+44C]
    004F53E2     85C0                 test eax,eax
    004F53E4     75 4B                jnz short LiveBadu.004F5431     ; jmp,这里就是爆破点
    004F53E6     8D4C24 10            lea ecx,dword ptr ss:[esp+10]
    004F53EA     E8 A9620100          call <jmp.&MFC42.#540>
    004F53EF     68 26030000          push 326
    004F53F4     8D4C24 14            lea ecx,dword ptr ss:[esp+14]
    004F53F8     C74424 58 00000000   mov dword ptr ss:[esp+58],0
    004F5400     E8 49640100          call <jmp.&MFC42.#4160>
    004F5405     8B15 00065600        mov edx,dword ptr ds:[560600]                
    004F540B     6A 30                push 30
    004F540D     8BCE                 mov ecx,esi
    004F540F     8B82 34020000        mov eax,dword ptr ds:[edx+234]
    004F5415     50                   push eax
    004F5416     8B4424 18            mov eax,dword ptr ss:[esp+18]
    004F541A     50                   push eax
    004F541B     E8 1E650100          call <jmp.&MFC42.#4224>   ; 从bp MessageBoxA断点返回到这里程序领空,出现提示窗口!
    004F5420     C74424 54 FFFFFFFF   mov dword ptr ss:[esp+54],-1
    004F5428     8D4C24 10            lea ecx,dword ptr ss:[esp+10]
    004F542C     E9 3A020000          jmp LiveBadu.004F566B
    004F5431     8D4C24 28            lea ecx,dword ptr ss:[esp+28]   ;这里,飞向光明!
    004F5435     8DAE AC040000        lea ebp,dword ptr ds:[esi+4AC]
    004F543B     51                   push ecx
    004F543C     8BCD                 mov ecx,ebp
    004F543E     E8 BDB5F1FF          call LiveBadu.00410A00
    004F5443     8B86 C0000000        mov eax,dword ptr ds:[esi+C0]
    004F5449     85C0                 test eax,eax
    004F544B     74 52                je short LiveBadu.004F549F
    004F544D     8B86 24020000        mov eax,dword ptr ds:[esi+224]
    004F5453     85C0                 test eax,eax
    004F5455     74 48                je short LiveBadu.004F549F
    004F5457     8B15 00065600        mov edx,dword ptr ds:[560600]       ; LiveBadu.0055FB78
    004F545D     8B86 98040000        mov eax,dword ptr ds:[esi+498]
    004F5463     8B3D A88A5200        mov edi,dword ptr ds:[<&MSVCRT._mbscmp>]   ; MSVCRT._mbscmp
    
   来到了程序领空,出现了出错窗口!我们往上看,怎样才能避开这里呢,我们发现了004F53CA  jnz short LiveBadu.004F5431,取消所有

断点,下断点在 004F53C8,重复点击“形势判断”按钮,中断后,我们发现走到这里不跳,我们试着改为jmp,然后F9,“形势判断”出现了

!爆破他吧! 
  
--------------------------------------------------------------------------------
【总结】
  没什么可总结的,找好api函数断点,跟踪,爆破!主要是给大家一个过程,一个思路!
他是经常升级的,每次要改有些麻烦的!
  
--------------------------------------------------------------------------------
【版权声明】: 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!