Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Блокировка запуска программ


Автор: EASports 5.5.2007, 02:21
Подскажите как можно заблокировать запуск программы (*.exe, *.com) в DOS? Подробнее: мне нужно реализовать резидентную прогу, которая будет блокировать паролем запуск 16-битных программ из командной строки.

Автор: anwe 5.5.2007, 11:32
Так, ты уже сам и ответил. А перехватывать надо, кажется 4В функцию.

Автор: Akina 5.5.2007, 23:24
Проблемная задача. Запуск копии командного процессора тоже будешь паролем проверять? а он запускается...

Автор: EASports 7.5.2007, 22:17
дак что, никто не знает? просто срочно надо. если кто всё-таки знает, напишите поподробне что нужно делать?

Автор: anwe 7.5.2007, 22:27
Посмотри
Цитата(anwe @  5.5.2007,  11:32 Найти цитируемый пост)
4В функцию


Автор: EASports 7.5.2007, 23:40
Да, действительно. Нашёл в Yaндексе по запросу "ассемблер 4B" что-то интересное. Похоже на то, что нужно. Всем большой пасиб.

Автор: anwe 7.5.2007, 23:43
Это загрузка другой программы из твоей.
Читай, изучай. smile 

Автор: EASports 8.5.2007, 16:59
Дак как же тогда прехватить запуск другой проги? Мне не запустить надо, а наоборот поймать запуск... Как дос обрабатывает запуск,  этой функцией или нет? Если нет, то чем и как?

Автор: anwe 8.5.2007, 22:13
Ну, как-как? Уже ж написали: перехватывать эту 4В. Ее описание прочитал?
ds:dx - адес строки с запускаемой программой. Вот анализируй ее. Что еще?

Автор: EASports 9.5.2007, 02:26
ну как-то неопределённо написали. Я впринципе почитал уже про эту функцию, тока не очень понятно... ну да ладно. Да кстати, Дос-то её вызывает сам по себе когда что-нибудь запускает? Или это именно из какой-то проги запускать другую? Просто мне-то нуна резидента... Тут же возникает проблема с перехватом 21 прерывания: все основные функции доса идут через неё, дак как обрабатывать-то их? Так? ->
Код

proc my21h
push ax bx cx ; ...
pushf
call old21h
;далее мой обработчик
;...
pop cx, bx, ax
iret
endp

Или по-другому?  smile 

Автор: dumb 9.5.2007, 02:44
так ты запустишь программу, а только потом сможешь об этом узнать.

Код

cmp ax, 4b00h ; остальные afair нафик не надо проверять в обчном случае
jne jmp_old
; проверяем путь запускаемого
cmp deny, 0
jz jmp_old
; выставляем ошибку на выход
iret
jmp_old:
db 0eah
old21h dd 0


Автор: EASports 10.5.2007, 20:44
По ходу пооявился ещё вопрос, как в с моём обработчике прерывания (переопределённый int 21h) вызвать стандартный и вернуться в мой? ну типа чтобы отловить функцию, вывести текстовый запрос на ввод пароля, затем прочитать введённые символы и наконец определить разрешение запуска ну и соответственно запустить программу?

Автор: anwe 10.5.2007, 21:38
Цитата(EASports @  10.5.2007,  20:44 Найти цитируемый пост)
вызвать стандартный и вернуться в мой?

Код

pushf
call   original_int_21h

Просто делаешь дальний вызов командой call
Но зачем это в твое варианте? Тебе надо выполнять свои действия перед стандартным. В этом случае, как уже писали выше, просто прыгай на стандартный после своего:
Код

jmp   original_int_21h

Автор: EASports 11.5.2007, 20:08
нет ну как, я определяю, что пользователь хочет запустить программу, далее запрашиваю у него пароль, принимаю пароль, сверяю и если всё совпало только в этом случае выполняю запуск программы.  Здесь как минимум надо вызвать 2 раза вызывать стандартное 21 прерывание: вывод строки (9h int 21h) и чтение строки либо посимвольно(2h или 1h не помню и int 21h). Или я чего-то не догоняю? Да и потом ещё собственно запуск тоже обрабатывать стандартным 21 прерыванием. Т.е. 3 раза надо вызвать.

Автор: anwe 11.5.2007, 22:27
Правильно мыслишь.
Ты поставь в начале обработчика 21 переход на твой обработчик. Если (тебе уже писали) в ах тебе пришло 4В00, то сравнивай ее параметры, в частности, имя запускаемого файла с тем, к которому нужно запретить доступ. Если это не тот файл переходи (прыгай) на стандартный обработчик. Если твой, то возвращайся в программы (систему) передавая код запрета доступа к этому файлу.
Всё. Во всех остальных случаях вызова 21 ты не обрабатываешь. То есть, пожалуйста, выводи строки, считывай ввод, сравнивай (хотя это не затрагивает 21), словом, все что хочешь, то и делай. В чем проблема, что он будет вызываться 3 раза? Да хоть 33.
Единственное, создай какой-нибудь собственный флаг и проверяй его наряду с проверкой 4В00. Если пользователь ввел правильный пароль, поднимай флаг и вызывай снова 4В00.
Вот схематичный код:
Код

new_handler:
pushf
cmp   ax,4B00h
je  check_file
jmp  orig_handler
check_file:
cmp...   ;asked file & yuor file
je check_flag
jmp  orig_handler
check_flag:
cmp  flag,0
je  access_denied
jmp  orig_handler
access_denid:
popf
stc
mov   ax,5
iret

Автор: EASports 12.5.2007, 00:07
Вот блин думал-думал, хотел уж даже сделать переход в другую процедуру, там всё обработать... Блин, вот я не допёр-то. Конечно, просто флаг поставить. Пасиба огромное.  smile 

