2019年7月27日 星期六

Counter Strike Source - Data Collect

此篇是介紹分析射擊遊戲(Counter Strike Source)的結構資訊,因為想要撰寫AimBot(自動瞄準)相關的外掛,或者是添加自己的AI(Artificial Intelligence)讓它自動去尋找獵物,這些免不了需要知道自己和敵人的坐標、血量以及相關的地圖資訊,那麼我們就能利用這些資訊來達成我們的目的。

一、獲取血量資訊


由於在每款遊戲中,人物的血量是自己能控制的,而且又是直接顯示在介面上給玩家知道,因此我們就能利用這點來簡單找到人物的資料結構。

[edi+34]對應到的記憶體位址是0x10CFA7BC,此4 Bytes記憶體位址,就是表示血量的資訊,我們知道人物的滿血狀態是0x64(十進制100),那我們可以扣一些血量,然後在搜尋扣完之後的血量值,這樣就能很輕易的找到血量的資訊,因此我們在0x10CFA7BC的位址裡,就是扣完的血量值0x32(十進制50)。





二、獲取隊伍資訊


蒐集隊伍資訊也是非常重要的,這樣才能知道哪些人物是敵人還是隊友,那麼之前我們有獲取到血量的資訊,因此我們可以猜測,在遊戲中,只要是相關連的資訊,這些資訊都會在同個結構,所以我們就能非常容易的找到這些資訊,不用在重新搜尋這些數值。

[ecx+30]對應到的記憶體位址是0x10CFA7B8,這邊的記憶體位址是不是很熟悉,沒錯它跟血量值只差4 Bytes,那麼我們還需要知道數值的代表意義,這邊的2代表是Terrorists (恐怖份子)角色,另外3代表是Counter-Terrorists (反恐部隊)角色。





三、獲取人物坐標


此款遊戲是屬於3D的環境,因此坐標會分為X、Y、Z,X對應橫向移動、Y對應縱向移動,Z對應深淺的空間移動,因此我們能透過Y值來找出坐標,因為Y是縱向移動,我們能控制人物在不同的高度,它就能明確的增加數值或減少數值來找到它在記憶體中的資訊。

不過當我們找到人物所在的結構,因此坐標數值就是在此結構中,所以也能輕易的找到[eax+38](5666.5)是代表X、[eax+3C] (3739.41)是代表Z、[eax+40](-543.969)是代表Y,這裡需要注意的是,數值為浮點數(Float),因此要將記憶體顯示改成Float,才能正確的觀察此數值。





四、物件搜尋架構


我們不僅需要自己在記憶體上的資訊,也要知道關於敵人的資訊,因此我們必然要知道程式是如何搜尋出其它人物的物件呢 ?

add edi, 140,代表者每個人物的結構大小為0x140,只要物件位址加上0x140,就是其他人物的結構起始位址。



cmp eax, 40,代表人物的最大數量,所以每次都會使用迴圈來找出這些人物的資訊。



由於程式會迴圈0x40個的人物物件,因此需要判斷是否為已初始畫人物,所以它會透過人物的坐標來確認是否為初始畫過的物件,如果X([ecx])、Z(ecx+4)、

Y([ecx+8])都為0,就代表者此物件是還沒運作的人物,就不需要繼續處理此物件。



五、獲取資料結果


綠色線標示為自己的物件資訊,紅色為其他人物的物件資訊,不過要達到不同的外掛功能,還是一樣需要從記憶體上獲取相關的資訊,這樣才能讓自己的外掛有更有趣的功能(不同版本的Counter Strike Source可能資料結構或程式邏輯可能會有所不同,不過分析方法都一樣)。