编码机(2009)

2021-04-14 01:31:30

一分钟后,帕特里克回来了一个小型纸板箱。戴夫和我盯着帕特里克打开了一个网络交换机,旧的旧品种他们是用金属案例制成的。他插入了电源,并小心地伸直了一个Cat-5电缆挖掘开关到我们的网络。我想在他的时候对他大喊大叫,这么谨慎,刻意.dave坐在我旁边,并不具巧范。

当帕特里克努力让港口加上插件时,我停止了呼吸。我盯着前面的面板灯,觉得戴夫做了同样的事情。我的眼睛浇水。 Patrickpushed插头。正面灯立即点亮,积极点亮。我觉得我的手和脸上脸色,而且我的眼角戴上了戴夫仰卧起来,睁开嘴巴说话。然后他将脸部放入他的Cupped手中,扔掉了。

这不是我们将如何在三个周末做出反应。在蜜月结束后,三周我们已经定居了一个项目的一个项目,并在设计繁琐的产品中,这只是设计中简单的盒子,似乎是棘手的原因令人棘手偶然,因此无趣。

当然,帕特里克和戴夫已经完成了设计,并且我曾闻到我,因为我建议了各种各样的思想,这对他们来说一定是显而易见的。听到他们辩论的设计问题已经充满了习惯。许多人的争论是基于直觉而不是推理的。我每个星期都比我的整个莱斯队的学校所学到了更多。

我发现自己更多地用戴夫来了。 Dave Mitchell有肖像笑。他在沉重的一面并敲了很多东西。我喜欢他对管理层和软件开发过程的洞察力,他喜欢教学的东西。帕特里克和戴夫分开了他们所说的工作,他们已经给了我的测试,以写出他们准备好的代码。

当我听到Dave Whisper的时候,这是一个安静的一天,“霍尔是什么?”把手放入他的头发。我感受到了一个学习和走到他的桌子的人。他没有。他很快就恢复了他的编辑,加入调试输出行,编译,运行,摇动hishead,并切换回来另一行。

他等待直到程序完成跑步回答。“我无法弄清楚这个错误。我无法弄清楚这个数字来自这里的地方。“他指着该线路输出中的一行。 Dave和Patrick喜欢写入控制台,而不是在我喜欢做的时候踩到adebugger。

“在调试器中介绍它时会发生什么?”这是戏弄。 Dave不知道如何使用调试器,短暂显示核心文件的堆栈跟踪。

戴夫停了,然后在他的程序上提出了调试器。我惊讶地笑了笑,然后走过他如何吓坏了。我们花了未来几个小时缩小,在他的代码,提升和系统里程的混乱中,这个值来自。

“帕特里克,你能帮助我们吗?”这让我感到惊讶的是调试器。戴夫很少向帕特里克寻求帮助。

帕特里克过来,戴夫解释了这种情况。 “theprogram正在崩溃,这是因为这里的坏事,但这里的价值是正确的。”戴夫引点了一些代码,而帕特里克的眼睛扫描了屏幕。然后艾滋病给了我。戴夫仍在解释和iDID不想中断。当我渴望呼吸时,我的心在跳跃。

“我认为这是一个编译错误,”我充满信心地说,眯着眼睛在代码上眯着眼睛。帕特里克和戴夫拉德在其他人刷掉这个。

“责备编译器是最后的手段,”帕特里克说。 “与标准库相同。大家的品牌新代码有一个错误,而不是数千人使用的代码。“我明智地点点头,但我觉得米克斯脸红了。

帕特里克卡尔斯森经常让我感到难过。他从来没有想到,我敢肯定,但他有一种以一种残酷的勇敢的方式来争论,让我觉得我觉得不想不过。他比戴夫和我更高。除了纠正我所说或代码的时候,他很安静,我曾经讨厌,但无论如何,我都喜欢他。我有时发现了他的决策可疑和天真。戴夫和我喜欢他对他起来的。

帕特里克打破了他的指关节。他向问题提出了问题,我不知道的问题,但希望我想到。戴夫考虑说道,并说帕特里克的担忧没有申请Inthis案件。帕特里克在右边噘起嘴,当他不确定他不确定他的答案时,他的答案是不再经济的方式,并说:“嗯,我不知道。奇怪,“并返回他的办公桌。

我很放心,帕特里克没有用无氧的解决方案粉碎我们,我猜到了戴夫斯感觉同样的阿什坐在他的懒散并开始打字。 “是在这里展示了大会的人,在这里展示了大气的东西?”

