28.12.2024
| Главная | Поиск | Регистрация | Профиль | Вход | Выход |
Категории
Наши статьи [9]
Реклама
Реклама
Интересное
Главная » Статьи » Наши статьи » Наши статьи

Удаление файлов на ассемблере

                                Удаление файлов на ассемблере

Здраствуйте, участники нашего софтяного портала http://last-soft.ucoz.ru/ ! Надеюсь, что наши статьи про программированию хоть кому-нибудь пригодтся :(. Я полазял по программерским форумам и увидел, что в разделе ассемблер форумчане спрашивают как можно удалить файл! Я не совсем понимаю в чем тут трудность! Чтобы окончательно разобраться с этим вопросом, я решил написать свой файло-удалятельJ. Надеюсь вступление было не долгим и нудным и я вас еще не успел утомитьJ. Ах да! Чуть не забыл… мы это сделаем под windows, т.к. под  DOS я не вижу смысла её делать.

Сперва с чего нужно начать - это с просмотрения  MSDN. В нем указаны все API-функции нужные нам для работы. Вот… я нашел функцию для удаления файла. Она называется DeleteFile

Синтаксис её таков: 
 
1)На Си:   BOOL WINAPI DeleteFile( __in  LPCTSTR lpFileName ); 

2) На Делфи:     function DeleteFile(AFileName : string) : boolean;

Видим, что на входе в процедуру у нас имя файла(т.е. строка с именем файла), а на выходе либо успешно удалили, или нет.
Давайте для начала сделаем простую программульку, которая удаляет указанный файл(т.е. по сути имя файла четко задано)
 
 
Код:
;_____________________________________________________________________
      .386
      .model flat, stdcall
      
      include \masm32\include\windows.inc
      include \masm32\include\user32.inc
      include \masm32\include\kernel32.inc
      includelib \masm32\lib\user32.lib
      includelib \masm32\lib\kernel32.lib
 
    .data
DelFileName db "1.txt",0   
 
MsgBoxText_1 db "File not found",0
MsgBoxCaption_1 db "Error",0
 
MsgBoxText_2 db "File successfully deleted",0
MsgBoxCaption_2 db "YES",0
 
    .code
 
start:
 
  invoke DeleteFile,addr DelFileName 
  cmp eax,0
  je NO
  
  invoke MessageBox, NULL,addr MsgBoxText_2,\
        addr MsgBoxCaption_2, MB_OK   
  invoke ExitProcess,NULL 
  
NO:  
  invoke MessageBox, NULL,addr MsgBoxText_1,\
        addr MsgBoxCaption_1, MB_OK    
   
 
exit:
 invoke ExitProcess,NULL         
end start
 

;____________________________________________________________________________________

Итак, по-порядку что делает эта программа. Во-первых мы в сегменте данных объявляем все наши строки которые мы будем использовать:

    .data
DelFileName db "1.txt",0   
 
MsgBoxText_1 db "Файл не найден",0
MsgBoxCaption_1 db "Ошибка",0
 
MsgBoxText_2 db "Файл успешно удалён!!!",0
MsgBoxCaption_2 db "Шикарно",0

 

Я объявил здесь имя файла 1.txt, ну и строки сообщения для наглядности работы программы. Теперь сам  код:

 1) invoke DeleteFile,addr DelFileName 
 2)    cmp eax,0
 3)    je NO
 4)  invoke MessageBox, NULL,addr MsgBoxText_2,\
 5)         addr MsgBoxCaption_2, MB_OK   
 6) invoke ExitProcess,NULL 
 7)NO:  
 8)  invoke MessageBox, NULL,addr MsgBoxText_1,\
 9)         addr MsgBoxCaption_1, MB_OK    
 10)exit:
 11)  invoke ExitProcess,NULL   
      

В первой строчке мы задаем имя нашего будущего удаленного файла. Обязательно нужно его смещение addr!!!Иначе наша строка потеряется в памяти. Да и вообще ничего не получится

Во второй и третьей строке мы проверяем что у нас вернулось в регистр eax. Если вернулся ноль, то значит файл не был найден и поднимется флаг нуля, и совершится условный переход на метку NO. В случае же, если eax=1, то прыжка не будет и выведем сообщение о удачном удалении файла.

Ну и в восьмой строке мы выходим из программыКак вы можете видеть, что ничего здесь особенного нет. Вот вспомните, например DOS, там все почти так же:

    mov ah,13h

    int 21h

 

Только в DS:DX у нас был путь к файлу.

