На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> глюк
    У меня температура, может поэтому башка плохо варит и глюки следуют
    одним за другим. При сохранении оригинального обработчика прерывания
    mov ds,dx
    mov ax,ds:[21h*4]
    mov word ptr cs:[OrigInt_21],ax
    ...............................
    .............и т.д.
    Третья строчка в отладчике (AFD) выглядит так:
    0123 2EA30301 MOV CS:[0103],AX
    Обработчик не сохраняется, и в самом отладчике АДРЕСА 0103 Я НЕ ВИЖУ
    Метка обработчика в тексте программы: OrigInt_21: dd 0
    Ну конечно другой на моём месте давно бы разобрался, но я есть я.
    Башка болит, если кто-нибудь знает в чём может быть проблема,
    буду просто счастлив.
      Да, чуть не забыл. Должен признаться к своему стыду, что так и не
      умею правильно работать в отладчике ( в данном случае afdpro ).
      Что писать и для чего в командной строке " CMD > " ?
        > Ну конечно другой на моём месте давно бы
        > разобрался, но я есть я.
        > Башка болит, если кто-нибудь знает в чём
        > может быть проблема,
        > буду просто счастлив.
        Ilyia, не расстраивайся! Не проходит дня, чтобы я себя в каком-то вопросе не считал идиотом. Диалектика жизни! Пойми это не глупость или нечто другое, к новому надо привыкнуть, а после этого и наступит осмысление - факт!
        > mov ds,dx
        > mov ax,ds:[21h*4]
        > mov word ptr cs:[OrigInt_21],ax
        > ...............................
        > .............и т.д.
        > Третья строчка в отладчике (AFD) выглядит > так:
        > 0123 2EA30301 MOV CS:[0103],AX
        > Обработчик не сохраняется, и в самом
        > отладчике АДРЕСА 0103 Я НЕ ВИЖУ
        > Метка обработчика в тексте программы:
        > OrigInt_21: dd 0
        Логично, но смущает отсутствие факта обнуления dx.
        Адрес 103h - абсолютно адекватен, потому что подозреваю, что код у тебя такой:
        Start:
        cs:0100h jmp xx
        cs:0102h nop
        cs:0103h OrigInt_21: dd 0
        nop появляется потому, что компилишь без ключа "/m"
          Кстати, рекомендую поместить OrigInt_21 прямо в код:
          pushf
          DB 9Ah ;call xxxx:xxxx
          OrigInt_21 DD 0
          iret
            На всякий случай:
            mov ax,ds:[21h*4]
            mov word ptr cs:[OrigInt_21],ax
            mov ax,ds:[21h*4+2]
            mov word ptr cs:[OrigInt_21+2],ax
              Всем спасибо за поддержку !
              Глюк я выловил, но не понял почему он возник. Сейчас обьясню.
              Выполняю программу по шагам в отладчике. Первая строка:
              (не считая, разумеется, title, assume )
              0100 EB18 JMP 011A
              При этом я ЯСНО ВИЖУ третью строчку:
              0103 0000 ADD [BX+SI],AL (именно на 0103 должен впоследствие указывать
              стандартный сохраняемый обработчик )
              Теперь я выполняю первую строчку клавишей F1, прыгаю, то бишь джампую
              на 011A.
              Доходя до строки сохранения обработчика
              0121 2EA30301 MOV CS:[0103],AX
              мне кажется, что эта строка указывает в никуда, т.к. поднимаясь вверх
              по командам я НЕ НАХОЖУ строку
              0103 0000 ADD [BX+SI],AL
              Вместо неё я почему-то вижу следующую хренотень:
              0101 18900000 SBB [0000+BX+SI],DL
              .......................................................
              0105 0000 ADD [BX+SI],AL
              То есть куда-то пропал адрес 0103, по которому должен сохраняться
              обработчик. В этом и был глюк. Но я так и не понял ПОЧЕМУ это происходит.
              Может мне стоит поменять отладчик ?

              > Логично, но смущает отсутствие факта обнуления dx.
              dx первоначально имеет значение нуль, по крайней мере так говорит
              отладчик.

              > На всякий случай:
              > mov ax,ds:[21h*4]
              > mov word ptr cs:[OrigInt_21],ax
              > mov ax,ds:[21h*4+2]
              > mov word ptr cs:[OrigInt_21+2],ax
              Я конечно-то признаю себя чайником в асме, но не до такой же степени:)
              Всё равно спасибо, приятель:)
                Ilyia, ты упорный человек!
                Я ж тебе сказал, что все нормально!
                Только...
                Твоя программа работает в другой программе, именуемой DOS (или эмуляцией DOS), какие значения будут в регистрах, еще бабушка надвое сказала. Поэтому следует обнулять - это хороший стиль.
                Кстати, отладчик обнуляет все регистры в начале работы...
                Во-вторых, отладчик - глупая программа. Она не знает, где у тебя код, а где данные, тем более, если они перемешаны с кодом. Поэтому 00 00 и заменяет мнемоникой, которая соответствует этому коду. По этой же причине отладчик пытается код представить и по-другому...
                Короче, это не глюк, но работать надо дальше
                  Если тебе интересно, что на самом деле в регистрах при запуске, то гляди:
                  AX = чаще всего 0000, BX = 0000,
                  CX = 00FF, DX = PSP,
                  SI = 0100, DI = FFFE
                  BP = 0912, SP = FFFE
                  IP = 0100
                  DS = PSP, ES = PSP
                  SS = PSP, CS = PSP
                  Но это ещё не факт, т.к. если ты, например, упакуешь свою программу каким-нибудь UPX-ом, то после распаковки (перед передачей управления твоей проге) регистры наверняка будут изменены. Или если заразишь прогу вирусом каким-нибудь...
                  Это был пункт 1.
                  Теперь "пункт 2":
                  0101 18900000 SBB [0000+BX+SI],DL
                  у тебя появляется из-за того, что когда ты поднимаешься вверх, твой отладчик пытается определить начало инструкции и по своей природной тупости (или даже скорее по ....... его АВТОРА) делает это неверно. А теперь вот ты подумай: логично, что если по адресу 0101 18900000, то по адресу 0102 900000, а по 0103 0000? По-моему вполне логично! :)
                  Пункт 3.
                  Выложи сюда свой исходник полностью или хотя бы пришли на мыло...
                    Re : Пункт 3
                    Я конечно извиняюсь, но если ты достаточно долго знаешь Ассемблер
                    (а судя по всему это именно так), то этот черновик ( а вовсе не исходник)
                    тебе просто НАФИГ не нужен:) К тому же вроде вопросов у меня по нему нет
                    (может пока). Несколько строк примитивного кода могут быть полезны
                    таким как я, но не тем, кто хорошо владеет Ассемблером. Ну.. если тебе
                    сильно надо (мало ли), я вышлю:)
                    Re : Пункт 2
                    Ну конечно же ты давно написал свой отладчик, который лучше AFD в сто
                    раз :))) А если серъёзно, я пользовался первой версией, кто же не делает ошибок
                    в первых версиях. Вспомнить ту же windows, а в MS люди работают отнюдь не
                    тупые.
                    С проблемой отладчика я разобрался, спасибо всем участникам топика.

                    Re : Пункт 1
                    Интересно мне всё и насчёт регистров тоже, приму к сведению, спасибо.
                    Кстати о вирусах... Не помешали бы исходники и(или) документации про вирусы
                    и анти-вирусы, буду рад любым ссылкам. Так, для общего развития :)
                      Примерный текст резидента, который мне приходит в голову, от него и пляши:
                      AntiDel.txt
                      ----Begin-----------------------------------
                      LOCALS
                      .MODEL TINY
                      .CODE
                      ORG 100h
                      Start:
                      jmp Init
                      ;Здесь могут располагаться данные резидентной части
                      Int21Handler PROC FAR
                      cmp ah,41h
                      jne @@DoOldInt21
                      ; ...
                      @@Exit:
                      iret
                      @@DoOldInt21:
                      ;Запуск старого обработчика прерывания
                      DB 0EAh ;jmp xxxx:xxxx
                      fpOldInt21 DD ?
                      Int21Handler ENDP
                      Init:
                      ;Сохранение старого обработчика и установка нового
                      xor ax,ax
                      mov es,ax
                      cli
                      mov ax,OFFSET Int21Handler
                      xchg ax,es:[21h*4]
                      mov WORD PTR [fpOldInt21],ax
                      mov ax,cs
                      xchg ax,es:[21h*4+2]
                      mov WORD PTR [fpOldInt21+2],ax
                      sti
                      ;Освобождение сегмента среды
                      mov es,ds:[2Ch]
                      mov ah,49h
                      int 21h
                      ;Завершение программы и сохранение ее резидентной
                      mov dx,OFFSET Init
                      int 27h
                      END Start
                      ----End-------------------------------------
                      Компиляция
                      tasm /m antidel.asm
                      tlink /t /x antidel.obj
                      После компиляции получишь 53-байтную программку, которая, например, в Volcov Commander'е не будет давать удалять файлы.
                      Ilyia, нам твой исходник не нужен, просто хотели помочь...
                      Успехов!
                        PS:
                        Могу еще предложить изменить обработчик прерывания на следующий для отлова всех случаев удаления файла/каталога
                        Int21Handler PROC FAR
                        cmp ah,13h
                        je @@Del
                        cmp ah,41h
                        je @@Del
                        cmp ax,7141h
                        je @@Del
                        cmp ah,3Ah
                        je @@Del
                        cmp ax,713Ah
                        je @@Del
                        @@DoOldInt21:
                        ;Запуск старого обработчика прерывания
                        DB 0EAh ;jmp xxxx:xxxx
                        fpOldInt21 DD ?
                        @@Del:
                        ; ...
                        @@Exit:
                        iret
                        Int21Handler ENDP
                          Благодарю ! Буду колдовать над исходником !
                          Всё хорошо !!!
                          ....за исключеньем пустяка...
                          (далее идут мои вопросы, НО
                          при этом предполагается,
                          что исходник
                          написан без ошибок)
                          1).обязательно ли освобождать сегмент среды (49h), что может случиться,
                          если не освобождать;
                          2).не совсем понятно назначение строчки MOV AX,CS
                          (...или я что-то совсем не понимаю ?)
                          3).(и наконец самый глупый вопрос)
                          оболочки VolCom у меня нет, а вот из командной строки
                          dos и из NorCom исходник не работает, хотя, как я понял,
                          если в AH значение 41, то происходит немедленный выход IRET, так
                          нет же... :((
                          у меня сложилось ужасное
                          предположение, что разные оболочки по-разному обрабатывают
                          41h. Я надеюсь, что это всё-же не так ???
                          ....хотя может я что-то не заметил.
                            1) Не обязательно...
                            Если не удалишь, просто объем программы в памяти будет занимать байт на 300 больше.
                            2) Просто совместил для сокращения кода сохранение старого и установку нового обработчика:
                            mov ax,cs ;AX = CS (сегмент нового обработчика)
                            xchg ax,es:[21h*4+2] ;AX <- сегмент старого обработчика
                            ;es:[21h*4+2] <- CS (сегмент нового обработчика)
                            mov WORD PTR [fpOldInt21+2],ax
                            3) Если изменишь на обработчик, который я потом добавил, из ком. строки тоже не будет удалять.
                            > если в AH значение 41, то происходит немедленный выход IRET
                            В этом случае прерывание просто не обрабатывается. Код я тебе послал в качестве полуфабриката.
                            Я не знаю, что ты хочешь делать при удалении, поэтому и написал ...
                            > у меня сложилось ужасное
                            > предположение, что разные оболочки по-
                            > разному обрабатывают
                            > 41h. Я надеюсь, что это всё-же не так ???
                            Это не так. Просто команда "del" использует функции ax=7341h и ax=733ah при работе под Windows.
                            Опять же смотри текст последнего обработчика
                            PS: Код я проверил, у меня все работает
                              пардон, опечатался:
                              функции ax=7141h и 713Ah
                                Спасибо, я всё понял.
                                А тупил я из-за того, что до сих пор
                                плохо представлял себе разницу между
                                DOSом в окне и DOSом в реальном режиме.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0396 ]   [ 15 queries used ]   [ Generated: 27.04.24, 16:29 GMT ]