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
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...