Автор: EASports 12.5.2007, 01:21
Чё-т у меня ну никак не получается вызвать прерывание из прерывания. Уж даже пытался повесить вывод строки на таймер, ну ни в какую. Вот код таймера, что не так, программа постоянно вместо нужной строки выводит какую-то ерунду и вылетает. 
Код

systimer proc

;cmp cs:flag,1
;jne ok
mov cs:flag,0
mov ah,9h
lea dx,cs:zapros
pushf
jmp cs:old21h   ; здесь и int 21h писал и call cs:old21h всё равно не работает.
ok:

jmp cs:old1ch
iret
endp

Автор: dumb 12.5.2007, 03:50
Цитата(EASports @  12.5.2007,  01:21 Найти цитируемый пост)
Чё-т у меня ну никак не получается вызвать прерывание из прерывания.

есть такое страшное слово - нереентерабельность. кратко суть: int21 использует при работе некий кусок данных - хранит там, грубо, свое состояние. теперь ситуация: программа вызывает функцию, например, чтения строки/символа - т.е. выполнение "циклится" внутри 21h. приходит прерывание таймера, в котором ты пытаешься вывести строку посредством вызова 21h - получается вложенный вызов: находясь в обработчике 21h(чтение строки), опять вызывается обработчик 21h(вывод). те самые данные "накрываются" - системе каюк.
борьба с нереентерабельностью заключается в вывешивании флагов и опросах спец.флагов доса...

к нашим баранам: зачем тебе вообще таймер в твоей задаче?
пробила меня ностальгия, так что вот тебе "пирожок"(разгрызешь, надеюсь, сам): smile
Код

; tasm sample.asm
; tlink /t sample.obj

    .model tiny
    .386
    .code

MaxPswLen equ     8
BlFunc    equ     4b00h

    org 100h

start:
    jmp   init

log_name  db      '4blog.txt',0

sPswPmt   db      'pass: $'

BlProg    db      'mem.exe'
BlProgLen = ($ - BlProg)

BlPass    db      '123'
BlPassLen = ($ - BlPass)

psw_buf   db      MaxPswLen + 1
psw_len   db      0
psw_data  db      (MaxPswLen + 1) dup (0)

int_21h   proc

    cmp   ax, BlFunc
    jne   jmp_old

    pushf
    pusha
    push  ds es

;-- dbg log +
    pusha
    push  ds
    mov   si, ds
    mov   di, dx
    push  cs
    pop   ds
    mov   ax, 3d02h
    mov   dx, offset log_name
    xor   cx, cx
    int   21h
    mov   bx, ax
    jnc   skip_creat
    mov   ah, 3ch
    mov   dx, offset log_name
    xor   cx, cx
    int   21h
    mov   bx, ax
skip_creat:
    mov   ax, 4202h
    xor   cx, cx
    xor   dx, dx
    int   21h
    mov   ds, si
    mov   es, si
    mov   dx, di
    mov   cx, -1
    xor   ax, ax
    repne scasb
    not   cx
    mov   ah, 40h
    int   21h
    mov   ah, 3eh
    int   21h
ret_log:
    pop   ds
    popa
;-- dbg log -

    cld
    mov   cx, -1
    push  ds
    pop   es
    mov   di, dx
    xor   ax, ax
    repne scasb
    not   cx
    dec   cx
    mov   dx, cx
    dec   di
    mov   al, '\'
fname:
    cmp   al, es:[di-1]
    je    cmp_name
    dec   di
    loop  fname
cmp_name:
    sub   dx, cx
    mov   cx, dx
    cmp   cx, BlProgLen
    jne   rest_jmp_old
    push  cs
    pop   ds
    mov   si, offset BlProg
next_nc:
    mov   al, es:[di]
    or    al, 20h
    cmp   al, ds:[si]
    jne   rest_jmp_old
    inc   di
    inc   si
    loop  next_nc
        
    push  cs
    pop   ds
    mov   ah, 9
    mov   dx, offset sPswPmt
    int   21h
    mov   ah, 0ah
    mov   dx, offset psw_buf
    int   21h
    xor   cx, cx
    mov   cl, psw_len
    cmp   cl, BlPassLen
    jne   rest_iret
    mov   si, offset BlPass
    push  cs
    pop   es
    mov   di, offset psw_data
    repe  cmpsb
    je    rest_jmp_old

rest_iret:
    pop   es ds
    popa
    popf
    stc
    mov   ax, 5
    iret

rest_jmp_old:
    pop   es ds
    popa
    popf

jmp_old:
    db    0eah
old_21h   dd      0

int_21h   endp

init:

    mov   ax, ds:[2ch]
    mov   es, ax
    mov   ah, 49h
    int   21h
    mov   word ptr ds:[2ch], 0

    mov   ax, 3521h
    int   21h
    mov   word ptr old_21h, bx 
    mov   word ptr old_21h[2], es
    mov   ax, 2521h
    lea   dx, int_21h
    int   21h

    lea   dx, init
    int   27h

end start


ps. мысли о какой-либо оптимизации меня не посещали, поэтому тут уж сами... smile

Автор: EASports 26.5.2007, 19:27
Рулез. Спасибо. Сначала не обратил внимания на эту прогу, не разобрался что называется. Но сегодня из-за безвыходности зашёл, скачал, откомпилил, разобрался и на её основе написал курсач. smile Клёво. Два часа и всё, а сидел дурак сутки, пытался сделать намного более хитрож...ым способом, ничего не получалось. Ещё раз огромное спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)