小朋友下樓梯是啥?
它不僅是一個很狂的小遊戲
它更代表了我們的童年回憶
輔助程式
其實就是外掛
這篇紀錄一下怎寫出這個糞game的外掛(記憶體外掛)
沒啥太多技術含量
首先
先開個Cheat Engine搜一下
這遊戲最基本的改法就是修改血量
一開始搜滿血是12格
讓他自殘幾次搜一下
就能找到血量值的記憶體位址
為了避免每次重開遊戲都要找一次
我們得找出人物屬性的基址(Base address)
通常人物屬性都是一條陣列,假設基址是0x1bd2
並且我們知道血量的偏移是0x04
那血量大致上就可推算是[[0x1bd2]+0x04]
下面介紹一下找基址的一種方法:
首先找出血量位址後
點選Find out what writes to this address
會跳出一個視窗 此時繼續遊戲再自殘一下
這個視窗會把寫入到這個位址的opcode列出來 相當方便
如此一來 就能幫助我們找到人物屬性陣列的位址
但這還不是基址 [人物陣列基址] = 人物陣列的位址
我們把這個位址拿去搜一下 就能找到哪個位址(基址)存放這個值
有了基址就能找各種屬性的偏移(offset)
因為人物屬性通常是條陣列
就可以亂try偏移去找一些神奇的屬性(x,y座標 目前階梯數等等)
也許就可以開發出超酷炫的功能
開始寫外掛
前面只教怎麼開發屬性和找基址
這裏正式介紹一下怎麼實作我們想要的功能
這裏我用C#來寫
下面會用到幾個函數:
ReadProcessMemory
WriteProcessMemory
OpenProcess
C#要調用Win32 api可以這樣子寫:
人物基址0x0018FD9C 血量偏移0x1170
則血量值即為[[0x0018FD9C]+0x1170]
程式中讀血量寫起來⼤概像這樣:
而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