程式設計師之戰:我 vs. 那個 VNC 傢伙

В 這個部落格 已經出版了相當多的程式設計師故事。 我喜歡回憶過去的愚蠢事。 嗯,這是另一個這樣的故事。

當我大約 11 歲的時候,我第一次對計算機,尤其是程式設計產生了興趣。 高中剛開始時bо我大部分的空閒時間都花在修補我的 C64 和寫 BASIC 上,然後用剪刀剪掉壞程式碼。 我沒開玩笑,剪刀.

放學後(16歲左右),英國孩子通常會去大學,他們選擇在上大學之前學習三到四門科目。 鑑於我對家裡米色盒子和錄音機的熱愛,我決定在大學學習「電腦科學」是正確的選擇。

我比我預想的更喜歡這門課; 在那裡我第一次見到了 Pascal 和 Delphi。

課間休息時,學生可以在機房任何免費的機器上工作。 想像一下:一個巨大的房間,為大約一百人設計,一排排桌子上擺滿了機器,就像系統單元上的顯示器一樣。 球迷的嗡嗡聲不斷,老鼠球在桌上嗡嗡作響,一刻不停。 空氣中瀰漫著一股奇怪的氣味,彷彿有50-100名荷爾蒙少年在週期性地變換著冷卻數百顆奔騰III晶片的速度。

儘管有健康風險,但當我有空閒的時候,我還是喜歡坐在電腦前。

房間裡的值班管理員是一位身材矮小的中年男子,他被選為這個角色是因為他對成為邪惡獨裁者的貪婪的慾望。 我想是這樣。 值班是個輕描淡寫的說法;這個人真的很熱愛他的工作。 他的任務是維持秩序,確保沒有人使用學校電腦進行任何不當行為。

直到今天,我的直覺告訴我,管理員的獎金直接取決於他抓起並護送出機房的學生數量。 我很確定這傢伙很早就還清了房貸。

他坐在電腦室最遠角落的一張角桌旁。 可以肯定的是,他的生育監測儀已經找到了一種在極短的妊娠期內進行繁殖的方法,因為監測儀的數量實在是太多了。 人們只能懷疑他是否真的有時間去追蹤他們所有人。 當然,我是在開玩笑……我有沒有提到他非常認真地對待他的工作?

當時電腦網路運行的是Windows 2000。我很快就發現每次登入系統時都會啟動一個腳本,指定從管理員帳戶啟動VNC伺服器以遠端存取桌面。 每當這個人想要監視你時,他就會直接連接到你的機器並觀看。 這太令人毛骨悚然了,現在我想起來,可能是非法的。

在學習了 BASIC 和 C64 後,我現在用 C 甚至一點 C++ 寫。 當時我對D語言還是很有興趣的,它修正了我當時看到的C++的一些缺點。

我以前經常去機房讀一些有關 D 的新東西或玩一下 Digital Mars D 編譯器。有時,當我分心思考 D 的偉大未來時,我會編寫 C 程式碼透過其他 Win32 程式的視窗進行攻擊手柄。

在 Win32 程式設計的美好時光中,找到視窗句柄是破解其他程式最簡單的方法。 顯然,Windows 上的所有 GUI 程式都有一個窗口,即使它沒有出現在螢幕上。 透過編寫一個程式來檢索另一個進程的句柄(本質上是指向它的連結),您可以向它發送訊息。 這允許執行一些基本操作,例如隱藏/顯示程式窗口,以及非常酷的操作,例如強制進程將任意 DLL 載入到其記憶體空間並開始執行程式碼。 DLL注入之後,好戲就開始了。

在最初的一個半月裡,這個偵探並沒有給我帶來太大的困擾;它只連接到我機器上的 VNC 伺服器一兩次。 但一次特定的會議可能激起了他的興趣。 我正在編寫一些 C 程式碼來隱藏掃雷視窗(而不關閉它們),以便在課堂上更輕鬆地玩,這時我注意到系統托盤中的白色 VNC 圖示變成了黑色。 這意味著他現在正在看著我。

我像往常一樣繼續編碼,試圖忽略他。 同時,機器開始放慢速度,試圖將最大幀速率傳輸到房間角落的無數顯示器之一。 Windows 幾乎停止回應,當我的耐心耗盡時,我登出並完成了這一天的工作。

在隨後參觀機房時,科倫坡幾乎每次都對我所做的事情產生了濃厚的興趣。 大約第四次之後,我決定:我需要做些什麼。

我承認,一個通情達理、理性的人完全可以直接向他或他的老闆提出這個問題。 然而,我總是屈服於誘惑,並很快說服自己採取完全不同的策略。

- 沒有這個 VNC 伺服器,你什麼都做不了! ——我冷靜而果斷地告訴自己好幾次。

有必要殺死VNC。

我開始和一大群學生一起走進電腦房,坐在離顯示器角落盡可能遠的地方。 這工作了一段時間,給了我一些時間來測試想法。

