一 切 皆 字 节
作者:+mala
你们当中的一些人为了读到这篇文章期待以久;另一方面,许多人却毫不在意。首先,我必须道歉,因为我没有借口――我只是失去了完成并且花数月时间尽力再找到这篇文章的愿望。另外,我希望这篇文章能教会一些你们以前不知道的东西,那么下一次你就可以步入高手的行列中。
还有一点: 用图形编辑器布丁一个 exe 文件的想法不是我首创的。我只是几个月前在网上找到它。我实在记不起它的网址…但是如果你认识这个想法的原创者,或许你恰巧找到了这个网页,请告诉我,以便我把这个网址加到此教程当中。
关键词:一切皆字节;可执行图文档;查找文件结构;文件混沌;用Psp打布丁
目 录
I.导 论
I-A一切皆字节
I-B 结构和混沌:头 Vs 扩展名
II. 在文件当中搜寻结构
II -A FILE命令
II -B 关于Zip文件
II -C 关于图像格式
II -D 倾印(Dumping)
II -E 零 项
III. 与混沌共舞
III -A 一些基础
III -B 用Psp打补丁
III -C 可执行镜像
III -D 这不是win.com
致 谢
I.导 论
A.一切皆字节
一切皆字节。当然,你们当中的大多数不会对此感到太陌生:毕竟,不管是声音,电影还是一个纯文本文件,所有驻留在计算机硬盘里面的东西,首先都得转换成二进制格式。这触发了我们一些不是那么明了的思考:如果所有的文件都享有同样的文件格式,那为什么有的文件我能执行而另外的文件只能播放或浏览?我可以读一个可执行文件吗?我可以听一个图形文档吗?这些问题各自的答案是:因为有一些信息告诉你的系统该怎么做——执行还是播放还是浏览;当然你能;当然你能;……你有没有在Linux提示符下输入过 cat /usr/bin/netscape > /dev/dsp?:)
B. 结构和混沌:头 Vs 扩展名
到此,操作系统靠什么来识别与它打交道的文件类型呢?当然,有许多方法:举例来说,最拙劣的途径是查文件扩展名;较好的方案是查询文件头或一串特定的字节序列,这些序列(几乎总是)精确的标记文件类型。这两种方案哪种被Windows所采用?留给读者练习J
看下面一个例子:在Windows系统磁盘里面(如果你有的话),查找扩展名为".jar"的所有文件;然后拷贝之一到另外的地方,把文件名更改为".zip"。双击它,瞧,我们正确地以ZIP文件的方式打开了!接下来,复制一个叫c:\windows\system\shdoclc.dll的文件到另一个地方,改名为 shdoclc.html…呵呵…如果你双击它(我不敢保证这样不会当掉你的系统)一些奇怪的事情发生了!
为什么?发生了什么?
在第一个例子中,JAR文件只不过是ZIP文件,仅扩展名不同。因此,由于Windows根据文件扩展名来识别文件,除非你把文件名改成*.zip,是没有办法打开的。在第二个例子中,shdoclc.dll包含一些html代码来生成不同的web页面,可它不是HTML文档:它是可执行的,所以一旦以html方式打开,会观察到一些奇怪的代码…还有一些奇怪的浏览器行为, 这是因为浏览器分析了粘贴在一起的所有不同的html页面的结果。
正如你所理解的,检查文件扩展名的方案相当糟糕, 因为它不会让你真正明白你究竟在和谁打交道。最坏的情况是当一些病毒把自身复制到电子邮件附件,使用双扩展名(比如 .txt.com 或.mp3.pif)如果你选中了“对已知文件类型隐藏扩展名”选项,可能在忽略他们是可执行的情况下就以双击方式运行。其他相反的情况下,给识别扩展名一些限制或许会对我们有用,下面你就能看见。
如何保证正确无误地识别一个文件呢?即使在某些情况下不能保证,我们也可以非常幸运地使用一些”文件分析”工具,他们可在Windows和Linux下运行。这些工具可以从 http://www.programmerstools.org/ 的 "utils"区下载。在Linux下可以使用强大的FILE命令,我会在下一小节中详细阐述。
II. 在文件当中搜寻结构
A. FILE命令
"file"(是的,正确的命令名全是小写的!)是一个强大的unix文件分析器,它在文件系统上做各种诸如文件数据和(如果数据是文本)语言的测试,取代了只是看看扩展名的处理过程。我们总是对“数据”测试产生极大的兴趣:测试过程中,FILE在文件中查询特定的数据序列(被称作"magic numbers")来识别其类型。尽管它不是那么完善,可仍是一个很好的工具来帮助我们理解文件识别是如何工作的。当输入 "man file",或更准确一点"man magic",我们能很容易深入理解配置文件(被称作"magic")Magic文件格式(我的Debian是在/usr/share/misc/magic里面的,你也可以用google搜索"/usr/share/misc/magic" AND "177ELF")很容易理解:每一行由如下的域组成:
? OFFSET(偏移量)
此域以字节的形式指定了一个偏移量,该偏移量指定了被测试数据在文件里的地址。在偏移量前跟有一个或多个">",用来指明测试等级:没有">"的测试等级为0。如果为0的测试成功,等级为1的测试(一个">")才接着进行,接着跟者等级2的测试(">>"),以此类推。在一个高于1的测试等级中会在偏移量前出现字符"&":这意味着我们应该关注相对更高等级的测试,而不是绝对偏移量。给个小例子:下面是观察magic文件ELF节时会所发现的:
0 string 177ELF ELF
>4 byte 0 nvalid class
>4 byte 1 32-bit
...
注意:177是以8进制表示的字节值(0x7F,127dec)
以上的含义是: 如果一个文件以0x7F开头,后面跟着字符串“ELF”,那么这是一个ELF文件;如果在偏移量为4的位置有个字节的值为1,那么这个文件是一个32位的ELF,但如果是0话那就是一个无效的class ELF文件。
? TYPE(类型)
从前一个例子我们已经知道了 TYPE域是用来干什么的:它仅仅包含了被测试数据的类型。可能的值有:
byte :一字节
string:一串字节
short,beshort, leshort:2字节(大多数系统),按照高位在前(be-)或低位在前(le-)的机器字节顺序
long,belong,lelong: 4字节(大多数系统),按照高位在前(be-)或低位在前(le-)的机器字节顺序
date,bedate,ledate: 4字节(大多数系统),按照高位在前(be-)或低位在前(le-)的机器字节顺序,解释为一个Unix 数据
? TEST (测试)
这是一个与文件内的值做比较的值。如果是数值类型,其值规范为C格式;如果是字符串类型,其值规范为C字符串格式,并且包含有转义字符(如n表示转行)。在测试值中,可以根据它的类型使用一些运算符,例如=,(对数值和字符串同样起作用),&和^(AND和NOT只对数值起作用,并且需要一些位bit被置位或清位)。请参阅man帮助获得详细的解释。
? MESSAGE(消息)
如果测试成功则会输出消息。当这串字符含有printf格式规范(比如"%s")时,来自文件的值会以这种格式输出。
下面是在研究magic文件后所需注意的几点:
?首先,事实上存在一些信息告诉计算机它正在处理一个怎样的文件:拥有特定值和在文件中的特定地址的数据本身。他们能够识别文件类型,同时让你 获得许多其他信息(看看所有的">>"项目)
?在大多数情况下,标识字节在文件的开头,但有的时候重要的信息不一定在文件头部。如果这一事实对ZIP文件来说不是事实的话,那么我们就不会对ZIP文件产生如此大的兴趣。
B. 关于Zip文件
ZIP文件把打包文件信息保存在压缩文档最后的字节当中:这意味着可以把你想加的东西填充到他们的开头,或是在开头做点小小的修改。Windows下的Winzip和Linux下的unzip仍能解开他们,不会遇到任何困难。但是,FILE工具不再识别他们了:在magic中的这一行
0 string PK\003\04 Zip archive data
意味着FILE只检验头四个字节,如果把他们改成比如"ZZ",FILE不再识别zip文件,其他程序却有可能打开它。
总之,这不会造成很大的限制:FILE提供间接偏移量,在改变原文件的同时,可以让FILE从任何地方开始查看偏移量,而不是从文件开头。当然,我把这个任务留给读者J
C. 关于图像格式
正如你所看到的,ZIP工具不在乎压缩文档开头所填塞的一切。另一方面,一些图像格式不介意他们尾巴所加的东西:因为在图像文件的头部,图像的宽度和高度已经指定,所以一切超出的字节都将被忽略。.gif和.jpg图像都符合上述情况。同ZIP文件特性相结合,我们可以把JPG和ZIP文件添加到一个文件中(图像文件在前,压缩文档在后)。在Windows下,打开第一个或第二个文件仅更改一下扩展名!
D. 倾印(Dumping)
假如想研究一个文件,应该准备一个工具,它能打开这个文件并且以原始格式倾印在屏幕上。一个16进制编辑器是实现这一目的的好工具,如果能够提供从16进制到ASCII码转换那会更好。最好的是像Hiew和Biew这样的工具,它可以反汇编所打开的文件。另外一个强大的工具是Vermon Buerg的list.com,它可以打开任何大(BIG)文件,以16进制或ASCII码形式倾印,快速查找字符串等,这些都运行在DOS窗口并且小于30 KB(不要搜索最新的,“臃肿的”win9x版本:我最近已经升级到v9.6d,但是9.0同样能适合我的目的)
运行regedit,建立如下的注册键
HKEY_CLASSES_ROOT\*\shell\Open with List\command
值为:
"c:\windows\command\list.com %1"
这样就可以用List双击打开任何未知格式文件,或者通过鼠标右键选择"Open with List"打开其他所有文件。
一旦找到了一个适合你需求的文件倾印工具,学着使用它并且大量地使用它!不多久你就会发现:许多出现在文件里的样式类型都一样,这样就很容易地记住他们。同时,你会学到很多有趣的,实用的东西。举个例子:
?许多病毒把他们的名字或一些特定字节放到目标感染文件的开头,所以用倾印工具打开可执行文件可以避免被病毒感染,但还是要理解哪个文件会袭击你。既然许多特洛伊病毒最近特别流行,在打开附件之前倾印他们是很明智的。
?你知道CuteFTP在宏里面以明文保存密码吗?好了,我知道你能用任何文本阅读器打开CuteFTP宏文件,但是这个例子给你展示了如何打开硬盘里的任何文件。因此,如果你忘记了保存在CuteFTP "FTP site manager"的密码,只需要开始记录一个宏,连接到想连接的地址然后保存这个宏。最后可以得到类似下面的文本:
Host 123.123.123.123
RemoteDir /home/httpd/mywebsite
LocalDir D:mywebsite
Retry 20
Login Normal
User myusername
Pass mypassword
Connect
? 如果真的不幸要使用M$ Word(在大多数情况下你不是真有必要使用它,但如果你使用了那说明你很傻,而不是不幸)来打开.doc文件:有好多垃圾塞在里面,这非常令人吃惊。假设碰巧选上了“快速保存我的文档”选项,或许会让一些垃圾塞到另外的文件中,或是把错误连同更改交织在一起。举个例子?这里就有:
1) 打开M$ Word(我是用的Word97)
2) 确保“快速保存”被选中(选项窗口的保存标签内)
3) 建立一个新文挡,输入:“亲爱的老板,你真的很讨厌”。
4) 用你最喜欢的文件名保存此文挡(我用 example.doc)
5) 把这些文字修改成“亲爱的老板,你真是一个伟大的人”(不要慌张,如果你觉得你不能写这些话,你可以写你想写的)
6) 再次保存文挡后关闭Word。
7) 用倾印工具打开这个文件,设想一下当你的老板收到它会发生什么?:)
这个文件再次显著地膨胀…但是我不想在这个题目上花更多的时间。我更想让你自己来探索所有的细节,只是给你一些建议:当M$ Word当掉的时候(我保证它会的),上一次的更改会全部丢失,试着用倾印工具打开那些保留在你硬盘里的备分文件,然后用剪切和粘贴来恢复大多数文字。
E. 零 项
也许你已经注意到这样一个现象:硬盘里的各种文件格式含有一些值,他们在特定的地方出现,而且比其他值出现的频率要高很多。我为什么要把这一节叫做“零项”的理由就是因为他们经常为零,但不总是!
举例来说, 文本文件也许在大约每80个字符后就有个CR(或者CR+LF)。这个行数不总是一致的,但是可以假定一些常规--在一些情况下,这些常规可以让你发现在一些加密的文件里包含有文本(仅观察一下一个.box Calypso邮件槽文件,你就明白我的意思了)。深入了解ASCII表或许对这样的任务也有帮助。你在后面也许会读到一些。
如果你恰好在学习可执行或其他的二进制文件,另一个角度而言,零项在那里被广泛地应用:不光作为字符串结束标记,还可以用来填充PE文件的结尾。如果这个不好理解,那就设想一下,有一长串的,相同的或许就是零的值。比如,打开文件c:\windows\system\systray.exe,那里就填充了许多零。我在寻思有哪个病毒作者是否想过感染systray.exe,因为它有太多的可利用空间,同时它总是在系统启动时被加载。遗憾的是,我在linux下找不到类似的例子。试运行biew /usr/bin/vim 观察会发生什么。我估计你是找不到PE文件的。
III. 与混沌共舞
A. 一些基础
好了。现在你知道了文件只不过是一堆字节(啊,一件多么好的消息!),软件以它所设想的形式来解释。一些系统通过扩展名来识别文件类型,另外的系统则利用特殊的字节序列。但是最有趣的事情是,用一个根本不是用来处理这个文件的软件来打开它。我得打住了,停止困扰你… 如果使用可以处理RAW格式(事实上,这是一种非格式)的应用程序,我们就能以文本文件,图像,声音或想要的任何方式读取文件。
B. 用Psp打补丁
以前黑过程序吗?嗯,不要怕,这个时常会发生的。即便你是一个最跛脚的黑客,你所做的只是运行一下补丁程序,我希望你至少了解你在做什么:既然程序都是一串字节序列,那么仅仅改变一个字节,程序就会做完全不同的事情。正如你是一个注册用户,可是你提供了错误的注册号码。
当然,补丁一个程序还有许多其他目的,比如修正错误,给编译好了但没有源码的封闭软件加入新的函数。通常为了完成这个任务,我们可以使用16进制编辑器,像Hiew和Biew,或是我老式的hexpatcher(我在工具区里面提供)。这一次,我们将用到Paint Shop Pro,当然拉,Psp只是其中之一,其实一个图象编辑器就可以以RAW格式的方式打开图象。
在这个里子中,我们会试着补丁一个小程序,Cruehead’s CrackMe v1.0,这个Windows应用程序什么也不做,只是在那里等着被黑掉。可以在http://3564020356.org/tutes/crackme.zip得到。既然这个程序只是一个简单的保护,我不打算花太多的时间在上面。 它只是实现了一个注册码检测,然后弹出“你是好人”或“你是坏蛋”的消息框。那些想用SoftICE做实验的人们,可以在messageboxa上用 bpx 设置断点。当弹出调试窗口后,跳出函数,注册码检测和跳转的指令就在不远的几行,地址是401243。
现在,我们从softice得知在地址为401243的内存里面有一个jz(0x74),我们的目的是把它改成jmp(0xEB)。如果程序在硬盘里面,我们怎么能定位这个跳转指令呢?有许多方法可以达到这一目的,取决于你用什么工具(当然,我们设想你一直没用过16进制编辑器)
? 如果你有反汇编器,或者是其他工具可以查看节信息,阅读RVA(译者:相对虚拟地址)和偏移量(Offset),然后计算文件真实偏移量:
Offset in file = (Address)
- (Imagebase)
- (RVA)
+ (Offset of section)
比如说,我们获得了关于CODE节的以上数据
Object01: CODE
RVA: 00001000
Offset: 00000600
Size: 00000600
Flags: 6000020
映象基地址是00400000。所以,指令在401243的真正偏移地址是:
401243-401000+600 = 843 (16进制)
?如果你反编译器和PE查看器都没有的话,可以试一下LIST(很有用的工具)。用它打开可执行文件,按ALT+H来查看倾印数据,然后在倾印中查找"c3 74 07",嘭!第一枪你就中了,正如所见,“74”就在0x843。
?如果你反编译器,PE查看器,LIST都没有,或许你可以试着用一下PSP本身:)警告:如果要查找许多数据,或者是一个常见字节序列,这个方法不是很容易,也不会变得很有趣。但是幸运的是在这种情况下,找到你要映像补丁的地址不是很困难…因此,下面这几行会教你这个技巧。
如果你问自己 “如何”,实际一点,可以用一个图像编辑工具取代镜像文件来处理数据。以下是我的解释:
假设一个文件是以二进制格式保存的,那么我们必须以RAW格式打开:我不知道在其他应用程序中如何称呼,但是你所得到的是一幅灰度图像,那里每一象素表示了打开文件的一个字节。同样,由于这幅图像的大小没有在文件里面指定(所有的字节都是象素),必须自己选个尺寸。理想的尺寸是 宽100(如果文件很大的话那么就1000)、长根据文件大小选宽的倍数(或更大,我们不介意在后面加多少个零)。在本例中,根据文件大小为12288字节,选择 宽=100 长= 130。
如果你想知道一个字节的值(也即是一象素),只要把“dropper”或“color picker”工具放在象素上然后点击。假如相反要改变一字节,只要选择1号的画刷(或者铅笔等任何工具。我认为每种工具在1号应当一样),你喜欢的颜色,然后点中要改变每字节的象素。
如果你想查找一串字节…呀,我不知道这要求是否合理(也许用GIMP可以,但用PSP显然不行)我学会的技巧如下:
?以RAW打开文件,增加其颜色深度到16,000,000
?用颜色替换工具把一字节(比如“74”)替换成一个亮度颜色(比如红色或绿色)。如果你对图像编辑工具感到顺手的话,也可以选择大于1号的画刷。如果你习惯操作exe的话,那就只能在代码节内替换颜色,乍看起来,这很容易个性化。
?现在在你选择的前一字节值做同样的事情(当然是用另外的颜色)。从现在起,我们只能考虑在一行中的两种颜色的序列。如果想得到更多的序列,重复此步骤。
?最后,记得给这个文件选择一个版本:不是处理一个拥有16,000,000颜色的图像,而是一个出色的旧exe原始文件。
注意:所有我们处理的数字都是16进制,有时你可能必须在应用程序中处理十进制数值,所以有必要学会如何转换,或者用SoftICE的"?"命令
只用两步就可以说明如何修改crackme.exe:一幅图像只能得到2个有颜色的象素,最右边的一个是你必须改变的。假设用100X123分辨率打开此图像,它的坐标是(15,21)。如果已知字节在文件内的偏移量,仅把偏移量除上宽度,把除的商作为y,余数作为x。在本例中
0x843 = 2115 dec
2115 / 100 = 21 = y
2115 % 100 = 15 = x
现在得到了坐标,选一个你喜欢的颜色(0xEB = 235),“图”到正确的象素上来布丁程序。以原始格式保存文件,这样就得到了黑过的crackme.exe
C. 可执行镜像
天啊,我在第一次开始写这个教程时,就这个话题刚做过试验,但是现在都过去很久了,我担心不能回忆起所有我所发现的细节。但是,我会尽量解释他们,一步一步地,在写的时候再重做一遍。希望这样比较合理。
首先让我想到的是:一幅图像同时也是一个运行的程序,我在上面都告诉你们了:我们知道以图像格式查看可执行文件是可能的,但这幅图像是毫无意义的。有可能做出一幅“好”的图像同时也是一个可执行文件吗?
当然可以,不过我们得先注意到一些细节:
?Windows可执行文件有固定的格式(在本文里我有时称作PE。要得到关于它的更多信息,只需查找一部教程,网上有很多),在头里填满了数据,而且不能移用:这意味着镜像的高位总是塞满垃圾,除非采用不同于PE的格式。这也是我决定用.com文件的理由,它用ASM开发,手工修改的。
?即使你创建了一个.com文件,在开头必须写一些代码,这样镜像在开头就有一些字节。但这不是一个大问题,因为他们会在左上角变成小点(后面我们将让他们变得不那么显著)
?要使我们的数据越灵活地隐藏,就越要使用更低级的语言。即是,我们可以用C来写程序,然后也当作图像来处理。但是如果用ASM,这一工作将变得更加简单。
?勿庸置疑,字节和灰度颜色之间有一个匹配:即,0x00是黑色,0xff是白色;一个无条件跳转(0xEB)将相当亮,条件跳转(0x74,0x75)要暗点。跳转得越远,偏移量就越亮,但是记住,如果跳转偏移量是单的,那么近的负跳转会比远的正跳转变得更亮;等等…不要扯你的头发,有趣的部分才开始呢:)
所以,我们想写一个程序,同时创建一幅有意义的图像。我将要讨论的方法不是正式的,也不是官方的,只是我在一些例子中采用了:如果你找到了更好的方法请告诉我,我很愿意把它写在这儿。好了,让我们开始吧。
我们首先要做的是创建一个ASM程序,里面有很多空间:我原以为少许的象素分布在一个巨大的空间中不是很显著,特别是在他们中间插入一幅真实的图像后。因此,我们需要一些非常简单的ASM代码在屏幕上打印一串字符。
mov ah, 09h
mov dx, offset id_msg
int 21h
ret
id_msg db "Hello world",13,10,"$"
修改成这样:
mov ah, 09h
jmp lbl00
db 1323 dup 0ffh
lbl00:
mov dx, offset id_msg
jmp lbl01
db 1323 dup 0ffh
lbl01:
int 21h
jmp lbl02
db 1323 dup 0ffh
lbl02:
ret
id_msg db "Hello world",13,10,"$"
我做了些什么?嗯,我只是在命令行之间插入了一些空间。为什么用1323呢?这一空间的数值恰好是4000字节长,同时既然我们要在图形编辑器内打开它,大小很重要:)为什么是0xFF而不是零呢?“马蒂,你没有四维地思考问题”:我们在这里考虑的零就是美丽图像里难看的黑点,FF却是图画里的空白色!:)
现在,在Psp里面打开这个文件:4000等于50x80。那就以这个尺寸的原始图像格式打开,采用单色通道(灰度):以这种方式,每一字节会被读作一个象素值。现在我们可以采用不同的方法来隐藏数据。
?在代码象素周围随机地乱画几笔,这样那些数据就不会很容易地察觉:一个实例在http://3564020356.org/tutes/step01.gif (如下图)当然,这只是一个快速的,不那么优美的技巧。当你的幻想用尽之后,可以试试这个:它不会产生一幅图像,只是一堆象素罢了。
![](/images/load.gif)
?试着画一些有意义的图案,保证不要破坏数据:http://3564020356.org/images/exegif.gif (如下图)是我用来隐藏Hello World例子的图案,以前介绍过,尽管没有完成(观察图像底部的一行象素,这是“Hello World”字符串)它非常好地掩饰了可执行文件的存在。
![](/images/load.gif)
?协调技巧:这是比较难的一步,但会产生最大的影响。从一个已完成了的图像开始,调整第一个跳转指令,这样就会进入一个区域,那里连续的代码所表现的颜色和图像的颜色相似。然后,修改第二个跳转指令,以便很好的隐藏后面的代码和第三个跳转指令。依此类推。虽然困难,但令人满意:我利用它创建了Riddle #4的一部分,放在了我的个人主页上,很多代码不可见(虽然我保留了一些代码环绕图像,或多或少都是故意的)
如果你想用这个技术做点试验,我建议你使用旧式的“电视机技巧”,它比随机置乱要难,比协调技巧要易。其主要思想是把“噪声内容”(即代码)放在一个矩形区域,然后把它作为电视机银幕或类似的东西:当然,这不是隐藏数据的真正方法,甚至不是原始的(感谢奥维德)。尽管这个仍然相当简单,在隐藏数据之前必须做点工作:开始前得选幅图画,把噪音置于其中,然后在程序内安排跳转,以便代码所产生得噪音能在选择的区域内。一个有趣的例子(我把它叫做“电视机,一个民族的毒品”)可以在这里找到:http://3564020356.org/pix/misc/silly.gif)(如下图)
![](/images/load.gif)
以下是我怎么实现它的:
?首先,我找到了带有老式电视机的图片,然后把它修改成能够包含白色噪音。
?然后,我决定了一个我能记住的地方放代码:我选择以(50,30)为开始粘贴代码。
?既然必须在一开始就得跳转到(50,30),而且图像分辨率为239X349,由此得到了从文件开始跳转的偏移量为:249*30+50 = 7520(0x1d60)。无条件跳转需要3个字节(一字节给操作码,其余两个给偏移量),因此我知道了此跳转的偏移量必须为 249*30+50-3 = 7517 (0x1d5d)
?可执行文件的源代码在下面(是的,太简单了。你可以弄一个更复杂的)
jmp lbl00
db 7517 dup 0ffh
lbl00:
mov ah, 09h
mov dx, offset id_msg
int 21h
ret
id_msg db "Watch me, you silly
slave!",13,10,"$"
?一旦汇编好.com文件后,只需以原始.raw格式打开图像,用246*任何的分辨率,然后各自粘贴两段代码:前三个象素在开头,其余的从50X30开始。假设有一个滤器来粘贴这些图像,好像他们是简单的层一样,但我选择了安全的做法:)
到此就结束了。啊,我在开你的玩笑,还有一点:这幅图像太大了,当以原始的.com保存时,它不能工作!你必须保留图像的一部分(比如只是银幕,当然总是从左上角开始!),然后保存,得到一个可以执行的程序。好拉,我们可以说得到了一些附加的安全,但是我认为事实上目前为止我所讲述的都是有缺陷的:)
D 这不是win.com
在http://3564020356.org/tutes/malawin_en.htm(malawin.htm是意大利文的页面)你可以找到一个教程,我写于2002年3月。哇,太老了!我指给你是应为我认为它或许是一个好的例子来证明“一切都是字节的范例”是可以实际操作的:在古老的Win98SE win.com下,我创建了一个文件,它既是可执行的Windows程序,又是一幅又意义的图像。以后,我萌发了如何建立版权信息的想法…
如何才能做同样的事呢?简单:打开win.com文件(我的版本是25175字节长),长=101象素,宽=250象素,在空白填充处填上任何你想写的。你可以很容易地的识别出来:一些黑色的条纹(0x00)我是用来写句子“Ceci n’est pas win.com”(译者:法语,这不是win.com)的,还包括一个”+malagritte”签名
这个例子在特殊情况下提出了一些有趣的问题,你可以在空闲时间内想想:
?这是win.com吗?如果能运行那说明它是…尽管被修改过。它就该是win.com,正如你喜爱的被布丁过的应用程序仍是你喜爱的应用程序一样。如果把raw文件以.gif保存,那就采用了图形格式来解释win.com,它包含有比应用程序更多的信息,因为你添加了那些信息。你把它打印出来会发生什么呢?
?你能从这个图形表示的文件里面得到一些有用的信息吗?当然可以:首先,你很容易看见填充空间在哪里;其次,一眼就看出字符串了,因为他们在图像里面呈灰色(win.com里,开头可以找到一些,文件的结尾有很多)
?你可以对其他文件做同样的事情吗?当然可以:正如我以前所写的,PE文件在每一节尾的填充是由零组成(或者在某些时候为自定义字符串:比如试着在C盘里面查找含有”PADDING”的*.exe文件)
所以你可以隐藏所有的数据。当然,在修改一个文件前做个备份,因为一些空间得需校验或被程序使用,同时试验的后果也是不可知的J
致 谢
我必须对在3564020356.org的朋友致意深深的谢意,你们每天给我带来快乐和满意。拥抱我曾经待过的小组内所有的朋友(我始终是,除非他们把我剔除掉)+HCU, RingZer0, RET(这是一个新手,去看看他们的作品吧?__?) 。还要拥抱所有的LOAnians。LOAnians不是一个小组,而是forma mentis是我去年去过的最好的地方。给那些有能力理解这一点的任何朋友“喝彩”。我保证现在就打住!