Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[13.58.247.31] |
|
Сообщ.
#1
,
|
|
|
Помогите, прога не работает.
Она перехватывает функции ДОС удаления файла/каталога. Если я хочу удалить файл и ввожу при этом неправильный пароль, то файл не удаляется. Почему он не удаляется, если я даже ввожу правильный пароль ? Найдите здесь ошибку, пожалуйста, я не могу. -----------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-------- |
Сообщ.
#2
,
|
|
|
Регистр сегмента данных...
|
Сообщ.
#3
,
|
|
|
Ошибки в следующем:
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' и буква станет строчной.... |
Сообщ.
#4
,
|
|
|
Что-то я проглючил:
2. (см. пункт 1b) 6. Флаг на СА, а CF )) |
Сообщ.
#5
,
|
|
|
Не получается, убейте меня !!!
Насчёт "непонятного восстановления 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 |
Сообщ.
#6
,
|
|
|
Ты будешь смеяться, но проблема в том, что ты не сохраняешь регистр 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. |
Сообщ.
#7
,
|
|
|
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, чтобы избегать экцессов с регистрами, да и код по-проще будет |
Сообщ.
#8
,
|
|
|
Я - тормоз, можно проще
... @@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: ... |
Сообщ.
#9
,
|
|
|
Как я не догадался:(((
Вот я же дур-ррак:( rivitna - ты гений ! Неужели это всё пиво ? ))) Всем спасибо за помощь !!! |
Сообщ.
#10
,
|
|
|
Встал я по утру, голова не болит (Ура!), решил посмотреть, что я наваял:
нашел ошибку - в цикле @@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: ... --------------------------------------------- |