我在阿布達比UB學到的一個除錯方法

有感:https://www.ptt.cc/bbs/Soft_Job/M.1661350664.A.083.html

看到這段特別有感

補充一下,TDD 是還沒有開始寫任何的 code 之前,就先針對
程式寫好之後 “預期應該要有的行為" 先寫 test cases
接著,先跑一次測試親眼看著他 fail
因為還沒寫任何 code,所以測試絕對會 fail,
如果沒寫 code 卻 pass 那表示你的 test case 根本沒有測到。
接著才開始寫 code,重複跑測試直到確認 pass 為止,就是完成了。
不同於先寫 code 再測試,TDD 是顛倒,先測試再寫 code,所以才叫 test driven
如果程式被報 bug,也是先寫一個會 fail 的 test case,確認可以重現 bug
接著才開始改 code 修正,直到測試 pass 為止,就表示修好了。
這是一個觀念很特別的流派,他們的主張都是有道理的,就只是比較違反直覺不好實現。
如果你無法先寫出測試,那表示你還沒弄清楚要實作什麼行為,
或是你原先構思的 API 介面難以使用,以至於你寫不出 test case
這是強迫你釐清 spec 以及設計好介面的方法,但實在有點極端,被不少人視為邪教 XD

我在2020~2021年在阿布達比UB維護遊戲Growtopia.當時的案子有很多駭客想要破解我們的遊戲的攻擊行為.當時的主程式教給我一個我以前沒這樣試過的技巧.也許這種方法是有甚麼理論基礎.(但我必須強調.這整個系統跟時程就是不允許我們重構.所以也不可能有甚麼有序的測試方式.幾年的程式碼簡單來講就是靠優秀的程式員無止盡的縫補.)

不過.當我分享給同僚的時候.他們都給我一種我在講甚麼歪理的眼神.

簡單說

我們當時遇到很多透過奇妙行為(譬如說破解封包)來try我們遊戲server的行為.

因為那些行為不是正規動作.所以我們的QA部門無法用正規手段重現這些步驟.(當然終歸到底就是沒有那麼多時間/資源去真的學著逆向重建一個駭客軟體/線上的問題就是以天為單位要解掉)

所以我們無法知道這些破壞到底起因如何.(來龍去脈/竄改點)

我們只能夠知道具體來說發生破壞的時間點.(ex.爆炸點/因為有exception log)

A) 爆炸點 已知爆炸發生了.程式碼假如這樣:

{

Func1();// 我們只知道這函式進去的特定一行發生爆炸(ex. null reference),而函式發生前server環境就已經被竄改/攻擊為會爆炸的情況

}

B) 埋點: 製作一個駭客的模擬入口

{

DEBUG_HACKER_ACTION(); // 製作一個入口,我們猜測駭客的行為就是會把上述那個會爆炸的某個記憶體抹掉.

Func1();

}

C) 用後門指令手動觸發埋點DEBUG_HACKER_ACTION() : OK 現在可以重現駭客的爆炸了. (紅燈)

D) 修復: 在Func1()裡面部下重重安全機制.只要有異常就吐LOG然後封鎖該玩家(強制離開/行動取消/黑名單,etc)

E) 這步驟最重要.再次用特殊指令手動觸發埋點DEBUG_HACKER_ACTION() : OK server安全了.Log正常吐出. (綠燈)

F) 把後門指令+埋點mark起來.上線測試.抓有問題的玩家.封號.

G) 這步也很重要,如果之後又發生類似的問題.再把後門指令搬過去開起來用.快速觸發錯誤.同時也可以確認之前修掉的問題沒有再出現.

好像不是甚麼很玄妙的高招.但是面對一些客戶端/前端無法重現(譬如說一秒鐘按鈕連打60下這種不可能正常可以達到的行為所觸發)的問題.QA又兩手一攤沒辦法重現的時候,不失為一個方法.

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s