|

- UID
- 22592
- 帖子
- 25
- 主題
- 2
- 精華
- 0
- 積分
- 8
- 楓幣
- 526
- 威望
- 6
- 存款
- 0
- 贊助金額
- 0
- 推廣
- 0
- GP
- 4
- 閱讀權限
- 10
- 在線時間
- 34 小時
- 註冊時間
- 2013-2-6
- 最後登入
- 2026-9-5
|
|
本帖最後由 604759123 於 2026-9-5 15:03 編輯
前言
各位壇友們好
近期古早味的楓之谷熱潮再現,除了Artale還有經典服
就想回味一下古早的功能是怎麼搞
最近開始重新探險,較少看到代碼查找攻略又或者是已經消失
因此結合網上有人分享過加自己研究的內容,做一個紀錄分享,也希望有興趣研究的朋友們一起耍
有些東西可能不是正確或有更好的做法,若有大佬看到也請不吝指點
(不好意思原本有附圖片,但文章內要進行上傳壓縮才能貼出來,我會再整理重新貼上,後續可能也考慮用影片比較適合)
--
環境說明
首先,因為主要的目的及體驗是找出功能及修改的樂趣,我只使用私服測試
第一、沒研究Anti-cheat相關的內容,第二、能使用私服GM指令可以輔助很多
當然其思路在對應的相關版本應該是通用的
感謝各位前人的傳承,以及後續開發私服、登入器的大佬們,讓小弟有機會能踏上這時空之旅
環境&工具如下:
CE(Cheat Engine) @dark Byte https://github.com/cheat-engine/cheat-engine
(必備工具,在使用下列的相同環境下,不用搞成UCE,大概只要改成VEH debugger,之後會研究下用x32dbg, ghidra來輔助找些花樣)
TwMs CEM @冰楓 https://bingfong.com/thread-6812-1-1.html
(想測試或比較不同的數據功能,可以參考不同版本)
TWMSv113伺服器 @D363N6UY https://github.com/D363N6UY/MapleStory-v113-Server-Eimulator
(自己開服用的工具,內容算很純淨,版本則是因為跟古老反盾、狂狼反盾接近,可玩私服也很多,適合拿來研究修改)
TWMSv113~v194登入器 @zhyon https://github.com/zhyonc/TMSLauncher
(這個登入器很重要,移除了HS、移除CRC校驗...等等反作弊的內容,用這款可以減少很多挫折)
代碼功能及數據方面,要感謝的太多了,列不完…
--
指針
基礎的CE操作的話,因為已經有很多教學,不太多贅述
但在找功能上,因為工具的更新,有些找法可以精簡些
先來找個簡單的,人物座標x方向開始搞起,這裡先打詳細一點,其他都可以以此類推
人物座標:
1. 使用CE搜尋未知的值、變動的值
2. 透過左右走、原地不動,來找出放x值的地址
3. 剩下過濾完的地址,可以看出x往右是+,往左是-
4. 找到x值的儲存地址後(可能會有多個,多切換地圖,可以過濾掉剩下幾個,加入到地址列表,
右鍵看下"找誰訪問(Find out what accesse this address[F5])"、"找誰改寫Find out what writes this address[F6]",確認結尾偏移值
5. 加入到代碼列表後,右鍵Generate pointermap,保存
6. 重開遊戲,再找一次儲存x值的地址,右鍵選擇Pointer Scan,並使用剛才儲存的地址做比較
(重開時的小技巧,記住幾個地圖傳送後的值,重開後直接搜尋這些值就好)
7. 如果還有很多地址,可以使用工具列右邊的Rescan指定結尾的偏移值,或多做幾次儲存再比較
8. 將剩下的指針都雙擊放入代碼列表,重開遊戲、換頻可以找到最後剩下唯一的(也可能還有數個)
9. 遊戲設計上通常y座標位於X座標的偏移+4*n/-4*n,試了一下發現是+4,因此也獲取了y的指針,y是上-下+
牆壁座標:
1. 因為我們有了人物座標,可以使用人物走到最左跟最右邊,來大概推測牆壁X左值、右值
2. 走到最左邊,直接搜尋人物此時X座標範圍值,最右同理
(info: 我原本是用範圍去抓,後來發現值跟人能走到的位置相同。此牆壁的值可以限制新產生的怪物座標)
滑鼠座標:
1. 根據人物的左-右+,推測滑鼠也是,很快能找到
人物狀態:
1. 切換人物左右、爬梯、跳躍、趴下,使用變動的值可以找到儲存地址,一樣使用Pointer scan能快速找出基址+偏移
(找到人物狀態後,可以使用Memory View->Tool->Dissect structure,看出一些其他功能的端倪)
(info: 面左5/左走3/左爬繩11/左趴B/左跳(含被撞)7/游泳左D/墓碑左13
右邊等於左-1 ex:面右=4)
喘氣狀態(停止呼吸):
1. 利用攻擊後、被攻擊後的狀態,搜尋變動的值可以找到
(info: 5000ms倒數到0)
攻擊次數(攻擊不停):
1. 假設我們不知道一開始沒攻擊的值=0,一樣搜尋未知的值、打幾下、增加的值,可以搜出來
(info: 換地圖可以歸零)
--
指令修改&編寫數據&功能實現
根據歷史代碼及數據來看,早期沒有CRC bypass的時候,大部分是使用硬體斷點改變暫存器或改變Flag來完成功能
後來還有ICS數據的方式,而我們使用的登入器可以好好享受沒有這困擾
攻擊不停:
一樣是Hello World的攻擊不停開始,其實打勾鎖定住指針就能實現,不過我不確定是不是因為私服關係
這邊用修改指令&寫數據方式,可以不用找到基址跟偏移就達到功能了
一開始搜到攻擊次數的值後,因為我們想知道哪邊寫入,直接右鍵"找誰改寫" ,接著攻擊一下,會跳出一條計數1的指令
mov [ecx+08],eax 可以看出把eax內容放進我們找到的地址,剛好上一條很明顯是inc eax,我們可以請他不要+1
有幾種作法:
1. 就直接nop掉,用簡單的數據寫入,可以看到數字不會再增加,目前測試還沒有異狀
2. 上面有個判斷可以改寫指令 (把比較值無限大、比較完的跳轉改成跳過計算那行...)
mov eax,[ecx+08] //目前儲存的地址
cmp eax,[ecx+0C] //下斷點可以知道這裡是100(停止攻擊)
jl 0096ED66 //比較結果 小於等於100就去inc那行
推敲出代碼前面的邏輯,就比較好操作了
無敵:
先推測什麼情況下有無敵(假設是不會被碰撞): 1.被撞到之後短暫期間 / 2.MISS之後短暫期間 / 3.開啟某些技能 / 4.死亡 ...
我們前面有找出人物狀態,可以利用被撞到時的狀態來下斷,並且是只有傷害時才改寫或訪問到這個位置
可以看到只有一條是被撞到時才出現計數1
查看指令位置可以看到有一條
cmp eax,12 //比較是否為墓碑狀態
下面je則是如果是墓碑就跳轉,我們可以先測試有什麼效果
讓他直接跳轉(jmp)過去,怪物會直接碰不到,原因大概是把你當成墓碑了
補充說明 : 這邊可以用一下以前的硬體斷點改法演示,以前常看到 ZF[V][] 類似這種,意思是改暫存器標示,所以這邊根據JE判斷方式(ZF=1),我們可以做如下修改
那這樣就是ZF=1的效果了
也可以利用EIP直接指定你要跳轉地址哦
(這邊的無敵算有點導果為因的找法...一來是我印象我有看過,二來是找傷害/碰撞判斷感覺比較正規,後續會再研究不同種類的無敵)
撞擊時間(連撞/無敵秒數):
從無敵附近及相關代碼稍微閒晃一下,看到了一個特殊的comment,寫了1500
這不就是撞擊後的冷卻時間嗎?(1500ms,根據喘氣時間大略計算)
直接改成0測試 => 實現連撞
那麼改成其他秒數 => 實現幾秒後無敵 (類似老版本58秒無敵那種效果)
MISS連撞:
一樣在附近閒晃,看到-1500,直接狠狠地把它改成0 => 就變成了MISS連撞啦(還沒達成MISS無敵,所以有傷害)
--260905 更新
吸怪V1:
我們前面找到了人物座標,可以進行"找誰改寫",原本想先測試移動速度或距離的調整
查找影響座標的內容時- MapleStory.exe+5D4FA7 - 89 03 - mov [ebx],eax
複製代碼 看到這個EAX值可以先手癢改看看,EAX改成FFFFFFFF(-1)
形成了一個詭異的X值吸怪 那估計Y值的這個指令也加入,就會變成雙方向的吸怪了
看一下Y方向也下斷EAX改FFFFFFFF(-1)
所以猜測這個位置就是共用”座標寫入”指令 由於這邊是寫入的指令,所以修改後角色無法移動
我們可以推測一下,想吸怪的話,就是在寫這個值的時候,怪物的值直接跟隨玩家的值
我們大概有了基本的數據想法- 偽代碼:
- 修改處:
- 目前這個寫入X座標的指令,把[玩家座標]放入
- 繼續執行
- X指令移動的地方:
- 跳到 修改處
- (Y同理)
複製代碼 接下來就是老用戶都知道了,Memory view->Tool->Auto Assemble->Cheat Table Framework Code- [ENABLE]
- alloc(VacV1,1024) //註冊一段區塊用來放我們寫的數據,取名為吸怪V1(VacV1)
- label(MobX) //設定一個數據內的標籤,X修改的位置
- label(MobY) //設定一個數據內的標籤,Y修改的位置
-
- VacV1: //數據的內容
- MobX: //X修改的位置
- mov eax,[[00BF16E8]+EC0] //EAX寫入為玩家座標(用指針取 值)
- mov [ebx],eax //X位置原本代碼
- mov edi,[ebp+10] //原本下一行代碼
- jmp 009D4FAC //原本下二行代碼
-
- MobY: //Y修改的位置
- mov eax,[[00BF16E8]+EC4] //EAX寫入為玩家座標(用指針取 值)
- mov [edi],eax //Y位置原本代碼
- mov ebx,[ebp+14] //原本下一行代碼
- jmp 009D5011 //原本下二行代碼
-
- 009D4FA7: //原本寫入X指令的位置
- jmp MobX //跳去自己寫的數據
-
- 009D500C: //原本寫入Y指令的位置
- jmp MobY //跳去自己寫的數據
-
- [DISABLE] //取消時還原
- 009D4FA7:
- DB 89 03 8B 7D 10
- 009D500C:
- DB 89 07 8B 5D 14
- dealloc(VacV1)
複製代碼
可以看到所有怪物都被吸過來了
延伸: 由於此時大家共用此代碼,會被強制寫入,角色不能移動,我們會希望只有怪物執行
那麼怎麼分別人物與怪物呢?
這時候在指令處右鍵使用”Find out what address this instruction accesses” 找出誰在原本這些指令
並將Value設置為signed(有符號顯示),比較好分辨那些是當前有在地圖座標內的地址
除了人物本身的座標位置,其他就是怪物的了,還有一些目前不明的資訊
我們先點選玩家,設定為Group1(群組1);怪物相關的Ctrl多點幾個設定為Group2,接著把這兩個群組的地址都選起來
按Scan for commonalties
用來比較區別的內容
然後來做一下這版本吸怪的實際測試,可以看到這個修改方法的已知問題:
1.取消時怪物會立即回到原本位置,
2.掉落物品在原本位置
3.NPC也會被吸過來
4.以上幾點可知,並非完全修改了物件真正的座標
其他後續補充
--
目前是下班有閒情逸致想到就會開機來搞一下,偶爾搞搞其他遊戲,結果最後也是在玩CE,哈哈
其他再陸續更新,也可能想用影片,或許邊研究邊錄邊說會方便一點,也期待壇友們或大佬可以分享一些思路提供
不要去打敗黑魔法師了,一起成為黑魔法師吧
|
-
總評分: 楓幣 + 10
威望 + 1
彩票 + 1
GP + 2
查看全部評分
|