Coder Battle: Mi kontraŭ Tiu VNC-ulo

В ĉi tiu blogo Sufiĉe kelkaj programrakontoj estis publikigitaj. Mi ŝatas rememori miajn malnovajn stultajn aferojn. Nu, jen alia tia rakonto.

Mi unue interesiĝis pri komputiloj, precipe pri programado, kiam mi estis ĉirkaŭ 11-jara. Komence de mezlernejo bоMi pasigis la plej grandan parton de mia libera tempo tuŝante mian C64 kaj skribante BASIC, poste eltranĉante la malbonan kodon per tondilo. Mi ne ŝercas, tondilo.

Post lernejo (ĉirkaŭ la aĝo de 16), britaj infanoj kutime iras al kolegio, kie ili elektas studi tri aŭ kvar fakojn antaŭ iri al universitato. Pro mia amo por la flavgriza skatolo kaj magnetofono hejme, mi decidis, ke studi "komputikon" en kolegio estas la ĝusta elekto.

Mi ĝuis la kurson pli ol mi atendis; tie mi unue renkontis Paskalon kaj Delfon.

Dum paŭzoj inter klasoj, studentoj povis labori per iu ajn senpaga maŝino en la komputilejo. Imagu: grandega ĉambro, desegnita por ĉirkaŭ cent homoj, kun vicoj da tabloj plenigitaj de maŝinoj, kiel tiuj kie la monitoro staras sur la sistemunuo. La adorantoj konstante zumas, musbuloj zumas sur la tabloj, ne haltante eĉ sekundon. Estas stranga odoro en la aero, kvazaŭ 50-100 hormonaj adoleskantoj periode ŝanĝiĝas por malvarmigi centojn da pecetoj Pentium III.

Malgraŭ la sanriskoj, mi ŝatis sidi ĉe la komputilo kiam mi havis liberan minuton.

La deĵoranta administranto en la ĉambro estis malalta, mezaĝa viro, kiu estis elektita por ĉi tiu rolo pro sia nesatigebla deziro fariĝi malbona diktatoro. Mi supozas. Deĵoro estas subkompreno; la ulo vere amis sian laboron. Li estis taskita konservi ordon, por ke neniu uzu la lernejan komputilon por io malkonvena.

Ĝis hodiaŭ, mia intuicio diras al mi, ke la bonuso de la administranto rekte dependis de la nombro da studentoj, kiujn li kaptis mane kaj eskortis el la komputilejo. Mi estas sufiĉe certa, ke ĉi tiu ulo frue pagis sian hipotekon.

Li sidis en la malproksima angulo de la komputilejo ĉe angula tablo. Kaj estis sekure supozi, ke liaj fekundecaj monitoroj trovis manieron reproduktiĝi kun impone mallonga gravedeca periodo, estis tiom da ili. Oni povis nur demandi, ĉu li vere havis tempon konservi trakon de ĉiuj. Kompreneble, mi ŝercas... ĉu mi menciis, ke li tre serioze prenis sian laboron?

Tiutempe, la komputila reto funkciis Vindozo 2000. Mi baldaŭ malkovris, ke ĉiufoje kiam mi ensalutis en la sistemon, skripto estis lanĉita, kiu specifis komenci la VNC-servilon de la administranta konto por fora aliro al la labortablo. Kiam ajn ĉi tiu ulo volis spioni vin, li konektis rekte al via maŝino kaj rigardis. Estis timige, kaj nun kiam mi pensas pri tio, verŝajne kontraŭleĝa.

Tranĉinte miajn dentojn sur BASIC kaj C64, mi nun skribis en C kaj eĉ iomete C++. Tiam mi ankoraŭ tre interesiĝis pri la D-lingvo, kiu korektis kelkajn mankojn de C++, kiel mi vidis ĝin tiam.

Mi kutimis iri al la komputilejo por legi ion novan sur D aŭ ludi kun la kompililo Digital Mars D. Kelkfoje, dum mi estis distrita de pensi pri la granda estonteco de D, mi skribis C-kodon por haki aliajn Win32-programojn tra ilia fenestro. teniloj.

