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

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

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

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> Почему прога не работает ?
    Помогите, прога не работает.
    Она перехватывает функции ДОС удаления файла/каталога.
    Если я хочу удалить файл и ввожу при этом неправильный
    пароль, то файл не удаляется. Почему он не удаляется,
    если я даже ввожу правильный пароль ?
    Найдите здесь ошибку, пожалуйста, я не могу.

    -----------CUT-----------
    Assume Cs: MySegment
    MySegment Segment
    Org(100h)
    Begin:
    jmp Init

    OrigInt_21 dd 0

    Password db 'Celeron$'




    String db 80 dup(?)

    MyInt_21:

    cmp ah,13h
    je Del
    cmp ah,41h
    je Del
    cmp ax,7141h
    je Del
    cmp ah,3Ah
    je Del
    je Del
    jmp Orig
    Del:
    pushf
    push ax
    push bx
    push es
    push si
    push di

    mov bx,0
    Enter:
    mov ah,08h
    int 21h
    cmp al,13


    je Identification
    mov [String+bx],al

    mov ah,02
    mov dl,'*'
    int 21h
    inc bx
    jmp Enter

    Identification :

    push ds
    pop es
    mov si,offset String
    mov di,offset Password
    cld
    mov cx,bx
    repe cmpsb
    je _Orig_

    pop di
    pop si
    pop es
    pop bx
    pop ax
    popf
    exit:
    IRET
    _Orig_:
    pop dx
    pop di
    pop si
    pop es
    pop bx
    pop ax
    popf

    Orig:
    jmp dword ptr cs:[OrigInt_21]
    Init:
    xor dx,dx
    mov ds,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
    cli
    mov ax,offset MyInt_21
    mov word ptr ds:[21h*4],ax
    push cs
    pop ax
    mov word ptr ds:[21h*4+2],ax
    sti
    mov dx,offset Init
    int 27h
    MySegment Ends
    End Begin
    -----------CUT--------
      Регистр сегмента данных...
        Ошибки в следующем:
        1a. cmpsb сравнивает DS:SI и ES:DI, здесь должно быть DS=ES=CS , а у тебя это не выполняется.
        1b. 'push ds/pop es' замени на 'push cs/pop es' и добавь 'push cs/pop ds'. Только не забудь сохранить DS...
        2. mov [String+bx],al пишет в сегмент DS. Если поставишь push cs/pop ds (см. пункт 2) перед этой строкой, то это уже проблемой не будет.
        3. Регистр CX не сохраняется...
        4. В _Orig_ непонятно зачем восстанавливается DX.
        5. Ты сравниваешь столько символов, сколько введено с клавы, т.е. можно ввести просто 'C' или 'Cel' и всё будет Ok! Лучше поменяй местами строки...
        je Identification
        mov [String+bx],al
        ...и 'inc bx' поставь перед 'je Identification' , а строку 'Celeron$' замени на 'Celeron',13 .
        6. Перед iret поставь...
        mov ax,5
        push bp
        mov bp,sp
        or byte ptr bp[6],1
        pop bp
        Это установит флаг СА на выходе в 1 и возвратит код ошибки Access Denied.
        7. Если прога виснет, попробуй int 21h (при вводе с клавы и выводе на экран) заменить на int 16h/int 10h.
        Пока вроде всё....
        Советы:
        1. pushf/popf тебе здесь ВООБЩЕ не нужен (тем более, что флаги у тебя меняются, когда ты делаешь 'cmp ah,??'
        2. Cli лучше делать после 'mov ds,dx' или сразу после 'Init:'
        3. И у тебя 2 раза подряд 'je Del' стоит :)
        4. После ввода символа можно сделать 'or al,20h' и буква станет строчной....
          Что-то я проглючил:
          2. (см. пункт 1b)
          6. Флаг на СА, а CF :)))
            Не получается, убейте меня !!!
            :(
            Насчёт "непонятного восстановления DX" и несохранения
            СX - это действительно грубые опечатки, наверное потому,
            что на ночь глядя печатал.
            Ошибки понял свои, похоже исправил, но опять
            не вышло :(((
            Насчёт пятого пункта: пускай хотя бы так заработает,
            ещё надо сказать спасибо, что она вообще не виснет
            (чем я весьма удивлён), потом, когда будет работать,
            тогда уже можно будет оформить её по всем правилам :)
            Это какой-то ужас:(
            ;-----------CUT--------------------------------
            Assume Cs: MySegment, Ds:MySegment, Es:MySegment, Ss:MySegment;
            MySegment Segment;
            Org(100h);
            Begin:
            jmp Init;
            OrigInt dd 0;

            Password db 'Celeron',13;
            ;Здесь обьясните мне поподробнее
            ;пожалуйста,отличие 'Celeron',
            ;'Celeron$', 'Celeron',13,
            ;"Celeron" ? Может здесь
            ;собака зарыта...
            String db 80 dup(?);

            MyInt:

            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;
            jmp Orig;
            Del:
            push ax;
            push bx;
            push es;
            push si;
            push di;
            push ds;
            push cx;
            ; по-моему я сохранил
            ;все что необходимо
            mov bx,0;
            Enter:
            mov ah,08h;
            int 21h;

            push cs;
            pop ds;
            ;Теперь DS=CS
            mov [String+bx],al;
            ;Запись по адресу
            ;СS:[String+BX]
            ;Вроде все нормально
            inc bx;
            ;Тоже вроде все нормально
            cmp al,13;
            ;кажется подозрительныи
            ;но в голову ничего
            ;не приходит
            je Identification;
            mov ah,02 ;
            mov dl,'*' ;
            int 21h;
            jmp Enter;

            Identification :
            push cs; ну на всякий
            pop ds; пожарный...
            push cs;
            pop es;
            mov si,offset String;
            mov di,offset Password;
            cld;
            mov cx,bx;
            repe cmpsb;
            je _Orig_ ;

            pop cx;
            pop ds;
            pop di;
            pop si;
            pop es;
            pop bx;
            pop ax;
            IRET;
            _Orig_:
            pop cx;
            pop ds;
            pop di;
            pop si;
            pop es;
            pop bx;
            pop ax;


            Orig:
            jmp dword ptr cs:[OrigInt];
            Init:
            {обычная процедура установки}
            ....................
            ....................
            ....................
            ....................
            End Begin
              Ты будешь смеяться, но проблема в том, что ты не сохраняешь регистр DX. Внимательнее надо быть :) . А вообще, я тебе всё-таки советую затемнить...
              mov ah,08h
              int 21h
              ...на...
              xor ah,ah
              int 16h
              &&&
              mov ah,02
              mov dl,'*'
              int 21h
              ...на...
              mov ah,0Eh
              mov al,'*'
              int 10h
              ...или на...
              mov al,'*'
              int 29h
              И поставь на всякий случай перед сохранением флагов sti, а перед 'jmp dword ptr...' - cli.
                7in меня опередил, но тем не менее предложу свой код.
                Лень было смотреть твой код после пива, проще было написать. Я проверял, все работает:
                --------------------------------------------
                .286
                LOCALS
                .MODEL TINY

                .CODE
                ORG 100h
                Start:
                jmp Init

                sPsw DB "pass"
                LEN_sPsw = $-sPsw
                sString DB 80 DUP(?)
                LEN_sString = $-sString

                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:
                push ds
                push es
                pusha
                push cs
                push cs
                pop ds
                pop es
                xor cx,cx
                mov di,OFFSET sString
                push di
                @@NextChar:
                mov ah,8
                int 21h
                cmp al,0Dh
                je @@Compare
                stosb
                inc cx
                cmp cx,LEN_sString
                jbe @@NextChar
                @@Compare:
                pop di
                jcxz @@Exit
                cmp cx,LEN_sPsw
                jne @@Exit
                mov si,OFFSET sPsw
                repe cmpsb
                je @@ValidPsw
                @@Exit:
                popa
                pop es
                pop ds
                iret
                @@ValidPsw:
                popa
                pop es
                pop ds
                jmp @@DoOldInt21
                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
                --------------------------------------------
                Замечания:
                - Я добавил проверку, чтобы буфер sString не переполнялся.
                - Можешь пароль заксорить для эстетического удовлетворения
                - Также рекомендую использовать команды 286 pusha/popa, чтобы избегать экцессов с регистрами, да и код по-проще будет
                  Я - тормоз, можно проще :(
                  ...
                  @@Compare:
                  pop di
                  cmp cx,LEN_sPsw
                  jne @@Exit
                  mov si,OFFSET sPsw
                  repe cmpsb
                  @@Exit:
                  popa
                  pop es
                  pop ds
                  je @@DoOldInt21
                  iret
                  Int21Handler ENDP

                  Init:
                  ...
                    Как я не догадался:(((
                    Вот я же дур-ррак:(
                    rivitna - ты гений !
                    Неужели это всё пиво ? :))))
                    Всем спасибо за помощь !!!
                    :)
                      Встал я по утру, голова не болит (Ура!), решил посмотреть, что я наваял:
                      нашел ошибку - в цикле @@NextChar я написал неверный переход. Нужно
                      jb @@NextChar
                      Кроме того рекомендую обработчик выровнить хотя бы по слову (это правило хорошего тона) с помощью директивы ALIGN 2.
                      Итак, конечный код обработчика имеет вид:
                      ---------------------------------------------
                      ...
                      Start:
                      jmp Init
                      sPsw DB "pass"
                      LEN_sPsw = $-sPsw
                      sString DB 80 DUP(?)
                      LEN_sString = $-sString
                      ALIGN 2
                      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:
                      push ds
                      push es
                      pusha
                      push cs
                      pop ds
                      push cs
                      pop es
                      xor cx,cx
                      mov di,OFFSET sString
                      push di
                      @@NextChar:
                      mov ah,8
                      int 21h
                      cmp al,0Dh
                      je @@Compare
                      stosb
                      inc cx
                      cmp cx,LEN_sString
                      jb @@NextChar
                      @@Compare:
                      pop di
                      cmp cx,LEN_sPsw
                      jne @@Exit
                      mov si,OFFSET sPsw
                      repe cmpsb
                      @@Exit:
                      popa
                      pop es
                      pop ds
                      je @@DoOldInt21
                      iret
                      Int21Handler ENDP

                      Init:
                      ...
                      ---------------------------------------------
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0397 ]   [ 15 queries used ]   [ Generated: 28.04.24, 07:49 GMT ]