小朋友下樓梯是啥?

它不僅是一個很狂的小遊戲

它更代表了我們的童年回憶


![圖7](/images/pic7.png)

## 輔助程式

其實就是外掛

這篇紀錄一下怎寫出這個糞game的外掛(記憶體外掛)

沒啥太多技術含量


首先

先開個Cheat Engine搜一下

這遊戲最基本的改法就是修改血量


一開始搜滿血是12格

讓他自殘幾次搜一下

就能找到血量值的記憶體位址
為了避免每次重開遊戲都要找一次

我們得找出人物屬性的基址(Base address)
通常人物屬性都是一條陣列,假設基址是0x1bd2

並且我們知道血量的偏移是0x04

那血量大致上就可推算是[[0x1bd2]+0x04]
下面介紹一下找基址的一種方法:

首先找出血量位址後

點選Find out what writes to this address

圖1

會跳出一個視窗 此時繼續遊戲再自殘一下

這個視窗會把寫入到這個位址的opcode列出來 相當方便
圖2

如此一來 就能幫助我們找到人物屬性陣列的位址

圖3

但這還不是基址 [人物陣列基址] = 人物陣列的位址
我們把這個位址拿去搜一下 就能找到哪個位址(基址)存放這個值

圖4

有了基址就能找各種屬性的偏移(offset)

因為人物屬性通常是條陣列

就可以亂try偏移去找一些神奇的屬性(x,y座標 目前階梯數等等)

也許就可以開發出超酷炫的功能


## 開始寫外掛

前面只教怎麼開發屬性和找基址

這裏正式介紹一下怎麼實作我們想要的功能

這裏我用C#來寫

下面會用到幾個函數:

  1. ReadProcessMemory

  2. WriteProcessMemory

  3. OpenProcess
    C#要調用Win32 api可以這樣子寫:

圖5


人物基址0x0018FD9C 血量偏移0x1170

則血量值即為[[0x0018FD9C]+0x1170]

程式中讀血量寫起來⼤概像這樣:

圖6


而WriteProcessMemory可以寫入值到記憶體中

故可以簡單達到血量控制的效果!

當然也可以控制階層數、人物座標等


當然還能做出一些更炫砲的功能

例如….滑鼠走路!!

方法:抓滑鼠相對於遊戲視窗的座標,Timer定時設定角色座標

Demo影片: https://drive.google.com/file/d/0B0u00oV7NdOiRWtSSWhvQVZGRHc/view?usp=sharing


再來個沒啥用的功能…反重力

變小朋友上樓梯…

方法:找出修改y座標的opcode 然後把add改成sub 修改opcode一樣可用WriteProcessMemory 但盡量opcode長度改完跟原本要一樣 不然容易crash

反重力Demo: https://drive.google.com/file/d/0B0u00oV7NdOiTjd2WDd3Y1lsc3c/view?usp=sharing

Code

程式碼放在github上: https://github.com/w181496/GoingDown