Смекни!
smekni.com

Програма для роботи з файловою системою (стр. 3 из 3)

160Н, що містить 0Е5Н, означає, що файл вилучений. Байт зі зсувом

8ВН і значенням 08Н указує, що вхід каталогу, починаючи зі зсуву

80Н, є міткою тому. В остаточному підсумку, байт зі зсувом 1Е0Н

означає кінець каталогу, з огляду на, що наступні входи каталогу ніколи не використалися й, отже, їхній пошук не потрібно

Корнєвій каталог може мати спеціальний тип входу, що називається міткою тому, ідентифікується типом атрибута 08Н и використається для позначення імені диска. Корнєвій каталог може містити тільки одну мітку тому. Корнєвій каталог може також включати входи, указиває на підкаталоги; такі входи ідентифікуються типом атрибута 10Н і нульовим розміром файлу. Програми обробки підкаталогів повинні здійснює трасування ланцюжків кластерів в FAT.

Два інших особливих типи входів каталогу зустрічаються тільки в підкаталогах. Ці входи містять <імена_файлів>. и.., що означає відповідно поточний каталог і батьківський каталог для поточні. Ці спеціальні входи, називані іноді альтернативними іменами каталогу (directory aliases), використаються для швидкого переміщення в структурі каталогу.

0 1 2 3 4 5 6 7 8 9 A B C D E F

0000 49 4F 20 20 20 20 20 20-53 59 53 27 00 00 00 00 10......SYS'.....

0010 00 00 00 00 00 00 59 53-89 0B 02 00 D1 12 00 00 ......YS....O....

0020 4F 53 44 4F 53 20 20 20-53 59 53 27 00 00 00 00 MSDOS...SYS'....

0030 00 00 00 00 00 00 41 49-52 0A 07 00 C9 43 00 00 ......AIR...IC..

0040 41 4E 53 49 20 20 20 20-53 59 53 20 00 00 00 00 ANSI.....SYS....

0050 00 00 00 00 00 00 41 49-52 0A 18 00 76 07 00 00 ......AIR...V...

0060 58 54 41 4C 4B 20 20 20-45 58 45 20 00 00 00 00 XTALK....EXE....

0070 00 00 00 00 00 00 F7 7D-38 09 23 02 84 0B 01 00 ......W18.......

0080 4C 41 42 45 4C 20 20 20-20 20 20 08 00 00 00 00 LABEL...........

0090 00 00 00 00 00 00 8C 20-2A 09 00 00 00 00 00 00 .........*.D..R.

00A0 4C 4F 54 55 53 20 20 20-20 20 20 10 00 00 00 00 LOTUS...........

00B0 00 00 00 00 00 00 E0 OA-E1 C6 A6 01 00 00 00 00 ......'.a.&.a...

00C0 4C 54 53 4C 4F 41 44 20-43 4F 4D 20 00 00 00 00 LTSLOAD.COM.....

00D0 00 00 00 00 00 00 E0 0A-E1 06 A7 01 A0 27 00 00 ......'.a.......

00E0 4D 43 49 2D 53 46 20 20-58 54 4B 20 00 00 00 00 MCI-SE...XTK....

00F0 00 00 00 00 00 00 46 19-32 0D B1 01 79 04 00 00 .......F.2.1.y..

0100 58 54 41 4C 4B 20 20 20-48 4C 50 20 00 00 00 00 XTALK...HLP.....

0110 00 00 00 00 00 00 C5 6D-73 07 A3 02 AF 88 00 00 ......Ems.#.....

0120 54 58 20 20 20 20 20 20-43 4F 4D 20 00 00 00 00 TX COM....

0130 00 00 00 00 00 00 05 61-65 0C 39 01 E8 20 00 00 .................

0140 43 4F 4D 4D 41 4E 44 20-43 4F 4D 20 00 00 00 00 COMMAND COM .....

0150 00 00 00 00 00 00 41 49-52 0A 27 00 55 3F 00 00 ......AIR.'.UP...

0160 E5 32 33 20 20 20 20 20-45 58 45 20 00 00 00 00 e23 EXE.....

0170 00 00 00 00 00 00 9C B2-85 0B 42 01 80 5F 01 00 ........2..B.....

0180 47 44 20 20 20 20 20 20-44 52 56 20 00 00 00 00 GD.......DRV.....

0190 00 00 00 00 00 00 E0 0A-E1 06 9A 01 5B 08 00 00 .......'a...'....

01A0 4B 42 20 20 20 20 20 20-44 52 56 20 00 00 00 00 KB.......DRV.....

01B0 00 00 00 00 00 00 E0 0A-E1 06 9D 01 60 01 00 00 .......'a...'....

01C0 50 52 20 20 20 20 20 20-44 52 56 20 00 00 00 00 PR.......DRV.....

