Movement of Mind - Движение Разума


Перекрываем доступ к файлам, делаем файл временно не работающим

Всем привет. Надеюсь, каждый ознакомился с предыдущим моим примером и во всем разобрался.

Сегодня у нас новая прога. Я тут подумал над тем, что каждый из нас хочет что-нибудь скрыть от чужого клика (да и глаза тоже :) В связи с чем, просто необходимо знать, как обеспечить эту самую секьюрность, чтоб никто не проник к твоим сокровенным данным. Но речь пойдет не о шифровании твоей инфы, а о достаточно простом способе запрета запуска различных программ.

К примеру, тебя раздражает когда кто-нибудь приходит к тебе и начинает играть в игрушки на твоем компе, а тебе работать надо :( Или просто хочешь создать видимость неработоспособности определенной программы, а потом одним щелчком мыши восстановить ее. То есть фактически программа не скрывается, но перестает работать. Возобновляется работоспособность исключительно по твоей команде.

Немного теории о структуре 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. Если ты все правильно сделал у тебя должно получиться что-то вроде этого:

Delphi: Перекрываем доступ к файлам, делаем файл временно не работающим

Теперь необходимо прописать код

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


Поиск по сайту
Яндекс
Используются технологии uCoz