我向他展示了如何做到这一点,我想知道他是否赐给了理论是一个机会。他键入了命令,ofc的线条分开了几十条装配线。

“那不对,”戴夫说,“我们得到了错误的命令。”

“我相信那是对的,”我说。我很好地了解调试器,并通过“我们”的意思是我。

“不,这不是,这对这条线的装配太多了。其中一些甚至不是法律集会结构。“

戴夫慢慢眨了眨眼睛。 “好吧,我的意思是我从来没有见过Seenthese,他们不是一个编译的产出,这不是一个没有理智的地方。”他被慌乱了,我觉得更有缺乏经验。戴夫起身说,“我被烧毁了,明天我们会再次看这个。”

他离开了,我坐在他的电脑上。我整天唯一交往的是关于调试器的知识,甚至没有想到我的权利。我在屏幕上看了一眼。一些指示罕见,有些指示是神秘的。我找到了一个在线装配机构,并开始跟踪说明,在我的笔记本中保持关于寄存器内容的指示。

戴夫是对的,这些说明没有意义。他们不仅仅是对相应的C代码表现太多工作,但他们甚至没有在内部有意义。但我劝告这是至少是正确的一部分,因为AFEW的指示符合周围的C线。

我专注于一个特别的指示。它从自身中减去了异常。本身并不一定奇数:它可能是将寄存器设置为零的有效方法。然后将寄存器用于其他数学说明中。 Checompiler必须知道它会为零并优化它。我犹豫了,然后叫帕特里克。我解释了Ihad发现了什么。他盯着它一直盯着它,然后说:“这不是一个正常的减法指令。”

他是对的。我更谨慎地看着它,发现这是一个也是一个也减去携带比特的变化。这是一种让携带位进入寄存器的方法。我向后工作,看看携带的位置。 Codegot越来越复杂,我反复制服扔掉课程的假设。

我转过身来问帕特里克一个问题并找到了一个空洞的东西。这几乎是午夜。我设置了办公室闹剧我的自行车家。

我第二天早上到了。我没有睡眠,它让我睡了几个小时。每次iclosed我的眼睛,我看到快速移动的装配说明表现出明亮的字母。

我直接走到戴夫的桌子上讨论前夜的调查,但他不感兴趣。

“你是对的,”他说,“这是一个编译错误。我调整了C代码,我不再触发它。那个怪异的是。“

我处于尴尬的立场,必须与之相互矛盾。 “我不知道这是一个错误。我锯的代码没有被一个错误生成。“

“这绝对是一个编译错误。”我与DaveNough工作过,知道他更自信地说话,他所做的不佳。但他厌倦了由问题举起来,我放弃了它。

戴夫用咧嘴笑和杯子喝一杯咖啡走到我的办公桌前。我以为所有的咖啡都味道罚款,但他是挑剔的,所以我假装是挑剔的,这样我就可以和他走到Peet的时间。我感觉有点静态,他这次没有我走了。

“你记得星期二的编译器错误吗?”他咧嘴笑了。他的牙齿来自浓咖啡的黄色。

“这是今天早上再次发生的。相同的文件,同样的问题。奇怪的装配又回来了。奇怪的是iDID不会更改C文件。“他令人惊讶的是醇厚的醇厚。

帕特里克走了过来。 “这不好。这是一个崩溃,但它可能是更加微妙的。在四个月内,我们的系统将如此复杂的是,一个微妙的问题将占领来追踪。你可以看看编译器的释放笔记,看看我们是否可以升级?“

我简短地看着我所期望的东西。我们正在推荐的最新和最稳定的推荐巨大版本。它没有比这更稳定。我进来了寻找“奇怪的装配”和“编译器错误”的一些排列,并找不到任何东西。

我在我的电脑上编译了Dave的代码并拆解它。在那里有奇怪的代码,在同一个地方,它已经存在。我认识到与携带的指令,其他似乎异常的例子。我也通过其余的代码看。它令人醒目的是,UnusualInstrive如何出现在其他任何地方。其余的代码使用了您预期的指令。毕竟,你什么时候需要减去并使用携带位的现有量具?

我下载了编译器的源代码。我曾经过于淹没。这是一个纠结的编译,插件框架,嵌入语言来描述CPU架构和抽象层。我去了将摘要语法树上翻译到机器组件的文件的文件。为减去带携带的IGREPPED。它不在那里。 ilooked of其他奇数。有些人在那里,不是。

