一 切 皆 字 节

一 切 皆 字 节

 

作者:+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帮助获得详细的解释。

 

? MESSAGE(消息)

 

如果测试成功则会输出消息。当这串字符含有printf格式规范(比如"%s")时,来自文件的值会以这种格式输出。

 

下面是在研究magic文件后所需注意的几点:

?首先,事实上存在一些信息告诉计算机它正在处理一个怎样的文件:拥有特定值和在文件中的特定地址的数据本身。他们能够识别文件类型,同时让你 获得许多其他信息(看看所有的">>"项目)

?在大多数情况下,标识字节在文件的开头,但有的时候重要的信息不一定在文件头部。如果这一事实对ZIP文件来说不是事实的话,那么我们就不会对ZIP文件产生如此大的兴趣。

 

B. 关于Zip文件

 

ZIP文件把打包文件信息保存在压缩文档最后的字节当中:这意味着可以把你想加的东西填充到他们的开头,或是在开头做点小小的修改。Windows下的WinzipLinux下的unzip仍能解开他们,不会遇到任何困难。但是,FILE工具不再识别他们了:在magic中的这一行

 

0   string   PK/003/04    Zip archive data

 

意味着FILE只检验头四个字节,如果把他们改成比如"ZZ"FILE不再识别zip文件,其他程序却有可能打开它。

 

总之,这不会造成很大的限制:FILE提供间接偏移量,在改变原文件的同时,可以让FILE从任何地方开始查看偏移量,而不是从文件开头。当然,我把这个任务留给读者J

 

C.     关于图像格式

 

正如你所看到的,ZIP工具不在乎压缩文档开头所填塞的一切。另一方面,一些图像格式不介意他们尾巴所加的东西:因为在图像文件的头部,图像的宽度和高度已经指定,所以一切超出的字节都将被忽略。.gif.jpg图像都符合上述情况。同ZIP文件特性相结合,我们可以把JPGZIP文件添加到一个文件中(图像文件在前,压缩文档在后)。在Windows下,打开第一个或第二个文件仅更改一下扩展名!

 

D.       倾印(Dumping

 

假如想研究一个文件,应该准备一个工具,它能打开这个文件并且以原始格式倾印在屏幕上。一个16进制编辑器是实现这一目的的好工具,如果能够提供从16进制到ASCII码转换那会更好。最好的是像HiewBiew这样的工具,它可以反汇编所打开的文件。另外一个强大的工具是Vermon Buerglist.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进制编辑器,像HiewBiew,或是我老式的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分辨率打开此图像,它的坐标是(1521)。如果已知字节在文件内的偏移量,仅把偏移量除上宽度,把除的商作为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。那就以这个尺寸的原始图像格式打开,采用单色通道(灰度):以这种方式,每一字节会被读作一个象素值。现在我们可以采用不同的方法来隐藏数据。

?在代码象素周围随机地乱画几笔,这样那些数据就不会很容易地察觉:一个实例在https://i-blog.csdnimg.cn/blog_migrate/39491a815c62134f3ea1f8adc7b7cb57.gif (如下图)当然,这只是一个快速的,不那么优美的技巧。当你的幻想用尽之后,可以试试这个:它不会产生一幅图像,只是一堆象素罢了。

 

center 

 

?试着画一些有意义的图案,保证不要破坏数据:https://i-blog.csdnimg.cn/blog_migrate/36bc1643a689bbaba0ebb219b1dfe334.gif (如下图)是我用来隐藏Hello World例子的图案,以前介绍过,尽管没有完成(观察图像底部的一行象素,这是“Hello World”字符串)它非常好地掩饰了可执行文件的存在。

 

 

 

?协调技巧:这是比较难的一步,但会产生最大的影响。从一个已完成了的图像开始,调整第一个跳转指令,这样就会进入一个区域,那里连续的代码所表现的颜色和图像的颜色相似。然后,修改第二个跳转指令,以便很好的隐藏后面的代码和第三个跳转指令。依此类推。虽然困难,但令人满意:我利用它创建了Riddle #4的一部分,放在了我的个人主页上,很多代码不可见(虽然我保留了一些代码环绕图像,或多或少都是故意的)

 

如果你想用这个技术做点试验,我建议你使用旧式的“电视机技巧”,它比随机置乱要难,比协调技巧要易。其主要思想是把“噪声内容”(即代码)放在一个矩形区域,然后把它作为电视机银幕或类似的东西:当然,这不是隐藏数据的真正方法,甚至不是原始的(感谢奥维德)。尽管这个仍然相当简单,在隐藏数据之前必须做点工作:开始前得选幅图画,把噪音置于其中,然后在程序内安排跳转,以便代码所产生得噪音能在选择的区域内。一个有趣的例子(我把它叫做“电视机,一个民族的毒品”)可以在这里找到:https://i-blog.csdnimg.cn/blog_migrate/246b1314cde5dd2072a0bea8ea056144.gif)(如下图)

 

 

 

 

以下是我怎么实现它的:

 

?首先,我找到了带有老式电视机的图片,然后把它修改成能够包含白色噪音。

?然后,我决定了一个我能记住的地方放代码:我选择以(50,30)为开始粘贴代码。

?既然必须在一开始就得跳转到(50,30),而且图像分辨率为239X349,由此得到了从文件开始跳转的偏移量为:249*30+50 = 75200x1d60)。无条件跳转需要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.htmmalawin.htm是意大利文的页面)你可以找到一个教程,我写于20023月。哇,太老了!我指给你是应为我认为它或许是一个好的例子来证明“一切都是字节的范例”是可以实际操作的:在古老的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(这是一个新手,去看看他们的作品吧?__? 。还要拥抱所有的LOAniansLOAnians不是一个小组,而是forma mentis是我去年去过的最好的地方。给那些有能力理解这一点的任何朋友“喝彩”。我保证现在就打住!

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值