【相關網址】
 
AICL楓之谷私服論壇技術討論區:點此


今天,給大家帶來的是如何破解國際服中聊,直接打中文字,並且修復多國語言輸入法【v62為例】

首先,請你們跟著我的思路思考,楓之谷在打字的時候,是不是調用了主程序中原有的輸入法插件,然後來捕獲外界輸入法打出的字?或者說國際服壓根就沒有?當然這種猜想我們必須到程序中去調試才可以得出結果。
這時候打開我們的ollydbg,然後運行62版本的私服。點擊ollydbg的文件-附加-選擇v62的進程

這時候ollydbg窗體就會加載完畢。我們來思考,獲取的輸入法插件,那麼一定調用的imm32這個API
有了這個思路,我們就可以很容易定位到處理輸入法的位置,我已經定位好了



黃色部位為基址,紅色為Aob,藍色為彙編代碼區,紫色為代碼注釋
且看彙編代碼分析

[AppleScript] syntaxhighlighter_viewsource syntaxhighlighter_copycode
int __thiscall type(int this, int a2)//這裡是從程序里調入的方法。含兩參數,this就是這個函數本體。而a2應該就是控制是否屏蔽輸入插件

{

  /*

  *變量聲明區域

  *

  */

  int v2; // edi@1

  _DWORD *v3; // esi@2

  int v4; // ebx@2

  int result; // eax@2

  _DWORD *v6; // esi@4

  int v7; // edi@4



  v2 = this;

  if ( a2 )//最前面傳下來的參數,拿過來判斷

  {

  /*這裡應該是將result變量賦值為調出輸入法*/

    v3 = (_DWORD *)(this + 164);

    v4 = v0(*(_DWORD *)(this + 164));

    result = v0(*v3, v4);

    if ( !v4 )

      result = v0(*v3, *(_DWORD *)(v2 + 168));

  }

  else

  {

  /*這裡應該是將result變量賦值為不調出輸入法*/

    v6 = (_DWORD *)(this + 164);

    v7 = v0(*(_DWORD *)(this + 164));

    result = v0(*v6, v7);

    if ( v7 )

      result = v0(*v6, 0);

  }

  return result;

}

那我們的思路就是把
if ( a2 
  {

這個條件讓他永遠成立。那麼我們就要將



這個語句令他失效
選中這個語句,右鍵-二進制-用NOP填充。這時候遊戲中應該可以調出輸入框了。

但是打不出去的,這裡肯定是還有
其他的判斷。這裡我們留著作為明天的講義來說吧


既然我們已經可以在遊戲中直接打出中文,那麼在發送的時候為什麼是無法發送出去的呢?這裡我們一起來思考這個文字處理的流程
首先-調出輸入法的插件-捕獲輸入的字符-發送-??-??-角色顯示
(作者注釋:這裡的??就是代表我們未知的處理流程)
這裡我們可以猜想。如果你是開發者,為了統一遊戲語系編碼問題,你會怎麼做呢?
是不是會去檢測每個輸入的字符?然後排除異類?
至少我是會這麼做。
那麼我們如何來找到哪裡是處理這些字符的地方呢?
這裡我放出死碼定位法來查找這些處理的位置
用ollydbg附加MapleStory.exe[這裡我用的是v83的客戶端]
然後點擊ctrl+b
輸入以下特征碼C6 47 01 20 C6 07 20
查找之後出來的基址是如此的

[AppleScript] syntaxhighlighter_viewsource syntaxhighlighter_copycode
008D54A6   /74 0B           je X008D54B3

008D54A8   |C647 01 20      mov byte ptr ds:[edi+0x1],0x20

008D54AC   |C607 20         mov byte ptr ds:[edi],0x20




且看這裡的代碼分析。

[AppleScript] syntaxhighlighter_viewsource syntaxhighlighter_copycode
 if ( IsDBCSLeadByte(*(_BYTE *)v9) )//判斷文字是否為中文字符。

        {

          *(_BYTE *)(v9 + 1) = 32;//是中文字符就去掉這些字符或者轉碼掉

          *(_BYTE *)v9 = 32;//是中文字符就去掉這些字符或者轉碼掉

          v9 += 2;

        }


然後把找到的兩個mov指令【科普下。這是數據傳送指令。把一個數據從源地址傳送到目標地址
右鍵二進制-用nop填充
這時候我們在遊戲中打出的中文可以輸出了。但是看到是null。這個怎麼辦呢,說明我們少了一步。這個步驟的功能就是把發出去的字轉碼成Unicode碼(國際服都這麼轉碼)
同樣的,使用死碼定位法。特征碼我為你們找好了:C6 47 01 20 C6 06 20
這時候出現的是和我們上次找的差不多的mov

[AppleScript] syntaxhighlighter_viewsource syntaxhighlighter_copycode
00937225   /74 18           je X0093723F

00937227   |C646 01 20      mov byte ptr ds:[esi+0x1],0x20

0093722B   |C606 20         mov byte ptr ds:[esi],0x20


這裡我們也是選擇NOP掉
藉此,我們的遊戲已經支持中文聊天了

感謝各位朋友


【作者】小伍

{ 2 留言... read them below or Comment }

  1. 我連OllyDBG都不會用 附加玩遊戲後 就不知道下一步了QQ 新手想知道詳細步驟

    回覆刪除
  2. 請受小弟一拜,小弟從來沒用過ollydbg,但到現在即便成功了,也只是照著大大的教學去推測改動而已,反推觀念真的厲害,還希望往後能有更多更深入的教學文章。

    回覆刪除

- Copyright © AICL社群娛樂集團 - 網站區 - Date A Live - Powered by Blogger - Designed by Johanes Djogan -