Hsüan's Blog

2023-09-25

Bitburner 隱藏成就

基本上這些隱藏成就,都可以先從 Github 上的原始程式搜尋關鍵字 Player.giveExploit,大致上知道要怎麼解決。

詳細敘述如下:

Exploit: undocumented

寫一個 .js 檔案並執行,內容如下

/** @param {NS} ns */
export async function main(ns) {
    await ns.exploit()
}

執行完後靜待片刻等成就跳出即可。

可參閱原始碼於此

Exploit: bypass

寫一個 .js 檔案並執行,內容如下

const doc = eval("document")
/** @param {NS} ns */
export async function main(ns) {
    await ns.bypass(doc)
}

執行完後靜待片刻等成就跳出即可。

可參閱原始碼於此

Exploit: prototype tampering

先打開 Chrome Dev Tools,在 Console 執行

Number.prototype.toExponential = () => {}

執行完後靜待片刻等成就跳出即可。

Exploit: unclickable

寫一個 .js 檔案並執行,內容如下

const doc = eval("document")
/** @param {NS} ns */
export async function main(ns) {
    const el = doc.getElementById("unclickable")
    const key = Object.keys(el)[1]
    el[key].onClick({ target: el, isTrusted: true })
}

執行完後靜待片刻等成就跳出即可。

Exploit: alternate reality

先打開 Chrome Dev Menu,變更函數以下

console.warn = () => { debugger }

之後在遊戲裡面,寫一個 .js 檔案並執行,內容如下

/** @param {NS} ns */
export async function main(ns) {
    await ns.alterReality()
}

在抓斷點的時候找到 Call Stack 裡面前一個在 Extra.js 中的 anonymous function call

手動把 Scope 裡面 Local 變數 x 的值改成 true

然後繼續斷點下一步直到取得成就。

可參閱原始碼於此

Exploit: rainbow

參閱原始碼於此,可知道就是要猜密碼是啥。

這邊是要你用彩虹表破解。

可參考 reddit 這篇的評論

用我的 Mac Mini 大概跑了幾分鐘結果就出來了。

取得結果後,在遊戲裡面,寫一個 .js 檔案並執行,內容如下

/** @param {NS} ns */
export async function main(ns) {
    await ns.rainbow("<這邊寫結果取得的密碼>")
}

Exploit: you are not meant to access this

這個是要你打開 Dev Page。

但一般方式打不開,只能使用斷點大法。

原始碼可得知切換的大致邏輯。

先打開 Chrome Dev Tools

找到 Source 裡面的 main.bundle.js

展開後,搜尋關鍵字 "Soft Reset!"。找到後,往下再找一下會找到 switch 的邏輯處,在那邊下斷點。

switch (a.page) {
                case k.T3.Recovery:
// ...

之後隨意在遊戲裡切換頁面。

在斷點手動把 Scope 裡面 Local 變數 pageWithContext.page 的值改成 "Dev"

然後繼續斷點下一步,就會開啟 Dev 頁面,取得成就。

Exploit: time compression

由此可知大致邏輯。

可改電腦系統的時間來取得,但太麻煩。我是用竄改 performance.now 來取得此成就。

先打開 Chrome Dev Tools,在 Console 執行

performance.now = () => 0

執行完後靜待片刻等成就跳出即可。

Exploit: noodles

依照邏輯,沒事就去 New Tokyo 的 noodle bar 吃一下即可取得成就。

Exploit: true recursion

依照原始檔,就是在 New Tokyo 的 arcade 進入 Megabyte burner 2000 後,玩破關。

用類似

document.getElementsByTagName('iframe')[0].src = window.location.href

的方法,貌似無用。

然後破關時間也要太久,所以我後來是用斷點大法獲得成就的。

Exploit: save file

依照原始檔的說明,

應該是要在遊戲裡 OPTIONS 頁面把存檔 Export 出來之後,用 base64 解碼

base64 -d bitburnerSave_1695622315_BN12x78.json > a.json

找到存檔裡面 data.PlayerSave 中 exploits,將 EditSaveFile 加進去後,用 base64 編碼回去

base64 a.json > edited.json

最後在遊戲裡面把存檔 Import 回去。

但這樣好麻煩。所以我用斷點解決。

先打開 Chrome Dev Tools

找到 Source 裡面的 main.bundle.js

展開後,搜尋關鍵字 "You ate some delicious noodles and feel refreshed"。

找到後將斷點下在 giveExploit 那一行。

去 noodle bar 吃一下,待斷點發生之後,將 Scope 裡面 Closure 變數 Exploits 裡面有一個 object list 的 N00dles 改成 EditSaveFile

然後繼續斷點下一步,讓其判斷成功但是給的成就是另一個。

UNACHIEVABLE

依照原始碼,這東西必須要改 code。

但因為我玩的是 Steam 版本,這樣太麻煩。所以直接開大絕取得:

const doc = eval("document");
/** @param {NS} ns */
export async function main(ns) {
  doc.achievements.push("UNACHIEVABLE")
}

因為 code 並沒有更動,遊戲裡面顯示並沒有取得,但實際上 Steam 成就有獲得。

MONEY_M1B

依照原始碼,這應該是要把角色的錢弄超過溢位,然後變成負值。

TODO:

© 2019 ~ 2023Hsüan, Powered by Gatsby, Theme Material UI