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 ?
Программа контролирующая запуск исполняемых файлов
Каких либо особых требований к реализации нет. TASM16, так что видимо под дос. Как пример мне предложили - при запуске файла проверяется исполняемый ли он, если исполняемый то запрашивается пароль. Что то вроде родительского контроля.
В ассемблере писал только простенькие программки вроде перевода в разные системы счисления, работы с файлами, поиска строки. Прошу подсказать способ реализации, ибо даже не знаю с чего начинать
Код:
Только я написал пример для 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
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
Ловит 21х прерывание, функцию открытия файла. Хотел сделать чтобы просто выводил строку, а потом уже запускал файл. Но столкнулся с проблемой, например
запускаю тасм.ехе, вместо строчки выводится кусок тасм.ехе по указанному смещению. Впринципе понятно что сегмент не тот...но как узнать в каком сегменте лежит резидент?
и еще...
Каким образом определить исполняемый это файл или нет? По заголовку?
И как дебажить резидентную программу?
Если резидент - COM программа, то сегмент данных будет CS. Например:
Код:
push ds
mov ax, cs
mov ds, ax
<действия>
pop ds
mov ax, cs
mov ds, ax
<действия>
pop ds