微信扫一扫 分享朋友圈

已有 1515 人浏览分享

[服務器教學] GMS國際服直接打中文字的破解方法以及思路 「作者」: 小伍

[複製鏈接]

區域版主

Rank: 10Rank: 10Rank: 10

245

威望

1142

金錢

592

A幣
主題
130
帖子
245
精華
0
綜合社群主題發文量
9
電玩社群主題發文量
10
娛樂社群主題發文量
0
技術社群主題發文量
89
閱讀權限
100
註冊時間
2016-5-17
  • TA的每日心情

    2022-4-29 14:36
  • 簽到天數: 5 天

    連續簽到: 1 天

    [LV.2]偶爾看看I

    t9540513 發表於  2022-3-8 17:05:49 | 顯示全部樓層 | 閱讀模式
    001.jpg

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

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

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


    002.png

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

    2. {

    3.   /*

    4.   *變量聲明區域

    5.   *

    6.   */

    7.   int v2; // edi@1

    8.   _DWORD *v3; // esi@2

    9.   int v4; // ebx@2

    10.   int result; // eax@2

    11.   _DWORD *v6; // esi@4

    12.   int v7; // edi@4



    13.   v2 = this;

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

    15.   {

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

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

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

    19.     result = v0(*v3, v4);

    20.     if ( !v4 )

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

    22.   }

    23.   else

    24.   {

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

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

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

    28.     result = v0(*v6, v7);

    29.     if ( v7 )

    30.       result = v0(*v6, 0);

    31.   }

    32.   return result;

    33. }
    複製代碼



    那我們的思路就是把
    if ( a2
      {
    這個條件讓他永遠成立。那麼我們就要將


    003.png

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

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


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


    1. 008D54A6   /74 0B           je X008D54B3

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

    3. 008D54AC   |C607 20         mov byte ptr ds:[edi],0x20
    複製代碼


    且看這裡的代碼分析。


    1. if ( IsDBCSLeadByte(*(_BYTE *)v9) )//判斷文字是否為中文字符。

    2.         {

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

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

    5.           v9 += 2;

    6.         }
    複製代碼



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


    1. 00937225   /74 18           je X0093723F

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

    3. 0093722B   |C606 20         mov byte ptr ds:[esi],0x20
    複製代碼


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

    感謝各位朋友





    【作者】小伍



    共收到 0 A幣
    打賞榜
    暫無
    暫無
    暫無
    暫無
    ----
    暫無
    ----
    暫無
    ----
    暫無
    ----
    您需要登錄後才可以回帖 登錄 | 註冊會員

    本版積分規則

    245

    發文

    1142

    金錢

    592

    A幣

    ----------榮譽勳章----------

    熱門推薦
    圖文推薦
    • 聯繫我們

    小黑屋|AICL社群娛樂集團

    GMT+8, 2024-4-29 14:53 , 網路刷新 0.105651 秒 .

    歡迎來到 AICL網路社群

    版權AICL社群所有 2011-2021.

    Total:123 Today:213 Online:322