我想你會同意,我的第一次嘗試非常薄弱。 右鍵單擊系統托盤中的 VNC 圖標,我看到一個帶有魔術字母 EXIT 的選單。 不幸的是,這些信是用灰色輪廓文字寫的。 管理員已透過群組原則編輯器停用了「退出」功能表項目。 我試圖從任務管理器中終止該進程,但當然它對我來說是不可見的,因為它正在另一個不同的、特權更高的帳戶下運行。 但沒有成功。

我記得,VNC 伺服器運行在 TCP 連接埠 5900 上。 我的下一個計劃是將損壞的資料包發送到該連接埠以使其崩潰。

我至少花了幾天時間修改協議,向連接埠 5900 發送各種形式的結構良好的垃圾,並希望它會崩潰。 最終,這也沒有成功。

我已經開始覺得我無法擺脫這個東西了,這時我突然意識到:那裡一定有一扇窗! 我們需要顯示它。 也許它會有一個漂亮多汁的“靜音”按鈕,我可以充分利用它!

我運行了現在近乎完美的 C 代碼來查找另一個進程的主視窗的句柄 - 果然,VNC 找到了。 當我的手指打字時我感到受到啟發 WM_SHOWWINDOW。 試著猜猜我在我面前看到了什麼?

沒有什麼!

現在我很好奇......它有一個窗口,但它忽略了我的消息。 我仔細檢查了我的程式碼以確保它有效。 在其他幾個流程上進行了測試,效果很好。 我嘗試向 VNC 視窗發送其他訊息,但仍然沒有任何結果。

然後我又恍然大悟了!

感謝非常厚的 這本書 Charles Petzold 我仔細研究了 Win32 進程在系統內部是如何運作的。 每個 Win32 應用程式都有一個視窗和一個「訊息佇列」。 由使用者互動觸發的訊息以及Windows本身發送的訊息到達佇列,由應用程式本身決定如何處理它們。

本身並不是很有趣。 但是,當我意識到足夠大的未處理訊息佇列可以作為視窗進程管理器幹預掛起進程的啟發時,我開始擔心純粹的血清素。

我沒有浪費一秒鐘時間,回到我的 C 代碼,準備向 VNC 主視窗發送另一個訊息 WM_SHOWWINDOW。 在一個循環中。 永恆。 所以,很多消息。 WM_SHOWWINDOW,我現在知道 VNC 會試圖完全忽略它......這是危險的。

我編譯並運行了我一生中最熱愛自由的 4KB 程式碼。 大約三秒鐘後,Windows 會回報該進程 vncserver.ехе 沒有回答,並提出了一個我根本無法拒絕的提議:

您想完成這個過程嗎?

當然好!

讓我承認,在這一天剩下的時間裡,我對自己感到非常滿意。

在花了幾個小時消化我的新超能力後,我決定如何使用它。 直接結束他面前的會議太容易了。 我有一個更好的主意——徹底消失。

套接字編程的火的洗禮 我意識到我可以編寫可以完成兩件事的程式碼。 它會先佔用新釋放的 TCP 連接埠 5900,該連接埠先前被毫無頭緒的 VNC 伺服器程序佔用。 然後它將建立一個到指定機器的 VNC 伺服器的新 TCP 連線。 該程式碼將簡單地代理兩個套接字之間的所有數據,Columbo 會認為他正在連接到我,而實際上他將連接到完全不同的 VNC 伺服器。

我的程式碼將充當我和我選擇的其他可憐靈魂之間的秘密橋樑。 這太棒了。

我立即開始寫我的假 VNC 橋。 Columbo 多次聯繫我,但我繼續在他面前編程。 我得出的結論是,儘管我寫了諸如端口號和註釋之類的明顯內容,但他不知道我在做什麼 // Прощай, жуткий шпион VNC.

幾天后,我無法讓程式碼正常工作。 更糟的是,我幾乎一直在使用系統托盤中的黑色 VNC 圖示。 連接後,我無法釋放連接埠來測試我的程式碼。

如果我當時就知道的話 netcat!

最終,我的緊張情緒屈服了;畢竟我是一個沒有耐心的17歲男孩。 看著白色的VNC伺服器圖示再次變黑,我嚇壞了,打開填充訊息佇列的原始程式碼,並在他眼前運行它。 我甚至等了幾秒鐘才點擊 End Process,只是為了確保他看到了。

如果按下那個按鈕並不能完全讓我相信這是值得的,那麼他從他的顯示器堡壘後面跳出來,迅速接近我並把我帶出房間肯定是值得的。

結果,我被禁止上網兩週。 我想這是一個公平的懲罰。 大約三週後,VNC 伺服器從啟動腳本中消失,並且從未出現在其他任何地方。 我從來不知道我的事件是否在其中發揮了任何作用,但這完全破壞了我通過向全國大學計算機大廳裡抑鬱的學生出售我的 VNC 槍來致富的計劃。

來源: www.habr.com

添加評論