WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  ASM
  Почему прога не работает ?

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Почему прога не работает ?
Ilyia опубликован 17-02-2002 03:53 MSK   Click Here to See the Profile for Ilyia   Click Here to Email Ilyia  
Помогите, прога не работает.
Она перехватывает функции ДОС удаления файла/каталога.
Если я хочу удалить файл и ввожу при этом неправильный
пароль, то файл не удаляется. Почему он не удаляется,
если я даже ввожу правильный пароль ?
Найдите здесь ошибку, пожалуйста, я не могу.

-----------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--------

NOPIK опубликован 17-02-2002 15:37 MSK     Click Here to See the Profile for NOPIK  Click Here to Email NOPIK     
Регистр сегмента данных...
7in опубликован 17-02-2002 22:00 MSK     Click Here to See the Profile for 7in  Click Here to Email 7in     
Ошибки в следующем:
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' и буква станет строчной....

7in опубликован 17-02-2002 22:02 MSK     Click Here to See the Profile for 7in  Click Here to Email 7in     
Что-то я проглючил:
2. (см. пункт 1b)
6. Флаг на СА, а CF :)))
Ilyia опубликован 18-02-2002 19:53 MSK     Click Here to See the Profile for Ilyia  Click Here to Email Ilyia     
Не получается, убейте меня !!!
:(
Насчёт "непонятного восстановления 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

7in опубликован 18-02-2002 23:15 MSK     Click Here to See the Profile for 7in  Click Here to Email 7in     
Ты будешь смеяться, но проблема в том, что ты не сохраняешь регистр 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.

rivitna опубликован 18-02-2002 23:27 MSK     Click Here to See the Profile for rivitna  Click Here to Email rivitna     
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, чтобы избегать экцессов с регистрами, да и код по-проще будет

rivitna опубликован 18-02-2002 23:33 MSK     Click Here to See the Profile for rivitna  Click Here to Email rivitna     
Я - тормоз, можно проще :(
...
@@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:
...

Ilyia опубликован 19-02-2002 00:54 MSK     Click Here to See the Profile for Ilyia  Click Here to Email Ilyia     
Как я не догадался:(((
Вот я же дур-ррак:(
rivitna - ты гений !
Неужели это всё пиво ? :))))

Всем спасибо за помощь !!!
:)

rivitna опубликован 19-02-2002 07:56 MSK     Click Here to See the Profile for rivitna  Click Here to Email 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:
...
---------------------------------------------

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.