Coder Battle: Me vs. That VNC Guy

Π’ ang blog na ito Napakaraming mga kuwento ng programmer ang nai-publish. Gusto kong gunitain ang mga dati kong katangahan. Well, narito ang isa pang ganoong kuwento.

Una akong naging interesado sa kompyuter, lalo na sa programming, noong mga 11 taong gulang ako. Sa simula ng hayskul bΠΎGinugol ko ang karamihan sa aking libreng oras sa pag-iisip sa aking C64 at pagsulat ng BASIC, pagkatapos ay pinutol ang masamang code gamit ang gunting. Hindi ako nagbibiro, gunting.

Pagkatapos ng paaralan (sa paligid ng edad na 16), ang mga batang British ay karaniwang pumapasok sa kolehiyo, kung saan pinipili nilang mag-aral ng tatlo o apat na paksa bago pumunta sa unibersidad. Dahil sa pagmamahal ko sa beige box at tape recorder sa bahay, napagpasyahan ko na ang pag-aaral ng β€œcomputer science” sa kolehiyo ang tamang pagpipilian.

Mas nasiyahan ako sa kurso kaysa sa inaasahan ko; doon ko unang nakilala sina Pascal at Delphi.

Sa mga pahinga sa pagitan ng mga klase, maaaring magtrabaho ang mga mag-aaral sa anumang libreng makina sa silid ng kompyuter. Isipin: isang malaking silid, na idinisenyo para sa halos isang daang tao, na may mga hanay ng mga mesa na puno ng mga makina, tulad ng kung saan ang monitor ay nakatayo sa unit ng system. Ang mga tagahanga ay patuloy na humuhuni, ang mga bola ng mouse ay umuugong sa mga mesa, hindi tumitigil kahit isang segundo. May kakaibang amoy sa hangin, na parang 50-100 hormonal teenagers ang pana-panahong nagbabago sa paglamig ng daan-daang Pentium III chips.

Sa kabila ng mga panganib sa kalusugan, gusto kong umupo sa computer kapag mayroon akong libreng minuto.

Ang admin na naka-duty sa silid ay isang maikli at nasa katanghaliang-gulang na lalaki na napili para sa tungkuling ito dahil sa kanyang walang sawang pagnanais na maging isang masamang diktador. Siguro nga. On duty ay isang maliit na pahayag; ang lalaki ay talagang mahal ang kanyang trabaho. Siya ay inatasan sa pagpapanatili ng kaayusan upang walang gumagamit ng computer ng paaralan para sa anumang bagay na hindi nararapat.

Hanggang ngayon, sinasabi sa akin ng aking intuwisyon na ang bonus ng admin ay direktang nakadepende sa bilang ng mga estudyanteng nahawakan niya ng kamay at inihatid palabas ng computer room. Sigurado akong maagang binayaran ng lalaking ito ang kanyang sangla.

Umupo siya sa dulong sulok ng computer room sa isang sulok na mesa. At ligtas na ipagpalagay na ang kanyang mga fertility monitor ay nakahanap ng paraan upang magparami sa isang kahanga-hangang maikling panahon ng pagbubuntis, napakarami sa kanila. Ang isa ay maaari lamang magtaka kung mayroon ba talaga siyang oras upang subaybayan silang lahat. Syempre, biro ko... nasabi ko na bang sineseryoso niya ang trabaho niya?

Sa oras na iyon, ang network ng computer ay nagpapatakbo ng Windows 2000. Sa lalong madaling panahon natuklasan ko na sa bawat oras na mag-log in ako sa system, isang script ang inilunsad na tinukoy na simulan ang VNC server mula sa administrator account para sa malayuang pag-access sa desktop. Sa tuwing gustong tiktikan ka ng taong ito, direktang kumokonekta siya sa iyong makina at manonood. Ito ay katakut-takot, at ngayon na iniisip ko ito, malamang na ilegal.

Ang pagkakaroon ng pagputol ng aking mga ngipin sa BASIC at C64, nagsulat ako ngayon sa C at kahit isang maliit na C++. Sa oras na iyon, interesado pa rin ako sa wikang D, na nagtama ng ilan sa mga pagkukulang ng C++, tulad ng nakita ko noon.

Dati akong pumupunta sa computer room para magbasa ng bago sa D o makipaglaro sa Digital Mars D compiler. Minsan, habang naaabala ako sa pag-iisip tungkol sa magandang kinabukasan ng D, nagsulat ako ng C code para i-hack ang iba pang mga programa ng Win32 sa kanilang window humahawak.

Sa magandang lumang mga araw ng Win32 programming, paghahanap ng isang window handle ay ang pinakamadaling paraan upang i-hack ang iba pang mga programa. Malinaw, lahat ng GUI program sa Windows ay may window, kahit na hindi ito lumabas sa screen. Sa pamamagitan ng pagsusulat ng isang programa upang kunin ang isang hawakan sa isa pang proseso (karaniwang isang link dito), maaari kang magpadala ng mga mensahe dito. Pinapayagan nito ang ilang mga pangunahing operasyon tulad ng pagtatago/pagpapakita ng window ng programa, pati na rin ang mga talagang cool na bagay tulad ng pagpilit sa isang proseso na mag-load ng isang di-makatwirang DLL sa memory space nito at magsimulang mag-execute ng code. Pagkatapos ng DLL injection, nagsimula ang saya.

