Перекрываем доступ к файлам, делаем файл временно не работающим
Всем привет. Надеюсь, каждый ознакомился с предыдущим моим
примером и во всем разобрался.
Сегодня у нас новая прога. Я тут подумал над тем, что каждый из нас хочет что-нибудь
скрыть от чужого клика (да и глаза тоже :) В связи с чем, просто необходимо
знать, как обеспечить эту самую секьюрность, чтоб никто не проник к твоим сокровенным
данным. Но речь пойдет не о шифровании твоей инфы, а о достаточно простом способе
запрета запуска различных программ.
К примеру, тебя раздражает когда кто-нибудь приходит к тебе и начинает играть
в игрушки на твоем компе, а тебе работать надо :( Или просто хочешь создать
видимость неработоспособности определенной программы, а потом одним щелчком
мыши восстановить ее. То есть фактически программа не скрывается, но перестает
работать. Возобновляется работоспособность исключительно по твоей команде.
Немного теории о структуре EXE-файла
Разберемся со структурой любого EXE-файла, вернее с началом экзещника,
для этого нам понадобится любой шестнадцатеричный редактор, например, Hiew.
С его помощью открой любой exe-файл, например, созданный на Delphi. Ты увидишь,
что он начинается с двух слов "MZ". Слово – это 16 битовое (двухбайтовое)
поле. В шестнадцатеричном формате "MZ" равняется "4D 5A",
а на языке ассемблере это буквально следующее:
dec bp
pop dx
где dec и pop – команды, а bp и dx – регистры.
dec (decrement) – команда вычитает 1 из операнда, в качестве которого используется
регистр-указатель bp.
pop – команда извлекает слово из стека и загружает его в операнд-приемник dx
– регистр общего назначения.
Если ты ничего не понял, не расстраивайся, в принципе, знаний в области ассемблера
нам не понадобится.
Как мы будем запрещать запускать файл?
Весь прикол состоит в следующем, когда ты запускаешь файл, то он поэтапно грузится
в память компа и исполняется. Отсюда вопрос: а что будет если какой-нибудь значимый
байтик подправить? Тогда у нас все (правильная загрузка файла) рухнет, как карточный
домик. Так вот, если первую команду занулить, тогда комп психанет и не станет
воспринимать твой файл за exe-шник. Идея проста до безобразия. Тебе все понятно,
тогда читай дальше.
Перейдем к программированию
1. Открой Delphi и создай новой приложение, сохрани его.
2. Скинь на форму следующие компоненты: два TGroupBox, в первом размести один
TEdit, два TButton и два TLabel, во втором – TShellComboBox и TShellListView
(вкладка Samples в палитре компонентов).
3. Измени у компонентов следующие свойства
Form1.Caption:=’EXE_Pass’;
Label1.Caption:=’Путь:’;
Label2.Caption:=’Status:’;
Edit1.Text:=’C:\’;
Button1.Caption:=’Обзор’;
Button2.Caption:=’[un]block’;
ShellListView1.Root:=’rfMyComputer’;
ShellListView1.ViewStyle:=vsList;
ShellListView1.ShellComboBox:=ShellComboBox1;
GroupBox1.Caption:=’’;
GroupBox2.Caption:=’’;
4. Нам понадобится еще один компонент – TOpenDialog (вкладка Dialogs), он необходим
для выбора файла, который следует залочить. Измени у него свойство OpenDialog1.Filter:=
‘EXE|*.exe|Все файлы|*.*’.
5. Если ты все правильно сделал у тебя должно получиться что-то вроде этого:
Теперь необходимо прописать код
var // Объявление переменных
Form1: TForm1;
f:TFileStream; // Переменная для работы с файлами
s:byte;
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
// Забираем путь к файлу
edit1.Text:=OpenDialog1.FileName;
// открываем файл для чтения и записи
f:=TFileStream.Create(edit1.Text,fmOpenReadWrite);
// переходим в начало файла
f.Seek($00000000,soFromBeginning);
// читаем текущее значение
f.Read(s,sizeof(s));
if s=$4D then label2.Caption:='Status: Unblock';
if s=$00 then label2.Caption:='Status: Block';
// закрываем файл
f.Free;
end;
end;
procedure TForm1. Button2Click(Sender: TObject);
begin
// открываем файл для чтения и записи
f:=TFileStream.Create(edit1.Text,fmOpenReadWrite);
// переходим в начало файла
f.Seek($00000000,soFromBeginning);
// читаем текущее значение
f.Read(s,sizeof(s));
// если файл доступен, то блокируем его
if s=$4D then
begin
s:=$00;// зануляем значение по адресу $00000000
f.Seek($00000000,soFromBeginning);
f.Write(s,sizeof(s));// записали новое значение
label2.Caption:='Status: Block';
end
// если файл заблокирован, то разблокируем его
else
if s=$00 then
begin
s:=$4D;
f.Seek($00000000,soFromBeginning);
f.Write(s,sizeof(s));
label2.Caption:='Status: Unblock';
end;
f.Free;
end;
Вот собственно и все.
Если кто не знает, то пускай запомнит, что в Delphi для обозначения чисел в
шестнадцатеричном формате юзают знак доллара – $, который ставят перед числом.
Так как адрес и значения по этому адресу хранятся в шестнадцатеричном формате,
значит необходимо ставить баксы.
Надеюсь, ты найдешь применение этой проге, и усовершенствуешь ее по своему усмотрению.
Например, можно закодировать весь файл, применив какой-нибудь метод шифрования.
Все пока!!!
Исходники бери здесь.
Madin
|