En la bonaj tempoj de Win32-programado, trovi fenestran tenilon estis la plej facila metodo por haki aliajn programojn. Evidente, ĉiuj GUI-programoj en Vindozo havis fenestron, eĉ se ĝi ne aperis sur la ekrano. Skribante programon por preni tenilon al alia procezo (esence ligilo al ĝi), vi povus sendi mesaĝojn al ĝi. Ĉi tio permesis kelkajn bazajn operaciojn kiel kaŝi/montri programfenestron, same kiel vere bonegajn aferojn kiel devigi procezon ŝargi arbitran DLL en ĝian memorspacon kaj komenci ekzekuti kodon. Post la DLL-injekto, la amuzo komenciĝis.

En la unua monato kaj duono, ĉi tiu detektivo ne multe ĝenis min; ĝi konektiĝis al la VNC-servilo sur mia maŝino nur unu aŭ dufoje. Sed unu speciala sesio eble vekis lian intereson. Mi skribis iom da C-kodo por kaŝi Minesweeper-fenestrojn (sen fermi ilin) ​​por faciligi ludi en klaso, kiam mi rimarkis, ke la blanka VNC-ikono en la sistempleto fariĝis nigra. Ĉi tio signifis, ke li nun observis min.

Mi daŭrigis kodigi kiel kutime, provante ignori lin. Dume, la maŝino komencis malrapidiĝi, provante transdoni la maksimuman framfrekvencon al unu el la sennombraj monitoroj en la angulo de la ĉambro. Vindozo preskaŭ ĉesis respondi, kiam mia pacienco finiĝis, mi elsalutis kaj finis la tagon.

Dum postaj vizitoj al la komputilejo, Kolombo tre interesiĝis pri tio, kion mi faris preskaŭ ĉiufoje. Post ĉirkaŭ la kvara fojo, mi decidis: Mi devas fari ion pri tio.

Mi konfesas, ke racia, racia homo povus simple starigi ĉi tiun aferon rekte kun li aŭ kun sia estro. Tamen, mi ĉiam cedis al tento kaj rapide persvadis min adopti tute alian strategion.

- Vi nenion povas fari sen ĉi tiu VNC-servilo! — Mi trankvile kaj decide diris al mi plurfoje.

Necesis mortigi VNC.

Mi komencis eniri la komputilejon kun grandaj grupoj da studentoj kaj sidi kiel eble plej malproksime de la angulo kun la monitoroj. Ĉi tio funkciis dum kelka tempo kaj donis al mi iom da tempo por testi ideojn.

Mia unua provo, mi pensas, ke vi konsentos, estis sufiĉe malforta. Dekstre alklakante la VNC-ikonon en la sistempleto, mi vidis menuon kun la magiaj literoj EXIT. Bedaŭrinde, la leteroj estis skribitaj en griza skiza teksto. La administranto malŝaltis la menueron "Eliro" per la Grupo-Politiko-Redaktilo. Mi provis mortigi la procezon de la Task Manager, sed kompreneble ĝi estis nevidebla por mi ĉar ĝi funkciis sub malsama, pli privilegiita konto. Ĝi ne funkciis.

La VNC-servilo funkcias per TCP-haveno 5900, mi memoris. Mia sekva plano estis sendi koruptajn pakaĵojn al ĉi tiu haveno por kraŝi ĝin.

Mi pasigis almenaŭ kelkajn tagojn tuŝante la protokolon, sendante diversajn formojn de bone strukturitaj aĉaĵoj al haveno 5900 kaj esperante, ke ĝi rompiĝos. Fine ankaŭ tio ne funkciis.

Mi jam ekpensis, ke mi ne povos forigi ĉi tiun aferon, kiam subite ekestis al mi: tie devas esti fenestro! Ni devas montri ĝin. Eble ĝi havos belan sukan "Mute" butonon, kiun mi povas utiligi!

Mi kuris mian nun preskaŭ perfektan C-kodon por trovi la tenilon al la ĉefa fenestro de alia procezo - kaj certe, VNC estis trovita. Mi sentis min inspirita kiam miaj fingroj tajpis WM_SHOWWINDOW. Ĉu provi diveni, kion mi vidis antaŭ mi?

Nenio!

Nun mi estis scivolema... ĝi havis fenestron, sed ĝi ignoras miajn mesaĝojn. Mi duoble kontrolis mian kodon por certigi, ke ĝi funkcias. Provis ĝin sur pluraj aliaj procezoj kaj ĝi funkciis bonege. Mi provis sendi aliajn mesaĝojn al la fenestro de VNC, kaj ankoraŭ nenio.

Kaj tiam denove ekbrilis al mi!