午餐时,我提到了我的调查结果。我们使用的小型办公室使用庭院,即山景,几乎总是可以避免。星期五是多哥的一天。我更喜欢地铁,但是戴夫闲逛了面包。

“这是超级怪异的,”帕特里克说,在桌子上皱眉。他说“超级”很多。我认为这是一个加州的东西。“哪些其他人不在翻译文件中?”

“我不记得了,”我说。 “更多涉及TheCarry位的更多信息。一些矢量说明。“

“任何错误地生成的指令或者你是一个非典型的。”他仍然皱起眉头。

戴夫削减了。“这绝对是代码。这就是导致的错误。它正在被执行。“

“它不是错误的,”我补充道。 “这是一个MATHINSTRUCTSIONSTRUCT,但我认为这不认为它被用于数学。它不是废话。”

“整洁的。”我们终于迷上了帕特里克。午餐后,他和isat下来桌子上,走过代码的一部分。我向他展示了虽然指示令人生畏,但他们确实有意义。有故意的数据流。

“这种跳跃的目标可以是循环的顶部。这是开始分析的代表的地方。“

它剩下的下午休息,挑选了强化跳跃目标并解码了四个截止值。事实证明,那个片段,正在发现Integer的theign。其他任何人都会采用SimpleComparison和跳转,将输出寄存器设置为-1,0或1,但四个指令是一个混乱的指令Stthat,都将携带位设置为副作用,或者在非正统中伪造办法。

“你知道,”帕特里克说,“这甚至不是一个兴趣的地方。我想知道这个代码如何进入这里。你说的是说明没有翻译文件?“

“他们必须在其他地方。让我们的来源来获得语音和op-code。“

我做了一个递归的grep,它上升了。我不知道接下来要尝试。

我收到了装配指导和捕获量的名称,但寻找op-code ofhits。

“有趣的是,”我说,“他们不是生成个性化的,他们正在倾倒预先构建的代码块。”

我拆解了整个编译器,并寻找一些可疑指示,并找到了大部分,就像我们一直在追踪Allafternoon的模糊代码一样。

“编译器被感染了!”我说。 “难怪我们可以在它的源代码中没有。”

“好的,让我们首先重新编译编译器”,“Seenpatrick。 “我会在网上捅,看看之前有人的seenthis。当你完成编译器时,重新计算我们自己的代码,看看Dave的错误是否已经消失了。“

编译器花了两个小时来重新编译,不包括我花在学习复杂的构建过程的情况下。帕特里克在网上找不到什么。我重建了我们的源树并运行了测试。他们失败了,在同一个地方。

“也许这个虫子是由于别的东西?”帕特里克走过时仍在。

“那不可能,”我说。 “这是一个新的官方来源的新建设。”

“他们必须被感染了。也许有人打破了下载网站并用修改来源替换它们。“

“我很乐意看到那个代码,”我说,并将OpenedMy编辑器到编译器中的文件。

“这将永远带走你,”帕特里克说。 “将AbreakPoint放入Write(),具有此操作码的字符串的条件。”

而这来自假装不喜欢调试器的人!设置条件并不容易,并且有许多虚假的姿势,但下面的周一早上我点击了输出可疑代码的Write()。我突然出现了ccode。它是输出缓冲区的通用例程。我向填补了它的代码工作,它是基于翻译表的Allstraightforward循环,何时知道是干净的。

在绝望时,我开始分页Chompiler的每个源文件,寻找可能删除的任何代码。它很多都是操纵抽象的语法陷得困境。然后它发生在我身上,黑客无法受到影响,因为后端翻译表很干净。 HACK必须在后端本身。事实上,它会在注册任务后哈哈。这大大缩小了研究,我花了一个小时在午餐时间之前看着档案。

星期一是凤凰日。 我们总是去了Pho World,这是如此低的租金甚至没有菜单,但这是一种美味的方式来花费四美元。 “圆形的眼睛,没有肚子,没有香菜,”戴夫说了龙头,我们都跟着西装。 我不知道是什么削减了“圆的眼睛”是什么,但我知道这是安全的。 “所以我找不到它,”我说,“从破坏点或从代码前进。” “我们必须,”帕特里克说。 “我们不能像这样在一些东西上建立一个产品。” “这很奇怪的是,C来源是干净的,但是没有这些奇怪的op-codes,”我说。 “我不是在你的代码中的意思,我的意思是编译器本身。” 我不明白Dave是说的,但帕特里克·哈克·毕业,似乎是洞察力的边缘。 我似乎是清醒的解释。

