Trận chiến Coder: Tôi vs Anh chàng VNC đó

В blog này Khá nhiều câu chuyện về lập trình viên đã được xuất bản. Tôi thích hồi tưởng lại những điều ngu ngốc ngày xưa của mình. Vâng, đây là một câu chuyện khác như vậy.

Lần đầu tiên tôi bắt đầu quan tâm đến máy tính, đặc biệt là lập trình, khi tôi khoảng 11 tuổi. Lúc bắt đầu học trung học bоTôi dành phần lớn thời gian rảnh rỗi để mày mò với chiếc C64 của mình và viết BASIC, sau đó dùng kéo cắt bỏ những đoạn mã xấu. Tôi không đùa đâu, cây kéo.

Sau giờ học (khoảng 16 tuổi), trẻ em Anh thường vào đại học, nơi chúng chọn học ba hoặc bốn môn trước khi vào đại học. Với tình yêu với chiếc hộp màu be và chiếc máy ghi âm ở nhà, tôi quyết định học “khoa học máy tính” ở trường đại học là lựa chọn đúng đắn.

Tôi thích khóa học hơn tôi mong đợi; ở đó lần đầu tiên tôi gặp Pascal và Delphi.

Trong thời gian nghỉ giữa các lớp, học sinh có thể làm việc trên bất kỳ máy nào miễn phí trong phòng máy tính. Hãy tưởng tượng: một căn phòng lớn, được thiết kế cho khoảng một trăm người, với các dãy bàn chứa đầy máy móc, giống như những bàn đặt màn hình trên thiết bị hệ thống. Các cổ động viên không ngừng vo ve, bóng chuột vo ve trên các bàn không ngừng nghỉ một giây. Có một mùi lạ trong không khí, như thể 50-100 thanh thiếu niên nội tiết tố đang định kỳ thay thế để làm mát hàng trăm con chip Pentium III.

Bất chấp những rủi ro về sức khỏe, tôi thích ngồi trước máy tính khi có phút rảnh rỗi.

Người quản lý trực trong phòng là một người đàn ông trung niên thấp bé được chọn vào vai trò này vì mong muốn vô độ trở thành một nhà độc tài độc ác. Tôi cho là vậy. Đang làm nhiệm vụ là một cách nói nhẹ nhàng; anh chàng thực sự yêu thích công việc của mình. Anh được giao nhiệm vụ giữ trật tự để không ai sử dụng máy tính của trường vào những việc không phù hợp.

Cho đến hôm nay, trực giác mách bảo tôi rằng tiền thưởng của quản trị viên trực tiếp phụ thuộc vào số lượng học sinh mà anh ta đã tận tay bắt và hộ tống ra khỏi phòng máy tính. Tôi khá chắc chắn rằng anh chàng này đã trả hết tiền thế chấp sớm.

Anh ta ngồi ở góc xa của phòng máy tính, ở một chiếc bàn trong góc. Và thật an toàn khi cho rằng máy theo dõi khả năng sinh sản của anh ấy đã tìm ra cách sinh sản với thời gian mang thai ngắn đến mức ấn tượng, có rất nhiều người trong số họ. Người ta chỉ có thể tự hỏi liệu anh ta có thực sự có thời gian để theo dõi tất cả hay không. Tất nhiên, tôi chỉ đùa thôi... tôi đã đề cập đến việc anh ấy rất coi trọng công việc của mình chưa?

Vào thời điểm đó, mạng máy tính đang chạy Windows 2000. Tôi nhanh chóng phát hiện ra rằng mỗi lần tôi đăng nhập vào hệ thống, một tập lệnh được khởi chạy chỉ định khởi động máy chủ VNC từ tài khoản quản trị viên để truy cập từ xa vào máy tính để bàn. Bất cứ khi nào anh chàng này muốn theo dõi bạn, anh ta sẽ kết nối trực tiếp với máy của bạn và theo dõi. Điều đó thật rùng rợn, và bây giờ tôi nghĩ lại, có lẽ là bất hợp pháp.

Sau khi bắt đầu học BASIC và C64, giờ đây tôi đã viết bằng C và thậm chí một chút C++. Lúc đó tôi vẫn còn rất hứng thú với ngôn ngữ D, ngôn ngữ này đã sửa chữa một số khuyết điểm của C++ như tôi đã thấy lúc đó.

Tôi thường vào phòng máy tính để đọc một cái gì đó mới về D hoặc chơi với trình biên dịch Digital Mars D. Đôi khi, trong khi đang bị phân tâm khi nghĩ về tương lai tươi sáng của D, tôi đã viết mã C để hack các chương trình Win32 khác thông qua cửa sổ của chúng tay cầm.

Vào thời xa xưa của lập trình Win32, tìm tay cầm cửa sổ là phương pháp dễ nhất để hack các chương trình khác. Rõ ràng, tất cả các chương trình GUI trên Windows đều có một cửa sổ, ngay cả khi nó không xuất hiện trên màn hình. Bằng cách viết một chương trình để truy xuất một điều khiển đến một quy trình khác (về cơ bản là một liên kết đến nó), bạn có thể gửi tin nhắn đến nó. Điều này cho phép thực hiện một số thao tác cơ bản như ẩn/hiển thị cửa sổ chương trình, cũng như những điều thực sự thú vị như buộc một quá trình tải một DLL tùy ý vào không gian bộ nhớ của nó và bắt đầu thực thi mã. Sau khi tiêm DLL, cuộc vui bắt đầu.