Danke al la tre dika la libro Charles Petzold Mi zorge studis kiel Win32-procezoj funkcias ene de la sistemo. Ĉiu Win32-apliko havas fenestron kaj ankaŭ "mesaĝvicon". Mesaĝoj ekigitaj de uzantinterago, same kiel mesaĝoj senditaj de Vindozo mem, alvenas en atendovico, kaj la aplikaĵo mem decidas kiel prilabori ilin.

Ne tre interesa en si mem. Sed kiam mi rimarkis, ke sufiĉe granda neprilaborita mesaĝvico funkciis kiel heŭristiko por ke Window Process Manager intervenu en pendigita procezo, mi komencis ŝviti puran serotoninon.

Sen malŝpari sekundon, mi revenis al mia C-kodo, preparante sendi alian mesaĝon al la ĉefa fenestro de VNC WM_SHOWWINDOW. En ciklo. Eterna. Do, multaj mesaĝoj. WM_SHOWWINDOW, kiun mi nun sciis, ke VNC provos tute ignori... je sia danĝero.

Mi kompilis kaj kuris 4KB de la plej liberema kodo de mia vivo. Post ĉirkaŭ tri sekundoj, Vindozo raportis ke la procezo vncserver.ехе ne respondas, kaj faris proponon, kiun mi simple ne povis rifuzi:

Ĉu vi volas plenumi ĉi tiun procezon?

INFERO JES!

Mi konfesu, ke dum la resto de la tago mi neelteneble kontentas pri mi mem.

Post kelkaj horoj pasigitaj por digesti mian novan superpotencon, mi decidis kiel mi uzos ĝin. Estis tro facile nur mortigi la sesion ĝuste antaŭ li. Mi havis pli bonan ideon — tute malaperi.

post bapto de fajro kun ingo-programado Mi rimarkis, ke mi povus skribi kodon, kiu farus du aferojn. Ĝi unue okupos la lastatempe liberigitan TCP-havenon 5900, antaŭe okupitan de la senscia VNC-servila procezo. Tiam ĝi kreos novan TCP-konekton al la VNC-servilo de la specifita maŝino. La kodo simple prokuros ĉiujn datumojn inter la du ingoj, kaj Columbo pensos, ke li konektas al mi, kiam fakte li konektos al tute alia VNC-servilo.

Mia kodo funkcios kiel sekreta ponto inter mi kaj iu alia kompatinda animo de mia elekto. Estis mirinda.

Mi tuj komencis verki mian falsan VNC-ponton. Kolombo plurfoje konektiĝis al mi, sed mi daŭre programis antaŭ li. Mi alvenis al la konkludo, ke li tute ne sciis, kion mi faras, kvankam mi skribis evidentajn aferojn kiel havennumerojn kaj komentojn kiel // Прощай, жуткий шпион VNC.

Post kelkaj tagoj mi ne povis korekte funkcii la kodon. Por plimalbonigi la aferojn, mi preskaŭ senĉese laboris kun la nigra VNC-ikono en la sistempleto. Dum ĝi estis konektita, mi ne povis liberigi la havenon por testi mian kodon.

Se mi scius tiam netcat!

Fine miaj nervoj cedis; finfine mi estis senpacienca 17-jara ulo. Rigardante la blankan VNC-servilan ikonon denove nigraj, mi timiĝis, malfermis la originalan kodon, kiu loĝis la mesaĝvicon, kaj kuris ĝin antaŭ liaj okuloj. Mi eĉ atendis kelkajn sekundojn antaŭ klaki End Process, nur por certigi, ke li vidis ĝin.

Se premado de tiu butono ne plene konvinkis min, ke ĝi indas, tiam li saltis de malantaŭ sia fortikaĵo de monitoroj por rapide alproksimiĝi al mi kaj elkonduki min el la ĉambro certe.

Kiel rezulto, mi estis malpermesita de la reto dum du semajnoj. Justa puno, mi pensis. Post ĉirkaŭ tri semajnoj, la VNC-servilo malaperis de lanĉaj skriptoj kaj neniam aperis ie ajn. Mi neniam sciis ĉu mia okazaĵo ludis ian rolon en ĉi tio aŭ ne, sed ĝi tute ruinigis mian planon fabele riĉiĝi vendante mian VNC-pafilon al deprimitaj studentoj en universitataj komputilhaloj tra la lando.

fonto: www.habr.com

Aldoni komenton