Если чесно, то меня такой расклад не устраиват и я решил прикрутить ввод. Долго думал что выбрать(я про API-функцию) ReadConsole или CommandLine. Все таки пожалуй остановлюсь я на втором варианте.

Если мы посмотрим в справочник по CommandLine, то заметим, что эта функция без параметров. На входе и выходе наша введенная строка.

Так…теперь давайте напишем почти идеальную программу-удалялку. Почему почти??? Ответ я дам в конце и исправлять не буду свой баг.

      .386

      .model flat, stdcall

      ;#########################################################################

      include \masm32\include\windows.inc

      include \masm32\include\user32.inc

      include \masm32\include\kernel32.inc

      includelib \masm32\lib\user32.lib

      includelib \masm32\lib\kernel32.lib

    .data

buffer   dd ?

Commandline dd ?

MsgBoxText_1 db "File not found",0

MsgBoxCaption_1 db "Arguments CommandLine:",0

MsgBoxText_2 db "File successfully deleted",0

    .code

start:

    call GetCommandLine

    mov Commandline,eax

    mov ecx,512d

    add ecx,eax

l1: 

    inc eax

    cmp eax,ecx

    jz NO

    cmp byte ptr[eax],22h

    jnz l1

l2:  

    inc eax

    cmp byte ptr[eax],0

    jz NO

    cmp byte ptr[eax],20h

    jz l2

  mov buffer,eax  

  invoke SetFileAttributes,eax,0

  mov eax,buffer

  invoke DeleteFile,eax

  invoke MessageBox, NULL,addr MsgBoxText_2,\

               addr MsgBoxCaption_1, MB_OK

  invoke ExitProcess,NULL   

      jmp exit        

NO:

 invoke MessageBox, NULL, addr MsgBoxText_1,\

              addr MsgBoxCaption_1, MB_OK 

exit:

 invoke ExitProcess,NULL        

end start

Теперь я в двух словах постораюсь объяснить, что делает прога. Кстати, запускать нужно её из командой строки. Я надеюсь вы знаете, что это такое=).А если нет, то вот как нужно: запускаете, например, FAR(можно любой другой, я просто к нему привык). И в ком строке набираете deleteproga.exe    file.txt . Где  deleteproga.exe – это имя нашей программы, а   file.txt, то что удаляем. Теперь разбор полетов…

В первой строчке кода мы командой invoke вызываем API-функцию GetCommandLine. Тут будет путь  нашей программы и аргументы командной строки(т.е. имя удаляемого файла).

Только здесь есть один нюанс. Вы можете видеть, что перед началом пути стоят ковычки. Вот от них нам нужно избавиться. Для этого служит один способ, который я взял из дневник чайника. Чтива 0. Цикл l1 служит для нахождения той последней ковычки, которая имеет код 22h. После прохождения цикла у нас такая ситуация:  “ fle.txt” . Вроде все нормально, только мешает пробел. Поэтому в цикле l2 мы будем его искать.

Всё нашли и результат будет в EAX. Затем сохраним в переменную buffer. Далее вызывае функцию

invoke SetFileAttributes,eax,0

которая будет снимать атрубут у файла. Если бы мы не вызвали эту функцию, то у файла с аттрибутами для чтения и записи мы не смогли бы сделать его  удаление. Затем из переменой возвращаем имя файла и удаляем файл функцией  invoke DeleteFile,eax

На этом можно было бы остановиться, если бы не мешал нам один недочет. То что мы набрали в ком строке будет выполнено в любом случае! А нам этого ведь не надо. А вдруг указанного файла нет физически! То прога все равно что то удалит и выведет нам сообщение о удачном удалении. Поэтому нужно найти этот файл фукцией FindFirstFile. Как будет выглядеть готовая программа я описывать не буду, т.к. хочу чтобы вы сами сделали это, ведь задача то совсем простая!!! Удачи и счастливого вам кодинга!!!

Категория: Наши статьи | Добавил: MalCer (28.08.2009)
Просмотров: 2583 | Рейтинг: 5.0/1 |
Всего комментариев: 0
Реклама
Кабинет

Читать ЛС ()

Гость, мы рады вас видеть. Пожалуйста зарегистрируйтесь или авторизуйтесь!



Фраза дня:
Кто с нами

Сегодня были:
Статистика
Партнеры
Graffiti Decorations(R) Studio (TM) Site Promoter Mnogo-softa.net.ru-Софт,срипты,шаблоны и др. MEGA-ToP-ТОП раскрутка раскрутка сайтов. Рейтинг лучших сайтов
описание