x86游戲逆向之實戰游戲線程發包與普通發包的逆向

来源:https://www.cnblogs.com/weiyuanzhang/archive/2023/05/27/17436560.html
-Advertisement-
Play Games

網游找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都下個斷點,然後讓游戲跑起來,跑起來後我們再選怪,對斷下的地方進行分析

19_34_16_93479

進游戲後 使用bp ws2_32.send下段,然後選怪,可以看到,立馬就斷下來了

19_34_24_31539

斷下來後,我們右鍵data參數,跳轉到記憶體視窗https://bpsend.net/thread-99.htm

19_34_37_71331

在記憶體視窗對這個記憶體首地址下斷點,然後去游戲裡面選怪

19_34_47_27572

選怪後游戲立馬又斷下來,這時候我們跳到上一層,下斷,再跳再下斷,多下幾個。然後讓游戲跑起來,再選怪

19_34_59_59882

然後斷下來了,這就是選怪Call了。EAX就是怪物的ID,其他參數都可以獲取到。這個Call就找到了

 

 

 

 

接下來是第二種方法:

為什麼會產生這種方法呢?因為有的游戲發包太頻繁了,你下好硬體斷點後根本來不及操作就被游戲斷點斷下來了,所以不得已使用這種方法。

 

前面都是一樣,下send斷,然後對send的data參數下硬體斷,這裡會發現它一直斷,不管你有沒有做動作都一直斷

19_44_30_97768

這就有點煩,不好繼續找,不要著急,我們來看看上面說的線程發包的流程

Thread1:游戲某功能-->組包-->加密-->寫緩衝區

 

Thread1:死迴圈->讀緩衝區是否有內容->發送

比方說你是游戲的程式員,你要實現組包,或者加密的時候如果是以下代碼:


......

......

......

組包\加

......

......

......


 

你是會把它們封裝成一個函數還是把這段代碼到處複製?應該是封裝一個函數方便一點吧?

既然是這樣,那就說明,你往數據緩衝區寫包數據的時候之前肯定會調用某個公共函數,那我們只要分析硬體斷點斷下來的時候堆棧裡面有沒有公共函數就行了,然後我們去最外層的公共函數分析。我們下好硬體斷點,然後分析一下有沒有公共調用。

 

19_50_33_77885

19_50_41_77510

010ee852這個地址2個不同的包都調用了,說明這個有可能是公共函數。我們去這個函數下個斷試試。

19_56_17_59293

這個地址斷是斷下來了,可是比較頻繁,但是根據觀察 esp+8的值一直都在變動,我們下條件斷點,過濾掉我們沒有做動作就斷下來的

20_03_06_33955

設置好條件斷點後 去游戲選怪,發現立馬斷下來了

20_03_34_78177

然後我們Ctrl+f9往上一層跟,沒跟幾層發現一個似曾相識的函數

20_04_17_49815

 

怎麼樣 簡單吧!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • > 本文首發於公眾號:Hunter後端 > 原文鏈接:[Python連接es筆記一之連接與查詢es](https://mp.weixin.qq.com/s/smp3VvWD6ChuFVuotQ9_zg) 有幾種方式在 Python 中配置與 es 的連接,最簡單最有用的方法就是定義一個預設的連接,如 ...
  • 在Python軟體開發中,tkinter中command功能的作用是為按鈕、菜單等組件綁定回調函數,用戶操作該組件時會觸發相應的函數執行。 本文涵蓋了各種組件和功能: 1、為Button組件(按鈕)綁定回調函數 import tkinter as tk def say_hello(): print( ...
  • ## IO流(input/output) ​ 數據運輸的載體或者中間鍵 ### 位元組流 #### 輸入位元組流(FileInputStream) ​ 以位元組為最小單元,讀取任何類型的文件,但是要註意字元集類型的轉換。 ```Java public static void testFileInputSt ...
  • 哈嘍大家好,今天我們來獲取一下某個生活平臺網站數據,進行可視化分析。 採集58的數據可以使用Python的requests庫和beautifulsoup庫,數據可視化分析可以使用matplotlib庫和seaborn庫。下麵是一個簡單的例子: 1、首先導入需要使用的模塊 import request ...
  • 摘要:如果希望將 JSON 文件導入到 Redis 中,首先要做的就是連接到 redis 服務。 本文分享自華為雲社區《Python將JSON格式文件導入 redis,多種方法》,作者: 夢想橡皮擦 。 在導入前需要先確定你已經安裝 Redis,並且可以啟動相關服務。 windows 上啟動 red ...
  • 好久都沒有寫點東西了,是時候有點寫東西的必要了。 去年下年底離職了,躺了幾個月,最近又兜兜轉轉換了一家公司繼續當牛馬了,前段時間八股文背了好多,難受呀,不過我也趁著前段時間自己也整理了屬於我自己的八股文,有好幾萬字吧,哈哈哈,以後就不用到處去找八股文了。 說回正題,這個group_concat的問題 ...
  • 數據類型是電腦編程中將不同類型的數據值分類和定義的方式。 通過數據類型,可以確定數據的存儲方式和記憶體占用量,瞭解不同類型的數據進行各種運算的能力。 使用`pandas`進行數據分析時,最常用到的幾種類型是: 1. 字元串類型,各類文本內容都是字元串類型 2. 數值類型,包括整數和浮點數,可用於計算 ...
  • # 一、什麼是ByteBuf 我們前面說過,網路數據的基本單位總是位元組。Java NIO 提供了 ByteBuffer 作為它的位元組容器,但是這個類使用起來過於複雜,而且也有些繁瑣。**ByteBuffer 替代品是 ByteBuf**,一個強大的實現,既解決了 JDK API 的局限性,又為網路應 ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...