Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Программа контролирующая запуск исполняемых файлов

28K
11 апреля 2009 года
CODE-VX
9 / / 08.10.2007
Курсовик. Тема в названии темы :)

Каких либо особых требований к реализации нет. TASM16, так что видимо под дос. Как пример мне предложили - при запуске файла проверяется исполняемый ли он, если исполняемый то запрашивается пароль. Что то вроде родительского контроля.

В ассемблере писал только простенькие программки вроде перевода в разные системы счисления, работы с файлами, поиска строки. Прошу подсказать способ реализации, ибо даже не знаю с чего начинать
399
12 апреля 2009 года
KIV
432 / / 20.01.2009
Если под DOS - то можно просто перехватить вызов int 0x21. Не скажу сейчас точный номер функции, но код приблизительно получается такой:
Код:
xor ax, ax
mov es, ax
mov ax, [es:0x21 * 4]
mov [old_int_21_ofs], ax
mov ax, [es:0x21 * 4 + 2]
mov [old_int_21_seg], ax
mov word[es:0x21 * 4], handler
mov ax, cs
mov word[es:0x21 * 4 + 2], ax
...
handler:
cmp ax, <номер функции запуска программы>
jne run_old
<необходимые действия>
run_old:
jmp far[old_int_21]
...
old_int_21:
old_int_21_ofs dw ?
old_int_21_seg dw ?

Только я написал пример для FASM, поскольку я знаю его намного лучше, чем TASM.
Программа сохраняет старое значение вектора прерывания 0x21 и заменяет его своим. Если это не вызов функции загрузки и исполнения файла, то происходит просто переход на старый обработчик, иначе перед переходом выполняются какие-либо действия, а управление может и быть и не передано (неверный пароль). Следует помнить, что handler - это обработчик прерывания и если мы не передаём управление старому обработчику, то мы должны выходить с помощью IRET. При завершении программы следует востановить старый вектор прерывания:
 
Код:
xor ax, ax
mov es, ax
mov ax, [old_int_21_ofs]
mov [es:0x21 * 4], ax
mov ax, [old_int_21_seg]
mov [es:0x21 * 4 + 2], ax
28K
12 апреля 2009 года
CODE-VX
9 / / 08.10.2007
С этим чутка разобрался. Переделал пример резидентной программы из учебника Зубкова.

Ловит 21х прерывание, функцию открытия файла. Хотел сделать чтобы просто выводил строку, а потом уже запускал файл. Но столкнулся с проблемой, например

запускаю тасм.ехе, вместо строчки выводится кусок тасм.ехе по указанному смещению. Впринципе понятно что сегмент не тот...но как узнать в каком сегменте лежит резидент?

и еще...

Каким образом определить исполняемый это файл или нет? По заголовку?
И как дебажить резидентную программу?
399
12 апреля 2009 года
KIV
432 / / 20.01.2009
Зачем перехватывать открытие файла? Эта функция используется для открытия файлов (в том числе исполняемых) для чтения-записи, но не для выполнения. Надо перехватить функцию запуска программы. Проверять заголовок получится только для EXE программ (все EXE программы начинаются с сигнатуры "MZ"), потому что COM не имеет заголовка или каких либо ещё признаков исполняемости. Придётся предпологать, что файл, который запускается через эту функцию исполняемый.

Если резидент - COM программа, то сегмент данных будет CS. Например:
 
Код:
push ds
mov ax, cs
mov ds, ax
<действия>
pop ds
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог