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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...