Sa unang buwan at kalahati, ang tiktik na ito ay hindi gaanong nag-abala sa akin; nakakonekta ito sa VNC server sa aking makina nang isang beses o dalawang beses. Ngunit ang isang partikular na sesyon ay maaaring nakapukaw ng kanyang interes. Nagsusulat ako ng ilang C code para itago ang mga bintana ng Minesweeper (nang hindi isinasara ang mga ito) para mas madaling maglaro sa klase, nang mapansin kong naging itim ang puting VNC icon sa system tray. Ibig sabihin nun ay nakatingin na siya sa akin.

Ipinagpatuloy ko ang pag-coding gaya ng dati, sinusubukan kong hindi siya pansinin. Samantala, nagsimulang bumagal ang makina, sinusubukang ipadala ang maximum na frame rate sa isa sa hindi mabilang na mga monitor sa sulok ng silid. Halos hindi na tumugon ang Windows, nang maubos ang pasensya ko, nag-log out ako at natapos para sa araw na iyon.

Sa kasunod na mga pagbisita sa silid ng kompyuter, nagkaroon ng matinding interes si Colombo sa ginagawa ko halos sa lahat ng pagkakataon. Matapos ang tungkol sa ikaapat na pagkakataon, nagpasya ako: Kailangan kong gumawa ng isang bagay tungkol dito.

Inaamin ko na ang isang makatwiran, makatuwirang tao ay maaaring direktang iharap ang isyung ito sa kanya o sa kanyang amo. Gayunpaman, palagi akong sumusuko sa tukso at mabilis na kinausap ang aking sarili sa paggamit ng isang ganap na kakaibang diskarte.

- Wala kang magagawa kung wala itong VNC server! β€” mahinahon at desididong sinabi ko sa sarili ko ng ilang beses.

Kailangang patayin ang VNC.

Nagsimula akong pumasok sa computer room kasama ang malalaking grupo ng mga estudyante at nakaupo sa malayo sa sulok na may mga monitor hangga't maaari. Ito ay nagtrabaho nang ilang sandali at nagbigay sa akin ng ilang oras upang subukan ang mga ideya.

Ang aking unang pagtatangka, sa palagay ko ay sasang-ayon ka, ay medyo mahina. Pag-right-click sa icon ng VNC sa system tray, nakita ko ang isang menu na may mga magic na titik na EXIT. Sa kasamaang palad, ang mga titik ay nakasulat sa gray na outline na teksto. Hindi pinagana ng administrator ang item ng menu na "Lumabas" sa pamamagitan ng Group Policy Editor. Sinubukan kong patayin ang proseso mula sa Task Manager, ngunit siyempre hindi ito nakikita sa akin dahil tumatakbo ito sa ilalim ng ibang, mas privileged na account. Hindi natuloy.

Ang VNC server ay tumatakbo sa TCP port 5900, naalala ko. Ang susunod kong plano ay magpadala ng mga sirang packet sa port na ito para ma-crash ito.

Gumugol ako ng hindi bababa sa ilang araw sa pag-iisip sa protocol, pagpapadala ng iba't ibang anyo ng mahusay na istrukturang dumi sa port 5900 at umaasa na masisira ito. Sa huli, hindi rin iyon gumana.

Nagsisimula na akong mag-isip na hindi ko maaalis ang bagay na ito, nang bigla itong bumungad sa akin: dapat may bintana doon! Kailangan nating ipakita ito. Baka magkakaroon ito ng magandang makatas na "Mute" na button na magagamit ko nang husto!

Pinatakbo ko ang aking halos perpektong C code na ngayon upang mahanap ang hawakan sa pangunahing window ng isa pang proseso - at sigurado, natagpuan ang VNC. Na-inspire ako nang mag-type ang mga daliri ko WM_SHOWWINDOW. Subukan mong hulaan kung ano ang nakita ko sa harap ko?

Wala!

Ngayon ay na-curious ako... may bintana ito, ngunit hindi nito pinapansin ang aking mga mensahe. I-double check ko ang aking code upang matiyak na gumagana ito. Sinubukan ito sa maraming iba pang mga proseso at mahusay itong gumana. Sinubukan kong magpadala ng iba pang mga mensahe sa VNC window, at wala pa rin.

At pagkatapos ay bumungad sa akin muli!

Salamat sa sobrang kapal ang libro Charles Petzold Maingat kong pinag-aralan kung paano gumagana ang mga proseso ng Win32 sa loob ng system. Ang bawat Win32 application ay may window pati na rin ang "message queue". Ang mga mensaheng na-trigger ng pakikipag-ugnayan ng user, pati na rin ang mga mensaheng ipinadala mismo ng Windows, ay dumarating sa isang queue, at ang application mismo ang magpapasya kung paano iproseso ang mga ito.

