- UID
- 1005
- 閱讀權限
- 100
- 主題
- 142
- 帖子
- 263
- 精華
- 0
- A幣
- 635
- 在線時間
- 155 小時
- 最後登錄
- 2024-11-9
區域版主
- 主題
- 142
- 帖子
- 263
- 精華
- 0
- 綜合社群主題發文量
- 9
- 電玩社群主題發文量
- 10
- 娛樂社群主題發文量
- 0
- 技術社群主題發文量
- 98
- 閱讀權限
- 100
- 註冊時間
- 2016-5-17
TA的每日心情 | 怒 2022-4-29 14:36 |
---|
簽到天數: 5 天 連續簽到: 1 天 [LV.2]偶爾看看I
|
今天,給大家帶來的是如何破解國際服中聊,直接打中文字,並且修復多國語言輸入法【v62為例】
首先,請你們跟著我的思路思考,楓之谷在打字的時候,是不是調用了主程序中原有的輸入法插件,
然後來捕獲外界輸入法打出的字?或者說國際服壓根就沒有?
當然這種猜想我們必須到程序中去調試才可以得出結果。
這時候打開我們的ollydbg,然後運行62版本的私服。
點擊ollydbg的文件-附加-選擇v62的進程
這時候ollydbg窗體就會加載完畢。我們來思考,獲取的輸入法插件,那麼一定調用的imm32這個API
有了這個思路,我們就可以很容易定位到處理輸入法的位置,我已經定位好了
- 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
查找之後出來的基址是如此的
- 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
複製代碼
且看這裡的代碼分析。
- 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
- 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掉
藉此,我們的遊戲已經支持中文聊天了
感謝各位朋友
【作者】小伍
|
|