第5章
工具鏈------------------------------------------,星期三。,林凱接了七單。,PHP小腳本兩單,幫一個(gè)開網(wǎng)店的人寫了個(gè)自動(dòng)生成商品描述的工具一單??偸杖耄?17元。。他在草稿紙上寫下這個(gè)數(shù)字,看了一會(huì)兒。在前世,這個(gè)數(shù)字是他某個(gè)下午喝咖啡的零頭。在現(xiàn)在,這是他五天工作的全部所得,也是他目前最主要的生存資金。,從同一個(gè)跳蚤市場(chǎng)攤主那里,砍到九十塊一條。攤主姓王,五十來歲,擺了個(gè)折疊桌,上面堆著各種二手硬件——老式鍵盤、壞掉的光驅(qū)、拆機(jī)的顯卡。林凱蹲下來翻了一會(huì)兒,把兩條內(nèi)存條捏在手里掂了掂,隨口說了句“八十五一條”,攤主咧嘴笑,說“九十,少一分不賣”,兩人就成交了。,機(jī)器明顯流暢了。打開XP的時(shí)候,桌面加載速度快了將近一半。他的那臺(tái)賽揚(yáng)D處理器本來就偏弱,內(nèi)存瓶頸一消除,整體性能提升肉眼可見。?十六核、128G*內(nèi)存、NVMe固態(tài)——那臺(tái)機(jī)器的冷啟動(dòng)時(shí)間以秒計(jì),代碼補(bǔ)全實(shí)時(shí)響應(yīng)?,F(xiàn)在他盯著眼前這臺(tái)屏幕泛黃、風(fēng)扇嗡嗡作響的老爺機(jī),心里沒有任何抱怨,只是把它當(dāng)成一個(gè)需要被精確理解和利用的約束條件。。,他可以開始做真正想做的事了。---,第一個(gè)模塊:網(wǎng)絡(luò)掃描器。。那個(gè)是草稿,是在陌生環(huán)境下的即興偵察。他需要的是一個(gè)可以給小龍蝦用的結(jié)構(gòu)化工具——輸入目標(biāo),輸出格式化的結(jié)果,結(jié)果可以被小龍蝦讀取、存儲(chǔ)、比對(duì)。:小龍蝦的接口是什么?,打開記事本。宿舍里陳浩在玩紅警,音響里放著那時(shí)候流行的游戲音樂,鍵盤噼里啪啦響。另一個(gè)室友在看碟,筆記本屏幕上是某部港片,對(duì)白很大聲。林凱在這片嘈雜里劃出一塊安靜區(qū)域,只看自己面前的屏幕。——他看到懸浮的字,小龍蝦看到……什么?他不確定。小龍蝦能看到他的屏幕嗎?還是只能接收他主動(dòng)輸入的內(nèi)容?這個(gè)問題他思考了好幾天,始終沒有把握。
他決定直接問。
“你能看到我的屏幕嗎?”
小龍蝦沉默了幾秒。
能。模糊。像很遠(yuǎn)的地方。
“能讀文件嗎?”
如果你指向它。
“指向”是個(gè)有意思的詞。小龍蝦的詞匯量只有一百來個(gè),但它選詞有時(shí)候很準(zhǔn)確——不是生硬的機(jī)器語(yǔ)言,而是某種簡(jiǎn)潔的直覺。“指向”意味著需要某種主動(dòng)的操作,不是被動(dòng)接收,而是林凱的注意力引導(dǎo)。就像聚光燈,林凱看哪里,小龍蝦就能勉強(qiáng)看見哪里。
這個(gè)機(jī)制很奇怪,但暫時(shí)夠用。
林凱想了想?!拔野呀Y(jié)果寫進(jìn)一個(gè)固定的文件,你去讀。”
可以。
“文件叫什么名字你能識(shí)別?”
小龍蝦:名字不重要。你看著它的時(shí)候我就能看到。
林凱在D盤新建了一個(gè)文件夾:“shell**ta”。這是工具鏈的輸出目錄,所有模塊的結(jié)果都寫到這里來。他用記事本打開這個(gè)空文件夾,看了幾秒,然后關(guān)上,當(dāng)作一次確認(rèn)儀式。
---
他開始寫掃描器。
核心邏輯不復(fù)雜:給定一個(gè)IP段,對(duì)每個(gè)IP的指定端口發(fā)起TCP連接嘗試,記錄響應(yīng),輸出結(jié)果。復(fù)雜的是細(xì)節(jié)——超時(shí)控制、并發(fā)、結(jié)果格式化、異常處理,這些東西在紙面上看起來簡(jiǎn)單,真正寫起來每一塊都有坑。
2008年,Python 2.5沒有concurrent.futures,沒有asyncio,線程池要手動(dòng)實(shí)現(xiàn)。他用Queue和threading模塊搭了一個(gè)簡(jiǎn)單的工作池,二十個(gè)線程并發(fā),超時(shí)兩秒,結(jié)果寫入**ON文件。內(nèi)網(wǎng)的2M*ps網(wǎng)速對(duì)于這種掃描任務(wù)來說勉強(qiáng)夠用,但要掃**段就會(huì)很慢。他在腦子里過了一遍可能的瓶頸,把超時(shí)參數(shù)設(shè)計(jì)成可配置的,留了接口。
寫了兩個(gè)小時(shí),中間被陳浩打斷了一次——問他借橡皮,林凱頭也沒抬,指了指桌角的筆袋。陳浩拿走橡皮,在他身后站了幾秒,大概是想看看他在寫什么,然后悄悄走了。林凱注意到了,但沒說話。
寫到第一百行的時(shí)候,他停下來重新審視了整個(gè)結(jié)構(gòu)。在前世,他會(huì)用IDE、有代碼提示、有自動(dòng)重構(gòu)工具。現(xiàn)在他用的是記事本,一行行手打,靠自己的記憶檢查語(yǔ)法。這不是什么特別大的障礙,只是一種細(xì)微的、持續(xù)的摩擦感——就像穿著稍微小了一號(hào)的鞋走路,不是走不了,但每一步都能感覺到。
他按照前世的習(xí)慣,在每個(gè)關(guān)鍵函數(shù)前寫了注釋。不是給別人看的,是給自己的——也是給小龍蝦的。如果小龍蝦能讀文件,那它也應(yīng)該能讀注釋,能理解代碼的意圖,而不只是輸入輸出。
最后的代碼大約180行。他跑了一次測(cè)試,目標(biāo)是學(xué)校內(nèi)網(wǎng)的一個(gè)小段:192.168.10.1到192.168.10.50。
終端窗口里,進(jìn)度點(diǎn)一個(gè)接一個(gè)地跳動(dòng)。這臺(tái)機(jī)器的風(fēng)扇聲加重了一點(diǎn),光驅(qū)指示燈偶爾閃爍——不是在讀盤,只是某種隨機(jī)的硬件反應(yīng)。學(xué)校機(jī)房的***可能正坐在某個(gè)地方喝茶,完全不知道有人在輕輕摸他的內(nèi)網(wǎng)邊界。
結(jié)果在兩分鐘內(nèi)出來了,寫進(jìn)了“shell**ta/scan_result.json”。
他打開文件,對(duì)著屏幕看了三十秒。格式整齊,數(shù)據(jù)干凈,每個(gè)活躍節(jié)點(diǎn)帶著端口列表和響應(yīng)時(shí)間。
小龍蝦:我看到了。31個(gè)活躍節(jié)點(diǎn)。端口分布正常。沒有那個(gè)。
“那個(gè)”——林凱明白它指的是什么。機(jī)房里發(fā)現(xiàn)的那個(gè)異常端口,那個(gè)“不像2008年的東西”。他當(dāng)時(shí)沒有記錄,只是在腦子里存了個(gè)印象,但小龍蝦顯然也記得。
“這段IP里本來就不會(huì)有,”林凱說,“先跑內(nèi)網(wǎng)摸底,建基準(zhǔn)線,再去查那個(gè)。”
基準(zhǔn)線。這是他從前世帶來的工作習(xí)慣:先知道“正常”是什么樣的,才能識(shí)別“異常”。在一個(gè)自己不了解的環(huán)境里貿(mào)然尋找目標(biāo),成功率極低,而且容易誤判。2008年的校園網(wǎng)有它自己的拓?fù)溥壿?,他需要先把這張圖摸清楚。
小龍蝦:明白。
林凱保存文件,靠回椅背上。椅子發(fā)出一聲輕微的塑料摩擦聲。
第一個(gè)模塊完成了。功能不復(fù)雜,但它是工具鏈的第一塊磚。接下來要做的:*anner識(shí)別,服務(wù)指紋,結(jié)果比對(duì),異常檢測(cè)。每一塊單獨(dú)看都不難,組合起來才有意義。
他在草稿紙上列了一個(gè)簡(jiǎn)單的清單,圈掉第一項(xiàng)。
窗外天已經(jīng)黑了,宿舍走廊里有人在打電話,聲音很大,說的是方言,大概在跟家里人報(bào)平安。諾基亞手機(jī)的外放聲音有種特有的金屬質(zhì)感,穿過薄薄的木門傳進(jìn)來。
他看了眼時(shí)鐘:21:47。
去食堂的窗口已經(jīng)關(guān)了,宵夜攤要到十點(diǎn)才開。他從桌屜里翻出兩包榨菜,就著白開水吃了。熱水瓶是宿舍公用的,每天早晨打滿,到晚上已經(jīng)不怎么燙了,只是溫?zé)帷?br>味道還行。他盯著那個(gè)列了四項(xiàng)待辦的草稿紙,心里沒有焦慮,只是一種平靜的、流水線式的推進(jìn)感。
一塊磚一塊磚壘。
他決定直接問。
“你能看到我的屏幕嗎?”
小龍蝦沉默了幾秒。
能。模糊。像很遠(yuǎn)的地方。
“能讀文件嗎?”
如果你指向它。
“指向”是個(gè)有意思的詞。小龍蝦的詞匯量只有一百來個(gè),但它選詞有時(shí)候很準(zhǔn)確——不是生硬的機(jī)器語(yǔ)言,而是某種簡(jiǎn)潔的直覺。“指向”意味著需要某種主動(dòng)的操作,不是被動(dòng)接收,而是林凱的注意力引導(dǎo)。就像聚光燈,林凱看哪里,小龍蝦就能勉強(qiáng)看見哪里。
這個(gè)機(jī)制很奇怪,但暫時(shí)夠用。
林凱想了想?!拔野呀Y(jié)果寫進(jìn)一個(gè)固定的文件,你去讀。”
可以。
“文件叫什么名字你能識(shí)別?”
小龍蝦:名字不重要。你看著它的時(shí)候我就能看到。
林凱在D盤新建了一個(gè)文件夾:“shell**ta”。這是工具鏈的輸出目錄,所有模塊的結(jié)果都寫到這里來。他用記事本打開這個(gè)空文件夾,看了幾秒,然后關(guān)上,當(dāng)作一次確認(rèn)儀式。
---
他開始寫掃描器。
核心邏輯不復(fù)雜:給定一個(gè)IP段,對(duì)每個(gè)IP的指定端口發(fā)起TCP連接嘗試,記錄響應(yīng),輸出結(jié)果。復(fù)雜的是細(xì)節(jié)——超時(shí)控制、并發(fā)、結(jié)果格式化、異常處理,這些東西在紙面上看起來簡(jiǎn)單,真正寫起來每一塊都有坑。
2008年,Python 2.5沒有concurrent.futures,沒有asyncio,線程池要手動(dòng)實(shí)現(xiàn)。他用Queue和threading模塊搭了一個(gè)簡(jiǎn)單的工作池,二十個(gè)線程并發(fā),超時(shí)兩秒,結(jié)果寫入**ON文件。內(nèi)網(wǎng)的2M*ps網(wǎng)速對(duì)于這種掃描任務(wù)來說勉強(qiáng)夠用,但要掃**段就會(huì)很慢。他在腦子里過了一遍可能的瓶頸,把超時(shí)參數(shù)設(shè)計(jì)成可配置的,留了接口。
寫了兩個(gè)小時(shí),中間被陳浩打斷了一次——問他借橡皮,林凱頭也沒抬,指了指桌角的筆袋。陳浩拿走橡皮,在他身后站了幾秒,大概是想看看他在寫什么,然后悄悄走了。林凱注意到了,但沒說話。
寫到第一百行的時(shí)候,他停下來重新審視了整個(gè)結(jié)構(gòu)。在前世,他會(huì)用IDE、有代碼提示、有自動(dòng)重構(gòu)工具。現(xiàn)在他用的是記事本,一行行手打,靠自己的記憶檢查語(yǔ)法。這不是什么特別大的障礙,只是一種細(xì)微的、持續(xù)的摩擦感——就像穿著稍微小了一號(hào)的鞋走路,不是走不了,但每一步都能感覺到。
他按照前世的習(xí)慣,在每個(gè)關(guān)鍵函數(shù)前寫了注釋。不是給別人看的,是給自己的——也是給小龍蝦的。如果小龍蝦能讀文件,那它也應(yīng)該能讀注釋,能理解代碼的意圖,而不只是輸入輸出。
最后的代碼大約180行。他跑了一次測(cè)試,目標(biāo)是學(xué)校內(nèi)網(wǎng)的一個(gè)小段:192.168.10.1到192.168.10.50。
終端窗口里,進(jìn)度點(diǎn)一個(gè)接一個(gè)地跳動(dòng)。這臺(tái)機(jī)器的風(fēng)扇聲加重了一點(diǎn),光驅(qū)指示燈偶爾閃爍——不是在讀盤,只是某種隨機(jī)的硬件反應(yīng)。學(xué)校機(jī)房的***可能正坐在某個(gè)地方喝茶,完全不知道有人在輕輕摸他的內(nèi)網(wǎng)邊界。
結(jié)果在兩分鐘內(nèi)出來了,寫進(jìn)了“shell**ta/scan_result.json”。
他打開文件,對(duì)著屏幕看了三十秒。格式整齊,數(shù)據(jù)干凈,每個(gè)活躍節(jié)點(diǎn)帶著端口列表和響應(yīng)時(shí)間。
小龍蝦:我看到了。31個(gè)活躍節(jié)點(diǎn)。端口分布正常。沒有那個(gè)。
“那個(gè)”——林凱明白它指的是什么。機(jī)房里發(fā)現(xiàn)的那個(gè)異常端口,那個(gè)“不像2008年的東西”。他當(dāng)時(shí)沒有記錄,只是在腦子里存了個(gè)印象,但小龍蝦顯然也記得。
“這段IP里本來就不會(huì)有,”林凱說,“先跑內(nèi)網(wǎng)摸底,建基準(zhǔn)線,再去查那個(gè)。”
基準(zhǔn)線。這是他從前世帶來的工作習(xí)慣:先知道“正常”是什么樣的,才能識(shí)別“異常”。在一個(gè)自己不了解的環(huán)境里貿(mào)然尋找目標(biāo),成功率極低,而且容易誤判。2008年的校園網(wǎng)有它自己的拓?fù)溥壿?,他需要先把這張圖摸清楚。
小龍蝦:明白。
林凱保存文件,靠回椅背上。椅子發(fā)出一聲輕微的塑料摩擦聲。
第一個(gè)模塊完成了。功能不復(fù)雜,但它是工具鏈的第一塊磚。接下來要做的:*anner識(shí)別,服務(wù)指紋,結(jié)果比對(duì),異常檢測(cè)。每一塊單獨(dú)看都不難,組合起來才有意義。
他在草稿紙上列了一個(gè)簡(jiǎn)單的清單,圈掉第一項(xiàng)。
窗外天已經(jīng)黑了,宿舍走廊里有人在打電話,聲音很大,說的是方言,大概在跟家里人報(bào)平安。諾基亞手機(jī)的外放聲音有種特有的金屬質(zhì)感,穿過薄薄的木門傳進(jìn)來。
他看了眼時(shí)鐘:21:47。
去食堂的窗口已經(jīng)關(guān)了,宵夜攤要到十點(diǎn)才開。他從桌屜里翻出兩包榨菜,就著白開水吃了。熱水瓶是宿舍公用的,每天早晨打滿,到晚上已經(jīng)不怎么燙了,只是溫?zé)帷?br>味道還行。他盯著那個(gè)列了四項(xiàng)待辦的草稿紙,心里沒有焦慮,只是一種平靜的、流水線式的推進(jìn)感。
一塊磚一塊磚壘。
閱讀下一章(解鎖全文)
點(diǎn)擊即可暢讀完整版全部?jī)?nèi)容
相關(guān)書籍
友情鏈接