Nota per il lettore: questo post è stato recuperato da un backup polveroso ed è una traccia di un “me” di svariati anni fa…
Nel lontano 2003 mi capitò tra le mani un file che cambiò radicalmente il mio modo di intendere la programmazione e il reversing. Più che una serie di tecniche, enunciava una forma mentis. Quel “tute” di +mala è stato importante per la mia formazione e consiglio vivamente a chiunque si ritenga un informatico vero di leggerlo nella sua forma originale. Le idee trasmessemi da quelle righe hanno trovato riscontro in tanti dei miei lavori, alcuni anche totalmente scollegati dagli esempi in esse presentati. Ecco dunque, come mio tributo e ringraziamento personale a +mala, ripubblico quelle righe, ormai praticamente introvabili su internet.
Update: ne ho ritrovato una versione leggermente diversa qui, in PDF. La versione originale invece è disponibile qui.
Author: +mala
Title: Everything Is Byte
Submitted: April 28, 2003
Everything Is Byte
by +mala
- INTRO
- Foreword
- Everything Is Byte
- Structure And Chaos: Headers Vs. Extensions
- FINDING STRUCTURE IN A FILE
- The FILE Command
- About Zip Files
- About Image Formats
- Dumping
- Zeroes
- PLAYING WITH CHAOS
- Some basics
- Patching With Psp
- Executable Images
- Ceci n'est pas win.com
- ACKNOWLEDGEMENTS
============================================================================
INTRO
----------------------------------------------------------------------------
Foreword
Some of you have waited much, much time to read this file; many, on the
other side, just didn't mind. For the first ones, I must apologize and say
that I have no excuses - I just lost my will to finish this file and spent
months while trying to find it again. For the others, I hope that this text
will teach you something you didn't know and that maybe you will be with the
first ones next time.
One more thing: the idea of patching an exe with an image editor is NOT
mine. I just found it on the web some months ago and I really don't remember
the address... but I wanted you to know that someone else had the original
idea. If you happen to find that page, let me know and I will add that
address to this tute.
----------------------------------------------------------------------------
Everything Is Byte
Everything is byte. Of course, this won't sound SO strange to most of you:
after all, everything which resides on a computer's hd, whether it is a
sound, a movie or this plain text file, must be first converted to binary
format. This takes us to some less obvious considerations: if everything
shares the same format, why do I run some files while I play others? Can I
read an executable? Can I listen to an image? The answers are, respectively:
because there is something which tells the system what to do; of course you
can; of course you can... have you ever tried to write, at the linux prompt,
cat /usr/bin/netscape >/dev/dsp ? :)
----------------------------------------------------------------------------
Structure And Chaos: Headers Vs. Extensions
Now, what makes the OS understand what kind of file it is dealing with?
Well, there are different ways: the most buggy one, for instance, is just
looking at the file extension; a better one, instead, is giving a look at
the file header or at a particular sequence of bytes which (almost always)
exactly identifies the file type. Guessing which one is used by Windows is
left as an exercise to the reader ;)
Just look at this example: on your windows disk (if you have one), find all
the files that have ".jar" extension; then, copy one of them in another
place and rename it as ".zip". Now double click on it and - voila' - it
opens correctly as a ZIP file!
Then, copy a file called c:\windows\system\shdoclc.dll in another place and
rename it as shdoclc.html... heh... if you double click it (I cannot assure
it won't damage your system O:-) some strange things will happen!
Why? What happened?
In the first case, JAR files are nothing more than ZIP files with another
extension: so, since Windoze recognizes files according to their extensions,
it's not able to open it unless you change its filename in whatever.zip. In
the second case, shdoclc.dll contains some html code to generate different
pages, but is NOT an HTML document: it's an executable, so if you open it as
a .html you will see some strange codes... and a strange browser behavior,
since it's parsing the content of different html pages all pasted together.
As you may understand, this method is quite buggy, because it doesn't let
you really understand what you're working with. The worst case happens when
some viruses copy themselves by mail as an attachment with a double
extension (such as .txt.com or .mp3.pif): if you've left the "hide extension
for know filetypes" option active, you might not notice they're executables
and run them with a double click. In other cases, instead, this limitation
in extension recognition may be useful for us, as you'll see later.
What can you do to be sure you're correctly identifying a file? Even if in
some cases you CAN'T be sure, you can have better chances by using some
tools called "file analyzers", running both under Windoze and Linux. The
first ones can be downloaded from the "utils" section at
http://www.programmerstools.org/
while under Linux you have the great FILE command, which will be described
in detail in the next section.
============================================================================
FINDING STRUCTURE IN A FILE
----------------------------------------------------------------------------
The FILE Command
"file" (yes, the right command name is all lowercase!) is a great unix file
analyzer which, instead of just looking at name extensions, does various
tests on filesystem, file data and (if data is text) language. The "data"
test is the most interesting for us: during this test, FILE searches for
particular data sequences (called "magic numbers") inside the files to
understand their type. Even if it isn't perfect, it's still a very good tool
and because of its structure it's the best one if you want to learn how file
recognition works. If you type "man file", but still better "man magic", you
will easily learn to look inside the configuration file (called "magic") and
understand file types even without using any program!
Magic file format (under my Debian it's located in /usr/share/misc/magic,
but you can even find it online searching google for "/usr/share/misc/magic"
AND "177ELF") is quite easy: every line is made up of the following fields
- OFFSET
This is a number specifying the offset, in bytes, of the data which is to
be tested inside the file. It can be preceded by one or more ">", which
indicate the level of the test: if there are no ">" the test is level 0
and only if it succeeds tests of level 1 (one ">") are evaluated, followed
by level 2 tests (">>") and so on.
In a test whose level is higher than 1 you can also find the character "&"
before the offset: this means you don'thave to consider the offset as
absolute, but as relative to the offset of the preceding higher level
test.
Here's a little example: if you give a look at ELF section inside magic
file, you'll be presented with the following
0 string 177ELF ELF
>4 byte 0 invalid class
>4 byte 1 32-bit
...
NOTE: 177 is the value of a byte IN OCTAL (0x7F, 127 dec).
This means: if the file starts with byte 0x7F, followed by the string
"ELF", then it's an ELF file; then, if at offset 4 it has a byte whose
value is 1, then it's a 32-bit ELF, while if it's 0 it's an invalid class
ELF file.
- TYPE
From the previous example you have seen how the TYPE field is used yet: it
just contains the type of the data to be tested. The possible values are
byte: a one-byte value
string: a string of bytes
short, beshort, leshort: a two-byte value (on most systems) in this
machine's native byte order, in big-endian order
(be-) ora in little-endian order (le-)
long, belong, lelong: a four-byte value (on most systems) in this
machine's native byte order, in big-endian order
(be-) ora in little-endian order (le-)
date, bedate, ledate: a four-byte value (on most systems) in this
machine's native byte order, in big-endian order
(be-) ora in little-endian order (le-), which is
interpreted as a UNIX date
- TEST
This is the value to be compared with the value from the file. If the type
is numeric, the value is specified in C form; if it's a string, it is
specified as a C string with the usual escapes permitted (such as n for
new line). On the test value, depending on its type, you can apply some
operators, such as =, <, > (which work for numbers and strings), & and ^
(AND and NOT, which work only with numbers and require some bits to be set
or not). Give a look at the man page for a more detailed explaination.
- MESSAGE
This is the message to be printed if the test succeeds. If the string
contains a printf format specification (such as "%s"), the value from the
file is printed using the message as the format string.
Here are just some of the things that you could notice after reading the
magic file:
- first of all, there is in fact something that lets your computer know
what file it's dealing with: data themselves, with particular values and
in particular positions inside the file, can identify the file type and
let you discover many other info (just see all that ">>" stuff).
- in most of the cases, the identifying bytes are at the beginning of the
file, but sometimes important information is NOT necessarily in the
header. And that would not be so interesting if it wasn't real for ZIP
files too...
----------------------------------------------------------------------------
About Zip Files
The most interesting detail about ZIP files is that they keep information
about their packed files in the LAST bytes of the zipped archive: this means
that you can add whatever you want or make slight changes at their beginning
and many programs, such as Winzip under Windoze or unzip under linux, will
open them without any problems. Note that FILE utility, instead, will not
recognize them anymore: the line
0 string PK 03 04 Zip archive data
inside magic means that it just checks for the first four bytes, which means
that if you change them with, for instance, "ZZ", FILE won't recognize the
zip anymore, while other programs will be able to open it anyway.
After all, this is not a great limit: FILE also gives you the chance to use
indirect offsets, which could help in tasks of this kind... and it's always
possible to change the sources, so that you can make it recognize offsets
starting from wherever you wish and not just from the beginning of the file.
This, of course, is left as an exercise to the reader... :-)
----------------------------------------------------------------------------
About Image Formats
As you've seen, ZIP utils don't mind if you append anything at the beginning
of their files. On the other side, there are some image formats which don't
mind if you append something at their end: this is because, inside their
header, image width and height are specified, so all the exceeding bytes are
ignored. This works, for instance, for .gif and .jpg images... and joined
with ZIP's property this means that you can append a JPG and a ZIP together
(the image first, the archive last) and, under Windoze, open the first or
the second one just by changing the file extension!
----------------------------------------------------------------------------
Dumping
If you want to study a file, you should have a tool which lets you open it
and dump its contents on the screen in a raw format. A hex editor is a good
tool for this purpose, better if it lets you change the visualization mode
from hex to ascii, best if -like Hiew and Biew- it also lets you disassemble
the files you open. Another great tool is list.com by Vernon Buerg, which
lets you open BIG files of any kind, dump them in ascii or hex, search very
fastly for strings and so on, all working in a DOS box in less than 30KB
(don't search for the latest, "bloated", win9x versions: I've recently
upgraded to v9.6d but v9.0h is still ok for my purposes).
I usually copy list.com in c:\windows\command directory, then run regedit
and create the following register key:
HKEY_CLASSES_ROOT\*\shellOpen\Open with List\command
with the value:
"c:windows\command\list.com %1"
This allows me to open any unknown-type file with List just by double
clicking it, and any other file clicking with the right mouse button and
choosing "Open with List".
Once you've found a file dumper which suits your needs, learn to use it and
USE it... a lot! After a while you will notice that many patterns occur in
files of the same kind and you will be able to easily recognize them. Also,
you will learn a lot of interesting, useful things. For instance:
- many viruses put their name or some particular bytes at the beginning of
the file they infect, so opening executables with a dumper will let you
not only avoid being infected by viruses, but also understand which one
is trying to hit you. And, since many trojan viruses are around in these
days, dumping your attachments before opening them is often a good idea.
- did you know that CuteFTP saves your password in clear inside its
macros? Well, I know that you can open CuteFTP macro files with ANY text
viewer, but this example is just to show you that you should try to open
ANY file you find on your hard disk :) So, if you have just forgotten
a password you've saved in CuteFTP "FTP site manager" you just have to
start recording a macro, connect to the site you wish and then save the
macro... you'll end up with a text file like this:
Host 123.123.123.123
RemoteDir /home/httpd/mywebsite
LocalDir D:mywebsite
Retry 20
Login Normal
User myusername
Pass mypassword
Connect
- if you're so unlucky you REALLY have to use M$ Word (in most of the
cases you don't REALLY have to do it, and if you do you're just stupid,
not unlucky ;) start opening your .doc files: it's really amazing how
much unuseful stuff is stored inside them. If you happened to enable the
"quick save my documents" option, you probably have some of them pasted
inside the files of some others, or your errors together with your
corrections. One example? Here it is!
1) Open M$ Word (this experiment has been made with Word97)
2) Be sure that "quick saving" is activated (it's the Save tab inside
the Options window).
3) Create a new document and write:
"Dear boss,
you really stink."
4) Now save your document with whichever name you like most (I've used
example.doc).
5) Now change the text so that it reads:
"Dear boss,
you're really a great man."
(don't worry, if you don't feel you're able to write this you can
change the text as you wish ;)
6) Save again the document and close Word.
7) Open the file with your dumper and think what could happen if your
boss receives it :)
Also, the file has grown drastically... but I don't think I will spend
more time on this subject, I'll rather let you discover all the details
alone, leaving you just one suggestion: when your M$ Word crashes (I'm
sure it will do), making you lose all your last changes, try to open the
~backup files it has left on your hd with a dumper and recover most of
the text with a cut'n'paste.
----------------------------------------------------------------------------
Zeroes
As you may have learned while looking at the files which reside on your hd,
every format has some values which occur in particular places, or more
frequently than others. The reason why I've called this section Zeroes is
because they're often zeroes... but not always!
For example, text files may have a CR (or CR+LF) about every 80 characters:
the line size isn't always the same, but you can suppose you will find some
regularity - and in some cases this may let you understand that a file
contains text even if it's encrypted (just give a look at a .box Calypso
mailbox file and you will understand what I mean). For this kind of tasks, a
good knowledge of the ASCII table may be helpful too... but you'll probably
read something about it later.
If you happen to study executables or other binary files, instead, you will
find that zeroes are widely used: not just as string terminators, but also
as padding at the end of PE sections. If you don't understand this, just
think that if you have long sequences of identical values they may probably
be zeroes. Open, for instance, c:\windows\system\systray.exe and see how
many padding zeroes are there: I wonder if any virus writer has ever thought
of infecting it... it has SO much space to use and it's always loaded at
startup O:-)
Well, I'm sorry I cannot find a similar example under linux... try to
biew /usr/bin/vim and see what happens, but I'm afraid you won't find
a PE file ;)
============================================================================
PLAYING WITH CHAOS
----------------------------------------------------------------------------
Some Basics
Fine. Now you know that files are just a bunch of bytes (wow, what a good
piece of news!) and the software just understands them the way it wants.
Some systems use extensions to recognize file types, others use particular
sequences of bytes, but the most interesting things happen when you try to
open a file with a software which is not designed to handle it :)
Just one last thing, and I'll stop boring you... If you use applications
able to handle files in RAW format (which, in fact, is a non-format), you
can read them as text files (as you have seen with list), images, sounds,
whatever you want them to be.
----------------------------------------------------------------------------
Patching With Psp
Ever cracked a program? Well, don't be shy... it happens sometimes :) Even
if you are one of the lamest ones, and all you've done was running a crack
patch, I hope you've AT LEAST understood what you were doing: you know, the
program is a sequence of bytes (just to change, I'd say) and by modifying it
for even only one byte you can make it do completely different things, such
as telling you are a registered user even if you've inserted the wrong reg
code.
Of course, the operation of patching a program can be done for many other
purposes, like correcting errors or adding new functions to close software
which comes compiled and without sources. Usually, to accomplish this task
you can use Hex Editors like Hiew and Biew or tools like my old hexpatcher
(which is available in my tools section). This time, we will do that using
Paint Shop Pro: anywyay, PsP is only ONE of the programs you can use - you
just need an image editing tool that lets you open images in RAW format.
In this example, we will try to patch a little program, Cruehead's CrackMe
v1.0, available at http://3564020356/tutes/crackme.zip. This little Windoze
app does exactly nothing: it just stays there waiting to be cracked... and
since it has a really easy protection, I won't spend much time on it. Just
know that there's a regcode check and then a jump that either sends you to
the "good guy" piece of code or shows you the "bad guy" message box. For
those who wish to experiment with SoftICE, just bpx on messageboxa and when
the debugger pops up return from the call you're in: the check and the jumps
are just a few lines above the place where you are, at address 401243.
Now, we know from softice that at 401243 in memory there's a jz (0x74) that
we want to change with a jmp (0xEB): where can we find it inside the file
which is saved on your disk?
There are different ways to do it, depending on which tools you have (of
course, we suppose you don't have a hex editor):
- if you have a disassembler or any other program which shows you data about
sections, you can read RVA and Offset and calculate the right offset
inside the file:
Offset in file = (Address) - (Imagebase) - (RVA) + (Offset of section)
For instance, in this case we have these data about CODE section:
Object01: CODE
RVA: 00001000
Offset: 00000600
Size: 00000600
Flags: 6000020
And the Imagebase is 00400000. So, the right offset of instruction at
401243 is
401243-401000+600 = 843 (HEX, of course)
- if you have neither a disassembler nor a PE viewer, you might try with
LIST (I did tell you it was useful!). Just open the executable with it,
press ALT+H to view the data as HEX + dump, then hit backslash to search
within the dump: just enter "c3 74 07" and BANG! You hit it at the first
shot! As you can see, the "74" byte is at 0x843.
- if you don't have either a disassembler, a PE viewer, or LIST... well,
you might try to use PSP itself :)
WARNING: this is not easy and it might even become not funny too, if you
have to search much data or a very common sequence of bytes. But in this
case, fortunately, it's not so hard and you'll also have the chance to
find the place where you have to patch inside the image... so I'll show
you that technique in just a few lines.
If now you're asking yourselves HOW, in practice, you can use an image
editing tool to work on data instead of images, let me explain...
If you want to open a file, preserving its binary information, you have to
open it as RAW: i don't know how it's called inside other applications, but
all you have to see is a greyscale image, where every pixel matches one byte
inside the file you've just opened. Also, since the size of this image is
not specified inside the file (_ALL_ the bytes are pixels), you will have
to choose a size yourself. A good size to choose is 100 (or 1000, if the
file is huge) for width and, for height, anything which multiplied by width
gives you the size of the file (or something bigger, we don't mind adding
zeroes at the end). In our example, since the size is 12288 bytes, we'll
choose width=100 and height=130.
If you want to read what value is one byte (that is, one pixel), just put
your "dropper" or "color picker" tool above that pixel and click. If,
instead, you want to change one byte, just choose a size 1 brush (or pencil
or whatever, I think everything should be identical at size 1), the color
you want and click on the pixel/byte you want to change.
If you want to search for a sequence of bytes... well, I still don't know
if it's possible (probably with GIMP, but definitely not with PSP). The
technique I've learned is the following:
- open the file as RAW and increase its color depth to 16 million colors
- use color replacer to replace one byte (let's say "74") with a bright
color (let's say a red or a green: since the original image was greyscale,
anyway, almost every other color will seem bright). If you're comfortable
with image editing tools you might also choose a size higher than 1 for
your brush, while if you're comfortable with exe manipulations you can
choose to replace colors only in code section, which is quite easy to
individuate at a glance
- now do the same thing with the byte value preceding the one you have
chosen before (using another color, of course). From now on, you can
consider only the sequences of two colored pixels in a row: if you have
more than one, repeat this step.
- At the end, remember to close this version of the file: you don't want
to deal with a 16 million colors image, but with your good old .exe
raw file
NOTE: all the numbers we're dealing with now are hexadecimal, while you'll
probably have to deal with decimal values inside your application, so
learn to convert them quickly or make SoftICE do that for you with
"?" command.
Doing this with crackme.exe will show you the right place in just two steps:
you'll be able to see only two colored pixels in the image, of which the
rightmost one is the one you have to change. Its coordinates, provided you
opened the image with 100x123 resolution, are (15,21).
If you already had the offset of the byte inside the file, you could have
found the right coordinates just by dividing the offset for the width and
keeping the result of the integer division as y, the remainder as x. In
our case:
0x843 = 2115 dec
2115 / 100 = 21 = y
2115 % 100 = 15 = x
Now you have the coordinates, you just have to pick up the color you wish
(0xEB = 235) and "paint" the right pixel to patch your program. Save the
file as raw and you'll have a cracked crackme.exe!
----------------------------------------------------------------------------
Executable Images
Gosh, when I first started to write this tute I had just experimented with
this topic, but now so much time passed and I'm afraid I won't remember all
the things I had found! Anyway, I'll try to explain them by steps and redo
them while I'm writing... I hope it will sound understandable ;)
The first thing that led me to think about an image which was a running app
at the same time was that Psp cracking I was telling you about a few lines
above: we have seen that it's possible to view an executable as an image,
but of course this image is senseless... is it possible to make a "good"
image which is also an executable?
Of course it is, but we have to notice some details before:
- Windows executables have a fixed format (the one I called PE some times
inside this text: to have more info about it, just search for a tutorial,
there are plenty of them around the net) which requires them to have a
header full of data you won't be able to move: this means that the high
part of the image will always be full of junk, unless you use something
different from PE. This is the reason why I decided to work with .com
files, written in ASM and modified by hand
- Even if you create a .com file, it will have to start with some code so
at least a few bytes will have to be present at the beginning of the
image. It's not a big problem, anyway, since they'll just become small
dots in the upper left corner (we'll see how to make them less noticeable
later)
- The more flexibility we want for the data to be hidden, the lowest level
programming language we have to use. That is, we might be able to write a
C program and then fine tune it to work as an image too, but it will be
easier for us if the program is written from scratch in ASM.
- Needless to say (you should have learned it from the Psp patching section
yet, if you've experimented with it) there's a matching between byte
values and greyscale colors: that is, 0x00 will be black while 0xff will
become white; an unconditional jump (0xEB) will be quite bright, while a
conditional one (0x74,0x75) will be darker; the same way, the longer are
your jumps the brighter their offsets will become, but remember that if
the jump offset is signed then a near negative jump will be even brighter
than a far positive one; and so on... Don't start pulling your hair away
from your head, I've just begun with the funny part ;)
So, we want to write a program, AND to create an image with some sense. The
method I'm going to tell you is not formal nor official, it's just the way
I created some examples: if you find a better one tell me and I'll be glad
to publish it here. Now, let's start.
The first thing I did was to create an ASM program which had a lot of empty
space inside it: I thought that few pixels distributed in a huge space would
have been less noticeable, especially after inserting a real image between
them. So, given a VERY easy ASM code to print a string on the screen:
mov ah, 09h
mov dx, offset id_msg
int 21h
ret
id_msg db "Hello world",13,10,"$"
let's change it this way:
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,"$"
What did I do? Well, I've just put some empty spaces between a command and
the following one. Why 1323? It's the number of spaces that will give me a
file which is exactly 4000 byte long, and since we'll have to open it inside
an image editor, size matters ;) Why 0xFFs and not zeroes? "Marty, you are
not thinking quadrimensionally": what we consider zeroes here are ugly black
dots inside our beautiful image, while FFs are empty white spaces inside the
picture! :)
Now, let's open the file inside Psp: 4000 is 50x80, so let's open the .com
as a raw image with this size, using a single color channel (greyscale): in
this way, every byte will be read as a single pixel value. Now we can choose
different approaches to hide our data:
- draw some random noise around the code pixels so that they won't be easily
detectable: as an example, see http://3564020356.org/tutes/step01.gif
Of course, this is just a quick and dirty trick you might use just if you
run out of fantasy: this will NOT generate an image, but just a bunch of
pixels.
- try to draw something with sense, but which will not interfere much with
the data: http://3564020356.org/images/exegif.gif is a writing I've used
to hide the Hello World example you've seen before and, even if not
completely (see the line of pixels at the bottom of the image, it's the
"Hello World" string), it dissimulates the presence of an executable file
quite well.
- fine tune: this is the harder option you can take, but might be the one
with the greatest impact. You should start from a ready-made image and
tune the first jump so that you'll land in a place where your following
code (and the subsequent jump) will have colors which are similar to the
colors of the image. Then, modify the second jump so that the code after
it and the third jump will be hidden well inside the image, and so on.
Hard, but satisfying: I've used it to create a part of Riddle #4 on my
website and a good part of the code is invisible (while I left some other
around the image, more or less intentionally)
If you want to experiment a bit with this technique, I suggest you to use
the good old "television trick", which is a bit harder than random noise
and a bit easier than fine tuning. Its main idea is to put all the "noise
content" (that is the code) in a rectangular area and then use it on a TV
screen or something similar inside the image: of course, this is not a real
way of hiding data and it's not even original (thanx ovid ;), but at least
you have something with sense and having the chance to make a TV say
something intelligent is always nice.
Even if this is still quite easy, you will have some work to do before you
can hide data this way: you'll have to choose a picture before you start,
put noise inside an area and then arrange jumps in your program so that the
noise generated by the code will stay in the choosen area. A funny example
(I've called it "TELEVISION, THE DRUG OF A NATION") can be found here:
http://3564020356.org/pix/misc/silly.gif
Here's how I did it:
- first, I found an image with an old TV and I modified it so that the video
contained white noise
- then, I decided a place to put the code which was easy to remember too: I
chose to start pasting it at (50,30)
- since I had to jump immediately from the beginning of the code to 50,30
and the image resolution was 239x349, I knew that the offset from the
beginning of the file where I had to jump was
249*30+50 = 7520 (0x1d60)
and, since the unconditioned jump itself needed 3 bytes (one for the
opcode, two for the offset), I knew that the offset for the jump just had
to be
249*30+50-3 = 7517 (0x1d5d)
- the source file for the executable, then, was the following (yes, it's SO
EASY! Create a harder one if you can ;)
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,"$"
- once I assembled the .com file, I just had to open it as a .raw image,
with 249*whatever (try a big one, I put 100) resolution, and paste the two
pieces of code: respectively, the three pixels at the beginning, the other
ones starting at 50x30. I suppose there should be a filter to paste the
images in the right way as if they were simple layers, but I chose the
secure way ;)
That's all. Nah, I was pulling your leg, there's more: the image is so big
that, when saved as a raw .com file, it WILL NOT WORK! You have to keep only
a part of the image (for instance, only the screen... ALWAYS starting from
the upper left corner, of course!) and then save it to have a working prog.
Well, we can say we have some added security, but I think the truth is that
there's a bug in everything I've explained until now ;)
----------------------------------------------------------------------------
Ceci n'est pas win.com
At http://3564020356.org/tutes/malawin_en.htm (malawin.htm is the Italian
version of the page) you can find a tutorial I wrote in March, 2002. Wow,
that's old! I am pointing you there because I think it might be a good
example of how the "everything is byte paradigm" can be used in practice:
working on good (?) old Win98SE win.com, I created a file which is both a
working Windoze executable and an image with some sense, then I started to
think about how copyright could work in this case...
How can you do the same? Easy: open your win.com file (the version I have
is 25175 byte long), as a raw file with height=101 pixels and width=250
pixels and write what you like inside the padding space. You can recognize
it quite easily: some black (0x00) stripes where I decided to put the "Ceci
n'est pas win.com" sentence, together with a "+malagritte" signature (for
the most curious ones, the signature itself is a modification of the
original Magritte's one).
This example, in particular, raises some interesting questions you could
think about, if you have spare time:
- is this win.com or not? If you run it, it is... even if it's modified: it
should be win.com as much as your cracked version of your favorite app is
still your favorite app. But if you save your raw file as a .gif you're
using it as a graphical representation of win.com, which carries much more
information than the program itself, 'cause you've added it. And what
happens if you print it?
- can you get some useful information from the graphical representation of
the file? Sure: first of all, you can easily see where padding space is;
also, you can find strings at a glance, because they're just grey stripes
inside the image (inside win.com, you can see some at the beginning and
MANY at the end of the file)
- can you do the same with other files? Sure: as I've written before, PE
files have a padding made up of zeroes (or, sometimes, custom strings: try
to find all the *.exe files which contain "PADDING" on your C: disk, for
instance) at the end of their sections, so you can hide all the data you
wish there. Anyway, make sure you've made a backup copy before you change
a file, because some of that space might be checked or used by the program
and the effects of your experiments are unknown ;)
============================================================================
Acknowledgements
I have to say a big, BIG thank you to all the +friends at 3564020356.org for
the fun and the satisfaction they give me every day: you never stop amazing
me!
A hug goes to all the friends of the groups I've been (and I'll always be,
unless they kick me out ;)) part of: +HCU, RingZer0, RET (people, this one
is new, go and give a look at their stuff ^__^).
Another big hug goes to all the LOAnians: I haven't put LOA between groups
because it's not a group, it's a forma mentis and it's the best (physical or
not) place I've been in the last years.
A "bravo" to anyone who had the strength to reach this point. I promise I'll
stop exactly NOW.
+mala, April 2003