01D0 00 00 00 00 00 00 E0 0A-E1 06 9E 01 49 01 00 00 .......'a..'.....

01E0 00 F6 F6 F6 F6 F6 F6 F6-F6 F6 F6 F6 F6 F6 F6 F6 .................

01F0 F6 F6 F6 F6 F6 F6 F6 F6-F6 F6 F6 F6 F6 F6 F6 F6 .................

Шестнадцатеричный дамп сектора каталогу обсягом 512 байт

Область файлу

Область файлу містить підкаталоги, даних файлу й нерозподілені кластери. Область розділяється на кластери фіксованого розміру й використання кожного кластера регламентується відповідним входом FAT.


Практична частина

Лістинг модулів програми

Модуль, який блокує запуск COM та EXE файлів

#include <fcntl.h>

#include <io.h>

#include <dos.h>

#include <stdio.h>

#include <string.h>

#include <process.h>

unsigned char buffer[3];

FILE *fd;

int handle;

fail(char *);

void pass(char *);

main(int argc,char *argv[])

{

int n;

if(argc!=3)

{

printf("&bsol;nFailpass Utility v1.0 Email: chingpongin@yahoo.co.in");

printf("&bsol;nEnable/Disable .EXE or .COM execution");

printf("&bsol;nsyntex failpass fail <filename.extension>");

printf("&bsol;n or");

printf("&bsol;n failpass pass <filename.extension>");

exit(2);

}

strupr(argv[1]);

n=strcmp(argv[1],"FAIL");

if(n==0)

{

fail(argv[2]);

exit(2);

}

n=strcmp(argv[1],"PASS");

if(n==0)

{

pass(argv[2]);

exit(2);

}

return 0;

}

fail(char *fname)

{

_chmod(fname,1,FA_ARCH);

fd=fopen(fname,"rb+");

if(fd==NULL)

{

printf("&bsol;nCann't open %s&bsol;n&bsol;n",fname);

exit(2);

}

fseek(fd,0,SEEK_SET);

fread(buffer,2,1,fd);

if(buffer[0]==0xcd)

if(buffer[1]==0x20)

{

fclose(fd);

printf("&bsol;n%s already protected...&bsol;n&bsol;n",fname);

exit(2);

}

fseek(fd,0,SEEK_END);

fwrite(buffer,2,1,fd);

fseek(fd,0,SEEK_SET);

buffer[0]=0xcd; /* don't take any PANGA with this line */

buffer[1]=0x20; /* don't take any PANGA with this line */

fwrite(buffer,2,1,fd);

fclose(fd);

return 0;

}

void pass(char *fname)

{

int xyz;

fd=fopen(fname,"rb+");

if(fd==NULL)

{

fclose(fd);

printf("&bsol;nCannot open file %s&bsol;n&bsol;n",fname);

exit(2);

}

fseek(fd,0,SEEK_SET);

fread(buffer,2,1,fd);

if(buffer[0]!=0xcd)

if(buffer[1]!=0x20)

{

fclose(fd);

printf("&bsol;n%s is NOT protected....&bsol;n&bsol;n",fname);

exit(2);

}

fseek(fd,-2,SEEK_END);

fread(buffer,2,1,fd);

fseek(fd,0,SEEK_SET);

fwrite(buffer,2,1,fd);

fclose(fd);

handle=open(fname,O_RDWR);

chsize(handle,(filelength(handle))-2);

close(handle);

}

Модуль, який пише та читає інформацію напряму в ділянку диску без звертання до FAT системи

include common.mac

text segment use16

assume CS:text, DS:text

org 256

myproc proc

mov AH,09h ;printing function

printf g ;print g

printf g1 ;print g1

;parse the command line...

getf guff ;guff will have the command line

;is the command line empty?

cmp guff[0], 0

je expl

;is the command line starting with ?

cmp guff[0], '?'

je expl

;we are reading the disk

cmp guff[0], '^'

je readdisk

;nothing else but to write...

jmp writedisk

writedisk:

printf g2

waitenter

mov AH, 09h ;writing out

printf g3 ;what are we doing

printf guff ;file name

call disk_write ;write to disk

jmp rc

readdisk:

printf g2

waitenter

call disk_read ;write from disk

jmp rc

expl:

printf gline

jmp rc

rc: ;return

mov AX, 4C00h

int 21h

myproc endp

;====================================================================

;====================================================================

;==================== Procedure: disk_read =======================

;====================================================================

;====================================================================

disk_read proc

mov AH, 02h ;read raw input

mov AL, 1 ;number of sectors

mov CH, 0 ;cylinder

mov CL, 1 ;sector

mov DH, 1 ;head

mov DL, 0 ;disk drive - floppy

lea BX, guff

int 13h ;call BIOS

jnae ocr

;now guff stores file name

mov AH, 02h

mov AL, 1

mov CH, 1