Hindi masyadong interesante sa sarili. Ngunit nang mapagtanto ko na ang isang malaking sapat na hindi naprosesong pila ng mensahe ay kumilos bilang isang heuristic para sa Window Process Manager upang mamagitan sa isang hung process, nagsimula akong pawisan ng purong serotonin.

Nang walang pag-aaksaya ng isang segundo, bumalik ako sa aking C code, naghahanda na magpadala ng isa pang mensahe sa pangunahing window ng VNC WM_SHOWWINDOW. Sa isang cycle. Walang hanggan. Kaya, maraming mga mensahe. WM_SHOWWINDOW, na alam ko na ngayon na susubukang balewalain ng VNC... sa panganib nito.

Nag-compile at nagpatakbo ako ng 4KB ng pinaka-mapagmahal sa kalayaan na code ng aking buhay. Pagkatapos ng halos tatlong segundo, iniulat ng Windows na ang proseso vncserver.Π΅Ρ…Π΅ ay hindi sumagot, at nag-alok na hindi ko lang matanggihan:

Gusto mo bang kumpletuhin ang prosesong ito?

IMPYERNO OO!

Aminin ko na sa nalalabing bahagi ng araw ay hindi ko mabata ang kasiyahan sa aking sarili.

Pagkatapos ng ilang oras na ginugol sa pagtunaw ng aking bagong superpower, nagpasya ako kung paano ko ito gagamitin. Napakadaling patayin na lang ang session sa harap niya. Mayroon akong isang mas mahusay na ideya - upang mawala nang tuluyan.

Pagkatapos binyag ng apoy na may socket programming Napagtanto ko na maaari akong magsulat ng code na gagawa ng dalawang bagay. Sasakupin muna nito ang bagong napalaya na TCP port 5900, na dating inookupahan ng walang kaalam-alam na proseso ng server ng VNC. Pagkatapos ay lilikha ito ng bagong koneksyon sa TCP sa VNC server ng tinukoy na makina. I-proxy lang ng code ang lahat ng data sa pagitan ng dalawang socket, at iisipin ni Columbo na kumokonekta siya sa akin, kapag sa katunayan ay kumokonekta siya sa isang ganap na magkaibang VNC server.

Ang aking code ay magsisilbing isang lihim na tulay sa pagitan ko at ng iba pang mahihirap na kaluluwa na aking pinili. Ito ay kahanga-hanga.

Agad kong sinimulan ang pagsulat ng aking pekeng VNC bridge. Ilang beses kumonekta sa akin si Columbo, ngunit nagpatuloy ako sa pagprograma sa harap niya. Dumating ako sa konklusyon na wala siyang ideya kung ano ang ginagawa ko, kahit na nagsulat ako ng mga halatang bagay tulad ng mga numero ng port at mga komento tulad ng // ΠŸΡ€ΠΎΡ‰Π°ΠΉ, ΠΆΡƒΡ‚ΠΊΠΈΠΉ шпион VNC.

Pagkalipas ng ilang araw hindi ko magawang gumana nang tama ang code. Ang masaklap pa, halos tuluy-tuloy akong nagtatrabaho gamit ang itim na VNC icon sa system tray. Habang nakakonekta ito, hindi ko mailabas ang port para subukan ang aking code.

Kung alam ko noon netcat!

Sa huli, ang aking mga ugat ay bumigay; pagkatapos ng lahat, ako ay isang naiinip na 17-taong-gulang na lalaki. Nang mapanood ko ang puting VNC server icon na naging itim muli, nabigla ako, binuksan ang orihinal na code na pumupuno sa pila ng mensahe, at pinatakbo ito sa harap ng kanyang mga mata. Naghintay pa ako ng ilang segundo bago nag-click End Process, para lang makasigurado na nakita niya ito.

Kung ang pagpindot sa pindutan na iyon ay hindi lubos na makumbinsi sa akin na ito ay katumbas ng halaga, pagkatapos ay tumalon siya mula sa likod ng kanyang kuta ng mga monitor upang mabilis na lapitan ako at ihatid ako palabas ng silid.

Dahil dito, na-ban ako sa network sa loob ng dalawang linggo. Isang patas na parusa, naisip ko. Pagkalipas ng humigit-kumulang tatlong linggo, nawala ang VNC server mula sa mga script ng boot at hindi na lumitaw kahit saan pa. Hindi ko alam kung ang aking insidente ay nagkaroon ng anumang papel dito o hindi, ngunit ganap nitong sinira ang aking plano na yumaman nang husto sa pamamagitan ng pagbebenta ng aking VNC na baril sa mga nalulumbay na estudyante sa mga bulwagan ng kompyuter sa kolehiyo sa buong bansa.

Pinagmulan: www.habr.com

Magdagdag ng komento