今天,給大家帶來的是如何破解國際服中聊,直接打中文字,並且修復多國語言輸入法【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掉 藉此,我們的遊戲已經支持中文聊天了
感謝各位朋友 【作者】小伍
|