Trong tháng rưỡi đầu tiên, thám tử này không làm phiền tôi nhiều, nó chỉ kết nối với máy chủ VNC trên máy của tôi một hoặc hai lần. Nhưng một buổi học cụ thể có lẽ đã khơi dậy sự quan tâm của anh ấy. Tôi đang viết một số mã C để ẩn các cửa sổ Minesweeper (không đóng chúng) để dễ chơi hơn trong lớp thì tôi nhận thấy biểu tượng VNC màu trắng trên khay hệ thống đã chuyển sang màu đen. Điều này có nghĩa là bây giờ anh ấy đang theo dõi tôi.

Tôi tiếp tục viết mã như thường lệ, cố gắng phớt lờ anh ấy. Trong khi đó, cỗ máy bắt đầu chậm lại, cố gắng truyền tốc độ khung hình tối đa tới một trong vô số màn hình ở góc phòng. Windows gần như ngừng phản hồi, khi hết kiên nhẫn, tôi đăng xuất và kết thúc một ngày.

Trong những lần ghé thăm phòng máy tính sau đó, Colombo hầu như luôn quan tâm sâu sắc đến những gì tôi đang làm. Sau khoảng lần thứ tư, tôi quyết định: Tôi cần phải làm gì đó để giải quyết vấn đề này.

Tôi thừa nhận rằng một người hợp lý, có lý trí có thể đơn giản nêu vấn đề này trực tiếp với anh ta hoặc sếp của anh ta. Tuy nhiên, tôi luôn bị cám dỗ và nhanh chóng thuyết phục bản thân áp dụng một chiến lược hoàn toàn khác.

- Bạn không thể làm gì nếu không có máy chủ VNC này! – Tôi đã bình tĩnh và dứt khoát tự nhủ nhiều lần.

Cần phải tiêu diệt VNC.

Tôi bắt đầu đi vào phòng máy tính với nhiều nhóm học sinh và ngồi càng xa góc có màn hình càng tốt. Điều này hiệu quả được một thời gian và cho tôi chút thời gian để thử nghiệm các ý tưởng.

Nỗ lực đầu tiên của tôi, tôi nghĩ bạn sẽ đồng ý, khá yếu. Nhấp chuột phải vào biểu tượng VNC trên khay hệ thống, tôi thấy một menu có các chữ cái thần kỳ EXIT. Thật không may, những bức thư được viết bằng nét chữ màu xám. Quản trị viên đã tắt mục menu "Thoát" thông qua Trình chỉnh sửa chính sách nhóm. Tôi đã cố gắng tắt tiến trình này khỏi Trình quản lý tác vụ, nhưng tất nhiên nó vô hình đối với tôi vì nó đang chạy dưới một tài khoản khác, có đặc quyền hơn. Nó không thành công.

Tôi nhớ là máy chủ VNC chạy trên cổng TCP 5900. Kế hoạch tiếp theo của tôi là gửi các gói bị hỏng tới cổng này để làm hỏng nó.

Tôi đã dành ít nhất vài ngày để mày mò giao thức, gửi nhiều dạng rác có cấu trúc tốt khác nhau tới cổng 5900 và hy vọng nó sẽ bị hỏng. Cuối cùng, điều đó cũng không hiệu quả.

Tôi đã bắt đầu nghĩ rằng mình sẽ không thể bỏ được thứ này thì đột nhiên tôi chợt nhận ra: chắc chắn phải có một cửa sổ ở đó! Chúng ta cần hiển thị nó. Có lẽ nó sẽ có một nút “Tắt tiếng” thú vị mà tôi có thể sử dụng hiệu quả!

Tôi đã chạy mã C gần như hoàn hảo của mình để tìm phần điều khiển của cửa sổ chính của một quy trình khác - và chắc chắn rằng VNC đã được tìm thấy. Tôi cảm thấy tràn đầy cảm hứng khi gõ ngón tay WM_SHOWWINDOW. Hãy thử đoán xem tôi đã nhìn thấy gì trước mặt?

Không có gì!

Bây giờ tôi tò mò... nó có một cửa sổ, nhưng nó lại phớt lờ tin nhắn của tôi. Tôi đã kiểm tra kỹ mã của mình để đảm bảo nó hoạt động. Đã thử nghiệm nó trên một số quy trình khác và nó hoạt động rất tốt. Tôi đã thử gửi các tin nhắn khác đến cửa sổ VNC nhưng vẫn không có gì.

Và rồi tôi lại chợt nhận ra!

Cảm ơn vì rất dày quyển sách Charles Petzold Tôi đã nghiên cứu kỹ cách thức hoạt động của các quy trình Win32 bên trong hệ thống. Mọi ứng dụng Win32 đều có một cửa sổ cũng như một "hàng đợi tin nhắn". Các tin nhắn được kích hoạt bởi sự tương tác của người dùng, cũng như các tin nhắn do chính Windows gửi, sẽ được xếp hàng đợi và chính ứng dụng sẽ quyết định cách xử lý chúng.

