有趣的二进制:软件安全与逆向分析
上QQ阅读APP看书,第一时间看更新

译者序

这是一本讲“底层”知识的书,不过似乎现在大部分计算机用户都跟底层没多少缘分了。很多人说,写汇编语言的时候总得操心寄存器,写C语言的时候总得操心内存,而如今到了Web当道的时代,不但底层的事情完全用不着操心了,就连应用层的事情也有大把的框架来替你搞定。想想看,现在连大多数程序员都不怎么关心底层了,更不要说数量更多的一般用户了。当然,这其实是一件好事,这说明技术进步了,分工细化了,只需要一小部分人去研究底层,剩下大部分人都可以享受他们的伟大成果,把精力集中在距离解决实际问题更近的地方,这样才能解放出更多的生产力。

话说回来,底层到底指的是什么呢?现代数字计算机自问世以来已经过了将近60年,在这60年中,计算机的制造技术、性能、外观等都发生了翻天覆地的变化,然而其基本原理和结构依然还是1946年冯·诺依曼大神所描绘的那一套。冯·诺依曼结构的精髓在于,处理器按照顺序执行指令和操作数据,而无论指令还是数据,它们的本质并没有区别,都是一串二进制数字的序列。换句话说,“二进制”就是现代计算机的最底层。我们现在用计算机上网、聊天、看视频、玩游戏,根本不会去考虑二进制层面的问题,不过较早接触计算机的一代人,其实都曾经离底层很近,像这本书里面所讲的调试器、反汇编器、二进制编辑器、内存编辑器等,当初可都是必备的法宝,也给我们这一代人带来过很多乐趣。

在MS-DOS时代,很多人都用过一个叫debug的命令,这就是一个非常典型的调试器。准确地说,debug的功能已经超出了调试器的范畴,除了调试之外,它还能够进行汇编、反汇编、内存转储,甚至直接修改磁盘扇区,俨然是那个年代的一把“瑞士军刀”。我上初中的时候,学校上计算机课用的电脑在BIOS里禁用了软驱,而且还设置了BIOS密码,于是我运行debug,写几条汇编指令,调用系统中断强行抹掉CMOS数据,重启之后显示CMOS数据异常,于是BIOS设置被恢复到默认状态,软驱也就可以用了,小伙伴们终于可以把游戏带来玩了。当然,学校老师后来还是找到我谈话,原因仅仅是因为我在信息学奥赛得过奖,他们觉得除了我以外不可能有别人干得出这种事了……

很多资历比较老的PC游戏玩家其实也都和二进制打过交道,比如说,大家应该还记得一个叫“整人专家FPE”的软件。如果你曾经用过“整人专家”,那么这本书第2章中讲的那个修改游戏得分的桥段你一定是再熟悉不过了。除了修改内存中的数据,很多玩家应该也用二进制编辑器修改过游戏存档,比如当年的《金庸群侠传》《仙剑奇侠传》,改金钱道具能力值那还是初级技巧,还有一些高级技巧,比如改各种游戏中的flag,这样错过开启隐藏分支的条件也不怕不怕啦。此外,各种破解游戏激活策略的补丁也是通过调试和反汇编研究出来的,我也曾经用SoftICE玩过一点逆向工程,找到判断是否注册激活的逻辑,然后用一个无条件跳转替换它,或者是跳过序列号的校验逻辑,不管输入什么序列号都能激活。

精通二进制的人还懂得如何压榨出每一个比特的能量。说到这一点,不得不提鼎鼎大名的64k-intro大赛。所谓64k-intro,就是指用一段程序来产生包含图像和声音的演示动画,而这段程序(可执行文件)的大小被限制为64KB(65536字节)。想想看,用iPhone随便拍一张照片就得差不多2MB大小,相当于64KB的32倍,然而大神们却能在64KB的空间里塞下长达十几分钟的3D动画和音乐,着实令人惊叹不已。我第一次看到64k-intro作品是在上初中的时候,当时某一期《大众软件》杂志对此做了介绍,光盘里还附带了相应的程序文件。当我在自己的电脑上亲自运行,看到美轮美奂的3D动画时,瞬间就被二进制的奇妙感动了。

二进制的乐趣不胜枚举,其实最大的乐趣莫过于“打开黑箱”所带来的那种抽丝剥茧的快感。夸张点说,这和物理学家们探求“大统一理论”,不断逼近宇宙终极规律的过程中所体验到的那种快感颇有异曲同工之妙。诚然,二进制的可能性是无穷无尽的,这本书所涉及的也只是其中很小的一方面,但正如作者在前言中所说的那样,希望大家能够借此体会到底层技术所特有的快乐。

周自恒

2015年8月于上海

免责声明

本书的内容以提供信息为目的,在使用本书的过程中,读者需要自己做出判断并承担相应的责任。对于读者因使用本书中的信息所造成的任何后果,作者、技术评论社、译者、人民邮电出版社恕不负责。

本书中的内容基于2013年7月12日的最新信息编写,在读者实际阅读时可能已经发生变化。

此外,软件方面由于其版本的更新,可能会与本书中所描述的功能和画面存在差异。在购买本书之前,请务必确认您所使用的软件版本。

各位读者在阅读本书之前,请同意并遵守上述注意事项。如果没有阅读上述事项,那么对于由此产生的问题,出版社和作译者可能也无法解决,敬请各位读者理解。

关于商标和注册商标

本书中所涉及的产品名称,一般皆为相应公司的商标或者注册商标,在本书正文中已省略、® 等标记。