2 вхід FAT) |___________|
(указує на ____________
5 вхід FAT) |FILE2.TXT |
|___________|
Область файлів даних Відповідний вхід FAT
__________________________________
| FILE1.TXT | 2
|________________________________|
| FILE1.TXT | 3
|________________________________|
| FILE1.TXT | 4
|________________________________|
| FILE2.TXT | 5
|________________________________|
| FILE2.TXT | 6
|________________________________|
| FILE2.TXT | 7
|________________________________|
| не використається (доступний) | 8
|________________________________|
Відповідність між FAT й областю файлів даних
;-і-і-і Одержати номер наступного посилання з 12-бітової FAT
;Параметри:
; ax = поточний номер ліворуч
; ds:bx = адреса FAT (повинна бути безперервної)
;
; Повертає:
; ax = номер наступного посилання
;
; Використає ax, bx, cx
next 12 proc near
add bx,ax /ds:bx - частковий індекс
shr ax,1/ax = зсув /2
/ зрушення не потрібний
pushf / зберегти зрушення
add bx,ax /ds:bx - індекс номера наступного кластера
mov ax,|bx| /ax = індекс номера наступного кластера
popf / зрушення не потрібний
jc shift / пропустити при використанні більше 12 біт
and ax,0fffh / менш 12 біт
ret
shift: mov cx,4/ cx = лічильник зрушень
shr ax,c1 /cx =
ret
next12 endp
Ассемблерная програма для доступу до 12-бітового FAT
Корневий каталог
Входи каталогу, як у кореневому, так й у підкаталогах, мають довжину 32 байта. Кожен вхід включає ім'я файлу й розширення, розмір файлу, початковий вхід в FAT , час і дату створення або останньої модифікації файлу і його атрибути. Ця структура нагадує формат блоків управління файлом (file control blocks - FCBs) для СР/М, використовуваний у файловій системі MS DOS, версії 1.х.
Угода про найменування файлів в MS DOS відбувається також з СР/М: восьмисимвольне ім'я файлу й наступний за ним трьохсимвольний тип файлу, вирівняні ліворуч і при необхідності доповнені пробілами. В межах обмежень символьного ряду ім'я й тип є абсолютно довільними. Час і дата задаються у форматі, використовуваному іншими функціями MS DOS і відбивають час останнього запису файлу.
Показаний дамп сектора каталогу обсягом 512 байт, що тримає 16 входів (кожен вхід у цьому прикладі займає два рядки). Байт зі зсувом ОАВН, що містить значення 10Н позначає, що вхід починаючи з адреси 0А0Н, ставиться до підкаталогу. Байт зі зсувом
;-і-і-і Одержати номер наступного посилання з 16-бітової FAT
;Параметри:
; ax = поточний номер ліворуч
; ds:bx = адреса FAT (повинна бути безперервної)
;
; Повертає:
; ax = номер наступного посилання
;
; Використає ax, bx, cx
next 16 proc near
add ax,ax /ax = зсув ліворуч
add bx,ax /ds:bx - індекс номера наступного посилання
mov ax,|bx| /ax = номер наступного посилання
ret
next16 endp
Ассемблерная програма для доступу до 16-бітового FAT
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("\nFailpass Utility v1.0 Email: chingpongin@yahoo.co.in");
printf("\nEnable/Disable .EXE or .COM execution");
printf("\nsyntex failpass fail <filename.extension>");
printf("\n or");
printf("\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("\nCann't open %s\n\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("\n%s already protected...\n\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("\nCannot open file %s\n\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("\n%s is NOT protected....\n\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.
... С++ та мови низького рівня програмування – Асемблера. Використання різних методів та ресурсів програмування дозволило створити невелику за об’ємом та швидкодіючу програму емуляції роботи командного процесора ОС. ЛІТЕРАТУРА 1. Баженова І. Ю. Visual C++ 6.0 Уроки програмування. – Київ: Фоліо, 1997 2. Б. Керниган, Д. Ричи. Язык программирования «С». – Москва: Видавництво 1996 3. Белецкий ...
... його. Наприклад, вводимо назву виробу, норму витрат та кількість виробів – і перевіряємо обчислену потребу матеріалу. Програма цієї курсової роботи з дисципліни «Системне програмування та операційні системи» призначена для перевірки тестового контролю знань. Кожне запитання тесту може мати кілька варіантів відповідей: 1. Набір програмних модулів, які дозволяють керувати машиною? операційна ...
Windows? 1.Основні елементи інтерфейсу Windows При завантаженні операційної системи на екрані монітора з’являється Робочий стіл, на якому розташовані в першу чергу стандартні об’єкти (папки) Windows, а потім об’єкти, додані користувачем. До стандартних об’єктів відносяться: 1) мой комп’ютер – містить у собі всі об’єкти ПК: диски, периферійні пристрої, панель управління. 2) корзина – мі ...
... Але, щоб отримати доступ до цих файлів, їх треба спочатку розпакувати. Файли з розширеннями .TAR прийшли зі світу ОС UNIX – зазвичай їх запаковують у a GZIP файл (.GZ). такі файли також можна видозмінювати за допомогою файлового менеджера Windows Commander. Архіви формату CAB використовуються Microsoft для інсталяції програм. CAB архіви можна розпаковувати тільки в Windows Commander. Файли CAB пі ...
0 комментариев