Bản thân nó không thú vị lắm. Nhưng khi tôi nhận ra rằng một hàng đợi tin nhắn chưa được xử lý đủ lớn đóng vai trò như một phương pháp phỏng đoán để Trình quản lý quy trình cửa sổ can thiệp vào một quy trình bị treo, tôi bắt đầu đổ mồ hôi serotonin thuần túy.

Không lãng phí một giây, tôi quay lại mã C của mình, chuẩn bị gửi một tin nhắn khác đến cửa sổ chính VNC WM_SHOWWINDOW. Trong một chu kỳ. Vĩnh hằng. Vì vậy, rất nhiều tin nhắn. WM_SHOWWINDOW, điều mà bây giờ tôi biết VNC sẽ cố gắng phớt lờ hoàn toàn... trong tình trạng nguy hiểm.

Tôi đã biên soạn và chạy 4KB đoạn mã yêu tự do nhất trong đời mình. Sau khoảng ba giây, Windows thông báo rằng quá trình này vncserver.ехе không trả lời và đưa ra một lời đề nghị mà tôi không thể từ chối:

Bạn có muốn hoàn tất quá trình này?

ĐÚNG CÓ!

Hãy để tôi thừa nhận rằng trong thời gian còn lại của ngày, tôi hài lòng với bản thân mình đến mức không thể chịu nổi.

Sau vài giờ tiêu hóa siêu năng lực mới của mình, tôi quyết định sẽ sử dụng nó như thế nào. Thật quá dễ dàng để kết thúc phiên ngay trước mặt anh ấy. Tôi có một ý tưởng hay hơn - biến mất hoàn toàn.

Sau khi lễ rửa tội với lập trình socket Tôi nhận ra rằng tôi có thể viết mã có thể làm được hai việc. Đầu tiên, nó sẽ chiếm cổng TCP 5900 mới được giải phóng, trước đó bị chiếm giữ bởi quy trình máy chủ VNC không biết gì. Sau đó, nó sẽ tạo kết nối TCP mới tới máy chủ VNC của máy được chỉ định. Mã sẽ chỉ ủy quyền tất cả dữ liệu giữa hai ổ cắm và Columbo sẽ nghĩ rằng anh ấy đang kết nối với tôi, trong khi thực tế là anh ấy sẽ kết nối với một máy chủ VNC hoàn toàn khác.

Mật mã của tôi sẽ đóng vai trò như một cầu nối bí mật giữa tôi và một linh hồn tội nghiệp nào đó mà tôi lựa chọn. Thật tuyệt.

Tôi ngay lập tức bắt đầu viết cây cầu VNC giả của mình. Columbo đã kết nối với tôi vài lần nhưng tôi vẫn tiếp tục lập trình trước mặt anh ấy. Tôi đi đến kết luận rằng anh ấy không biết tôi đang làm gì, mặc dù tôi đã viết những điều hiển nhiên như số cổng và nhận xét như // Прощай, жуткий шпион VNC.

Sau một vài ngày, tôi không thể làm cho mã hoạt động chính xác được. Tệ hơn nữa, tôi đã làm việc gần như liên tục với biểu tượng VNC màu đen trên khay hệ thống. Trong khi nó được kết nối, tôi không thể nhả cổng để kiểm tra mã của mình.

Nếu lúc đó tôi biết netcat!

Cuối cùng, thần kinh của tôi đã chùn bước, dù sao thì tôi cũng là một chàng trai 17 tuổi thiếu kiên nhẫn. Nhìn biểu tượng máy chủ VNC màu trắng lại chuyển sang màu đen, tôi hoảng hồn, mở đoạn mã gốc chứa hàng đợi tin nhắn và chạy nó trước mắt anh ấy. Tôi thậm chí còn đợi vài giây trước khi nhấp vào End Process, chỉ để chắc chắn rằng anh ấy đã nhìn thấy nó.

Nếu việc nhấn nút đó không hoàn toàn thuyết phục được tôi rằng điều đó đáng giá, thì chắc chắn anh ta sẽ nhảy từ phía sau pháo đài giám sát của mình để nhanh chóng tiếp cận tôi và dẫn tôi ra khỏi phòng.

Kết quả là tôi đã bị cấm truy cập mạng trong hai tuần. Một hình phạt công bằng, tôi nghĩ. Sau khoảng ba tuần, máy chủ VNC biến mất khỏi tập lệnh khởi động và không bao giờ xuất hiện ở bất kỳ nơi nào khác. Tôi chưa bao giờ biết liệu sự việc của mình có đóng vai trò gì trong việc này hay không, nhưng nó đã phá hỏng hoàn toàn kế hoạch làm giàu khủng khiếp của tôi bằng cách bán khẩu súng VNC của mình cho những sinh viên chán nản trong các phòng máy tính của trường đại học trên khắp đất nước.

Nguồn: www.habr.com

Thêm một lời nhận xét