mov CL, 1

mov DH, 0

mov DL, 0

lea BX, file

int 13h ;call BIOS

jnae ocr

;decrypt data

call chiper

;write output to the file saved

mov AH, 3Ch ;create file

mov CX, 0 ;no attributes

lea DX, guff ;name

int 21h ;call DOS

mov handle, AX ;get file handle

mov AH, 40h ;write to file

mov BX, handle ;handle

;get len

mov CX, 0 ;dump CX and SI

mov SI, 0

clen:

cmp file[SI], 0 ;is it zero yet?

je clenf ;this is the len

inc SI ;increase counting

inc CX ;increase counting

jmp clen ;jump back

clenf:

lea DX, file ;file data

int 21h ;call DOS

mov AH, 3Eh ;close file

mov BX, handle ;handle

int 21h ;call DOS

;open file for writing....

mov AH, 09h

printf success

jmp finr

ocr:

mov AH, 09h

printf error

finr: ret

disk_read endp

;====================================================================

;====================================================================

;====================================================================

;====================================================================

;==================== Procedure: disk_write ======================

;====================================================================

;====================================================================

disk_write proc

;write file name

mov AH, 03h ;write raw output

mov AL, 1 ;write 1 sector

mov CH, 0 ;cylinder zero

mov CL, 1 ;sector no 1

mov DH, 1 ;head 1

mov DL, 0 ;disk drive A:

lea BX, guff ;set buffer

int 13h ;call BIOS

;read file...

mov AH, 3Dh ;open file

mov AL, 2 ;read-write

lea DX, guff ;file name

int 21h ;call DOS

mov handle, AX ;get handle

mov AH, 3Fh ;reading file

mov BX, handle ;set handle

mov CX, 1024 ;reading

lea DX, file ;buffer

int 21h ;call DOS

;encrypt data

call chiper

;looping through each

mov AH, 03h

mov AL, 1

mov CH, 1

mov CL, 1

mov DH, 0

mov DL, 0

lea BX, file

int 13h

;show message

jnb okw

occ:

mov AH, 09h

printf error

jmp fin

okw:

mov AH, 09h

printf success

fin: ret ;return backwards

disk_write endp

;====================================================================

;====================================================================

;====================================================================

;====================================================================

;==================== Procedure: chiper ==========================

;====================================================================

;====================================================================

chiper proc

mov SI, 0

;xor values

chipe:

cmp file[SI], 0

je chipf ;jump if zero...

xor file[SI], 3

inc SI ;increase counter

jmp chipe

chipf:

ret ;return

chiper endp

;====================================================================

;====================================================================

g db 'Welcome to Disk Encryptor 1.1...', 10, 13, 'This program allows you to save encrypted data onto the disk....', 10, 13, 'Features: Data Chipering, Maximum of 1024 bytes of raw data', 10, 13,'Software Written in Assembler', 10, 13, '$'

gline db 10, 13, '? - help', 10, 13, '^ - reads a file from the floppy', 10, 13, '[Filename] - Saves the file onto a floppy', 10, 13, '$'

g1 db 'Copyright (C) Daniel Moisyeyev 2002. All Rights Reserved.', 10, 13, 10, 13, '$'

g2 db 10, 13, 'Please insert a floppy and press any key...', 10, 13, '$'

g3 db 10, 13, 'About to write $'

error db 10, 13, 'Error occured$'

success db 10, 13, 'Operation Completed$'

num db 4 dup(0), '$'

guff db 15 dup(0)

;file storage

handle dw 0

file db 1024 dup(0)

text ends

end myproc


Робота з програмою

Розроблена програма являє собою дві утіліти командного рядку. Перша дозволяє блокувати запуск виконавчіх файлів COM та EXE:

failpass fail <filename.extension>

failpass pass <filename.extension>

друга – тестує роботу з ділянкою диску в обхід FAT системи

Please insert a floppy and press any key...

About to write

Operation Completed


Висновки

Наприкінці роботи відмітимо лише, що доступ до блокових пристроїв здійснюється по секторах. Ядро MS-DOS за допомогою драйвера пристрою розглядає блоковий пристрій як логічний кінцевий масив секторів і припускає, що цей масив містить припустиму в MS-DOS файлову організацію.

Драйвер пристрою, у свою чергу, перетворить запит MS-DOS на логічний сектор у фізичну адресу блокового пристрою. Первісна файлова система MS DOS записана за допомогою програми MS-DOS FORMAT (див. теоретичну частину роботи).


Література

1. Нейбауэр А. Моя первая программа на С/С++. П., 1995. 368 С.

2. Бруно Бабэ. Просто и ясно о Borland C++. М., 1996. 400 С.

3. ObjectWindows для C++. К., 1993., 208 С.

4. Н. Барканати. Программирование игр для Windows на Borland C++. М., 1994.