網游找Call的過程中難免會遇到不方便通過數據來找的或者僅僅查找數據根本找不到的東西,但是網游中一般的工程肯定要發給伺服器,比如你打怪,如果都是在本地處理的話就特別容易產生變態功能,而且不方便與其他玩家通信,所以找到了游戲發包的地方,再找功能就易如反掌了。 在游戲逆向過程中,通常會遇到下麵幾種情況的 ...
網游找Call的過程中難免會遇到不方便通過數據來找的或者僅僅查找數據根本找不到的東西,但是網游中一般的工程肯定要發給伺服器,比如你打怪,如果都是在本地處理的話就特別容易產生變態功能,而且不方便與其他玩家通信,所以找到了游戲發包的地方,再找功能就易如反掌了。
在游戲逆向過程中,通常會遇到下麵幾種情況的發包。
1.在主線程直接發包
游戲某功能-->組包-->加密-->發送
2.線上程中發包
Thread1:游戲某功能-->組包-->加密-->寫緩衝區
Thread1:死迴圈->讀緩衝區是否有內容->發送
主線程發包的話偽代碼大致如下:
bool GameFunc(...)
{
if(xxx)
{
......
......
......
send(x,x,x,x);
}
}
線程發包大致偽代碼如下:
char g_szBuf[4096]={0};
bool GameFunc(...)
{
if(xxx)
{
......
......
......
//打開互斥
WriteProcessMemory(...,g_szBuf......);
}
}
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
char szTmpBuf[4096]={0};
while(1)
{
//打開互斥
if(strlen(g_szBuf)!=0)
{
memcpy(szTmpBuf,g_szBuf);
ZeroMemony(g_szBuf);
}
//關閉互斥
send(....,szTmpBuf....);
ZeroMemony(szTmpBuf);
Sleep(10);
}
}
當然。。以上代碼肯定有錯誤,大概就是表達個意思,就是一個是直接組好包就發 一個是線上程裡面發
1.主線程發包
在游戲裡面如何分辨是不是主線程發包?
首先肯定是跳轉到3大發包函數,send , sendto ,WSASend 分別下段。 如果下斷點馬上就斷下,那麼基本就是線程發包了。除此之外,是主線程發包的可能性比較大了。
這種情況下,bp ws2_32.send下好斷點後,只要Crtr+f9多跳幾層,每層都打好斷點就很容易判斷出功能函數了
2.線程發包
那麼線程發包是什麼情況呢?
就是在發包函數上下斷點馬上就斷下,而且斷的非常的頻繁,基本就可以確定是線程發包了。
找線程發包的主要步驟如下:
找到真正的發包函數, 找到包內容的位置。 再跟包內容的寫入位置,基本就可以找到正確的明文包了。
接下來具體分析線程發包,跳出線程發包有兩種方法,如果游戲發包不頻繁,建議使用第一種方法,如果游戲發包異常多,建議使用第二種方法
下麵的演示以天龍八部私服和官服分別演示,因為天龍八部私服發包不頻繁所以用來演示第一種方法,具體操作就是 進游戲有下send斷點,然後對數據包下硬體訪問斷點,我們去游戲選怪,硬體斷點斷下後,刪除我們下的斷點,然後Ctrl+f9一層一層返回,每次返回的CALL都下個斷點,然後讓游戲跑起來,跑起來後我們再選怪,對斷下的地方進行分析
進游戲後 使用bp ws2_32.send下段,然後選怪,可以看到,立馬就斷下來了
斷下來後,我們右鍵data參數,跳轉到記憶體視窗https://bpsend.net/thread-99.htm
在記憶體視窗對這個記憶體首地址下斷點,然後去游戲裡面選怪
選怪後游戲立馬又斷下來,這時候我們跳到上一層,下斷,再跳再下斷,多下幾個。然後讓游戲跑起來,再選怪
然後斷下來了,這就是選怪Call了。EAX就是怪物的ID,其他參數都可以獲取到。這個Call就找到了
接下來是第二種方法:
為什麼會產生這種方法呢?因為有的游戲發包太頻繁了,你下好硬體斷點後根本來不及操作就被游戲斷點斷下來了,所以不得已使用這種方法。
前面都是一樣,下send斷,然後對send的data參數下硬體斷,這裡會發現它一直斷,不管你有沒有做動作都一直斷
這就有點煩,不好繼續找,不要著急,我們來看看上面說的線程發包的流程
Thread1:游戲某功能-->組包-->加密-->寫緩衝區
Thread1:死迴圈->讀緩衝區是否有內容->發送
比方說你是游戲的程式員,你要實現組包,或者加密的時候如果是以下代碼:
......
......
......
組包\加密
......
......
......
你是會把它們封裝成一個函數還是把這段代碼到處複製?應該是封裝一個函數方便一點吧?
既然是這樣,那就說明,你往數據緩衝區寫包數據的時候之前肯定會調用某個公共函數,那我們只要分析硬體斷點斷下來的時候堆棧裡面有沒有公共函數就行了,然後我們去最外層的公共函數分析。我們下好硬體斷點,然後分析一下有沒有公共調用。
010ee852這個地址2個不同的包都調用了,說明這個有可能是公共函數。我們去這個函數下個斷試試。
這個地址斷是斷下來了,可是比較頻繁,但是根據觀察 esp+8的值一直都在變動,我們下條件斷點,過濾掉我們沒有做動作就斷下來的
設置好條件斷點後 去游戲選怪,發現立馬斷下來了
然後我們Ctrl+f9往上一層跟,沒跟幾層發現一個似曾相識的函數
怎麼樣 簡單吧!