“所以编译器检测并修改您的程序,ForReasons仍然是未知的,而且还检测并修改自身编译。”

“对,”戴夫用笑容说,在Hisoup和Sprating的棕色酱汁刺杀了一些东西。

“那会怎么工作?”帕特里克说,现在以全面形式。 “Ahacker将此代码添加到编译器中,并将其分发。代码检测到它编译编译器并将其自身添加回二进制文件。一个修订列车黑客从官方购买分布中删除了代码。然后,黑客永远延伸自己,在源中没有追踪。“

“和目的是什么?”我说。我持怀疑态度,代理可以在多个中那么完美地检测并插入自己。

“我不知道,我们没有足够远进入Dave的代码的分析。明显的事情是某种校正验证代码,修改为始终接受备份门密码。“

“所以让我们回到一个旧版本的编译器,”笑道。

“你的意思是旧版本的二进制。来源没有帮助我们。我不认为我们周围有一体化。韦恩不知道这是多远。“

“这呢,”我说,试图有用,“我会撰写的实用程序,你可以在二进制文件上运行,它会告诉你它检测到这些操作代码的可疑使用。”

它不需要长时间写这个实用程序。它只是通过拆卸器竞争,然后通过少数Greps Tofind指令,绝对不是由thecompiler生成的。它在Dave程序中找到了代码,以及编译器。我将其放在系统中的所有可执行文件中。

“这是列表,”我说我走到帕特里克的桌子。它是三页。他看着它。

“这是不好的。 Java Runtime,Python运行时,Perl,编译器和一堆其他程序都无关紧要。“

“因为如果我们不能相信C编译器,那么我们就有一个新的,这并不是那么难,但你打算在写它吗?你是否会将您的新编译器Totrust to strust向黑客Python翻译?“

“你不会写一位新的编译器,”戴夫沿着桌子们说。 “不要得到所有的阴谋偏执狂。这可能只是一个虫子。“

我离开帕特里克盯着名单上,然后回到我的桌子上。我仍然没有对我问Atlunch的问题的答案:这个黑客的目的是什么?我已经享受了一些这些代码的工程,坦克盖迪担心Patrick会要求我在装配中编写一个Compiler,所以我把我的耳机打开并打开了调试器,将调试器打开到Compiler的Compiler的一部分。

再次使用涉及Consterbit,不寻常滥用矢量指令的指令,以及卷积,有时不必要的跳跃。没有编译器会赋予。这是难以理解的。 iset out弄清楚这一页面的代码目的。

有一段时间后,我看到托管人拿起我的垃圾桶抢夺它。我脱掉了我的耳机。戴夫和帕特里克·帕尔奇。这是十点钟。我回到了熟悉的指示屏幕上。我拼凑着它的粗糙度,或者至少有一些部分的东西。我感觉到了匆忙的能量。我接近答案。我留下了临时。

帕特里克在我屏幕上坐在我旁边。“在这里,他们使用矢量指令来获得一系列正方形,这只是比较这些Twogyte阵列的复杂方式。”这是一个十分钟解释的高潮。

“好吧,这是一个模糊的搜索,我猜它很快。”

“是的,但这是我见过的最令人复杂的鲁宾 - 戈德伯格方式。”

我的肩膀沉没,我摆弄了鼠标。我看起来很粗略的笔记。他甚至没有留下深刻的印象。

“我不知道,让我赶上电子邮件。”他离开了Hisdesk。我被贬低了,我的肌肉酸味。我在早上浏览的速度休息并刷新了MacWorld事件的Live Blogof。

在午餐时,Patrick将我的发现叙述了戴夫。 每一个细节都是沉闷。 戴夫咧嘴一笑,每次新的并发症都摇摇头。 我是一个不合理的,他能够如此迅速地追随它,并提供任何代码来看待。 我意识到,帕特里克是对的,倾听它的allagain。 这远远远离了一种做出比较简单的方式。 “你有没有见过那些混淆的编程比赛?”迪夫询问帕特里克几乎结束时。 “这只是似的。” “一位朋友和我互相竞争,在大学写下Anobfuscated计划,”帕特里克说。 “我不知道他做到了,但我开始通过编写程序编写,然后通过重命名变量,内联表达式,填充的东西来逐步逐渐变得更加困难。 这个过程内世为 ......