程序员之战:我 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 枪来致富的计划。

来源: habr.com

添加评论