现在的位置: 首页 > 综合 > 正文

一 切 皆 字 节

2013年06月29日 ⁄ 综合 ⁄ 共 2968字 ⁄ 字号 评论关闭

一 切 皆 字 节

 

作者:+mala

 

你们当中的一些人为了读到这篇文章期待以久;另一方面,许多人却毫不在意。首先,我必须道歉,因为我没有借口――我只是失去了完成并且花数月时间尽力再找到这篇文章的愿望。另外,我希望这篇文章能教会一些你们以前不知道的东西,那么下一次你就可以步入高手的行列中。

 

还有一点: 用图形编辑器布丁一个 exe 文件的想法不是我首创的。我只是几个月前在网上找到它。我实在记不起它的网址但是如果你认识这个想法的原创者,或许你恰巧找到了这个网页,请告诉我,以便我把这个网址加到此教程当中。

 

 

关键词:一切皆字节;可执行图文档;查找文件结构;文件混沌;用Psp打布丁

 

 

     

 

I. 

 

IA一切皆字节

IB  结构和混沌:头 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)如果你选中了“对已知文件类型隐藏扩展名”选项,可能在忽略他们是可执行的情况下就以双击方式运行。其他相反的情况下,给识别扩展名一些限制或许会对我们有用,下面你就能看见。

 

如何保证正确无误地识别一个文件呢?即使在某些情况下不能保证,我们也可以非常幸运地使用一些”文件分析”工具,他们可在WindowsLinux下运行。这些工具可以从 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, leshort2字节(大多数系统),按照高位在前(be-)或低位在前(le-)的机器字节顺序

long,belong,lelong 4字节(大多数系统),按照高位在前(be-)或低位在前(le-)的机器字节顺序

date,bedate,ledate  4字节(大多数系统),按照高位在前(be-)或低位在前(le-)的机器字节顺序,解释为一个Unix 数据

 

? TEST (测试)

 

这是一个与文件内的值做比较的值。如果是数值类型,其值规范为C格式;如果是字符串类型,其值规范为C字符串格式,并且包含有转义字符(如n表示转行)。在测试值中,可以根据它的类型使用一些运算符,例如=,(对数值和字符串同样起作用),&^(ANDNOT只对数值起作用,并且需要一些位bit被置位或清位)。请参阅man帮助获得详细的解释。

抱歉!评论已关闭.