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

Ваш аккаунт

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

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

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

пишу отладчик для *.com под Дос

11K
30 октября 2005 года
shock
16 / / 30.10.2005
пишу отладчик для *.com под Дос
так вот, пишу на Паскале (вынужден - пмшу в группе):
- перехватываю int 1h,
- устанавливаю TF
- запускаю отлаживаемую прогу: exec('...','');
...

и вот, проблеммы:
- не знаю адреса точки входа
- какой бы ком не экзэкутил, количаство шагов отладки всегда одинаковое(в обработчике int 1h веду счетчик). В чем дело? exec запрещает прерывания или как?
3.2K
30 октября 2005 года
foldem
52 / / 24.10.2005
Цитата:
Originally posted by shock
пишу отладчик для *.com под Дос
так вот, пишу на Паскале (вынужден - пмшу в группе):
- перехватываю int 1h,
- устанавливаю TF
- запускаю отлаживаемую прогу: exec('...','');
...

и вот, проблеммы:
- не знаю адреса точки входа
- какой бы ком не экзэкутил, количаство шагов отладки всегда одинаковое(в обработчике int 1h веду счетчик). В чем дело? exec запрещает прерывания или как?



дело в том что нужно литератури читать!!

11K
30 октября 2005 года
shock
16 / / 30.10.2005
Цитата:
Originally posted by foldem
дело в том что нужно литератури читать!!


может подскажешь какую, плз? А то мне че-то ничего на ум не идет - почему не работает?

3.2K
30 октября 2005 года
foldem
52 / / 24.10.2005
Цитата:
Originally posted by shock
может подскажешь какую, плз? А то мне че-то ничего на ум не идет - почему не работает?


вот несколько сайтов.Поищи там:
http://www.helloworld.ru
http://www.books.iuf.net/winnt/

11K
30 октября 2005 года
shock
16 / / 30.10.2005
Цитата:
Originally posted by foldem
вот несколько сайтов.Поищи там:
http://www.helloworld.ru
http://www.books.iuf.net/winnt/


Сенкс, надеюсь разберусь...
А так сходу не подскажешь в чем может быть проблема?

3.2K
30 октября 2005 года
foldem
52 / / 24.10.2005
Цитата:
Originally posted by shock
Сенкс, надеюсь разберусь...
А так сходу не подскажешь в чем может быть проблема?


так сразу не смогу подсказать

11K
30 октября 2005 года
shock
16 / / 30.10.2005
Цитата:
Originally posted by foldem
так сразу не смогу подсказать


И на том спасибо.

3.2K
30 октября 2005 года
foldem
52 / / 24.10.2005
Цитата:
Originally posted by shock
И на том спасибо.


;-)

299
30 октября 2005 года
3D Bob
885 / / 18.04.2005
Дос не может тебе запретить прерывание.
Дейсвие доса лишь до и после работы программы возможно.
Извини, не знаю стоит ли использовать exec
и вообще паскаль для таких вещей...
299
30 октября 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by shock
пишу отладчик для *.com под Дос
так вот, пишу на Паскале (вынужден - пмшу в группе):
- перехватываю int 1h,
- устанавливаю TF
- запускаю отлаживаемую прогу: exec('...','');
...

и вот, проблеммы:
- не знаю адреса точки входа
- какой бы ком не экзэкутил, количаство шагов отладки всегда одинаковое(в обработчике int 1h веду счетчик). В чем дело? exec запрещает прерывания или как?



В винде прерывания и флаги с регистрами, для КОМ программ, лишь эмуляция.


Какой адрес точки входа тебе нужно узнать?
Ком программы начинаются после пропуска в 100h.
Краткое описание 1h

Прерывание по вектору 1 генерируется после выполнения любой инструкции в тех случаях, когда флаг TF установлен в 1. Флаг TF автоматически сбрасывается при обработке любого прерывания, так что обработчик пошагового режима не будет сам выполняться в этом режиме (но после выхода из него TF будет внось установлен).
BIOS устанавливает пустой обрабочик INT 1, так что установка флага TF приведет лишь к (значительному) замедлению выполнения программы
MS-DOS не изменяет и не использует int 1
но это прерывание используется большинством отладчиков, в частности, отладчиком DEBUG

11K
30 октября 2005 года
shock
16 / / 30.10.2005
Цитата:
Originally posted by 3D Bob
Дос не может тебе запретить прерывание.
Дейсвие доса лишь до и после работы программы возможно.
Извини, не знаю стоит ли использовать exec
и вообще паскаль для таких вещей...



На Паскале пишу не из собстванных соображений - я пишу лишь функциональную часть проги - интерфейс, дамп и дизассеблер пишут еще два человека - на том же Паскале.
Есть еще ф-ция 4Bh доса, но я не уверен, что точно знаю как ей пользоваться, и будет ли это эффективнее Exec'a в паскале, если все это пишется в паскалевской вставке asm ... end.

11K
30 октября 2005 года
shock
16 / / 30.10.2005
Цитата:
Originally posted by 3D Bob
В винде прерывания и флаги с регистрами, для КОМ программ, лишь эмуляция.
.....



вообще пишу под виндой, но тестировал и загружаясь с Флопа под Досом.
Я перехватываю int 1h, после чего делаю следующее:
cli
pushf
pop ax
or ax, 100h ; устанавливаю TF
push ax
popf
sti
далее следует вызов отлаживаемой проги:
exec(FileName,'');
...
в обработчике я вывожу(напрямую в память)содержимое регистров и количество шагов отладки - а оно всегда одно и то-же(какую бы прогу я не отлаживал) - такое чувство, что во время запуска проги Досом запрещается прерывание отладки.

А в адресе точки входа мне нужен СЕГМЕНТ.

8.3K
09 ноября 2005 года
_edge [tkm]
48 / / 04.04.2005
2shock:

мог бы промолчать, но вижу что вас только путают.
можно много сказать. постараемся по существу :]


дело не в виндах. она конечно эмулирует окружение
x86, но все делает корректно -это не тот случай,
когда она мешает. установку tf=1 и перехват инта
вы, очевидно, делаете правильно. ошибка другого
плана. паскаль, как бы ни был оформлен exec(..) -
имхо пара вложенных call, вызывает i21.


вызов int21 на время своего выполнения "глушит"
tf: int -> pushf // cli / clear tf затем call far.
если выход (в загруженную прогу) осуществляется
через iret, трейс будет восстановлен и все ок.
но если возврат из прерывания производится через
retf 0002, трейс убивается вместе с флагами.

может, я не очень разбираюсь, но я бы не стал,
во -первых, использовать паскаль, во -вторых,
наивно полагаться на exec через i21. предложение,
если мы разбираем *.com, загружать их "ручками"
и делать это не на pascal (assembly?).


несколько ненужных фактов:

-внутри i21 попадает в msdos.sys, int13 и даже в
smartdrv, если он загружен.
-если не изменяет память, вызов ah=4b,i21 портит
большинство регистров (в т.ч. bp/sp).
-главная программа не получит упр-я, пока "дочка"
не завершится.

скачайте avputil.zip с моего сайта и потрассируйте
int21 с каким нибудь из безобидных значений ah,
скажем ah=02 (вывод символа в dl) или ah=30 (взять
версию дос). последователность действий:
запускаем отладчик, жмем alt+i -внизу появляется
таблица интов. выбираем клавишами со стрелками
нужный инт (21 :]), жмем enter. выбираем trace,
вводим значение ah во всплывшем окне регистров.

http://dizzie.narod.ru/avputil.zip
да, я знаю, сайт убогий :|

на днях планирую сделать обновление, есть мысль
выложить свои/чужие статьи/сорцы по трейсу.
11K
10 ноября 2005 года
shock
16 / / 30.10.2005
Цитата:
Originally posted by _edge [tkm]
2shock:

мог бы промолчать, но вижу что вас только путают.
можно много сказать. постараемся по существу :]



Огромное спасибо, что заинтересовались моим вопросом, не могли бы Вы еще кое что подсказать?

Да, я уже выяснил, что именно exec блокирует отладку, т.к., как я понял, при вызове ЛЮБОГО прерывания флаг трассировки сбрасывается в 0, так что я пытаюсь пока загружать дочернюю прогу сам: выделяю сегмент, в него по смещению 100h(дабы не попортить адреса) записываю содержание com'a,
по смещению 0h записываю Jmp назад в свою(родительскую) прогу, в том же PSP сохраняю свой DS,SP,SS(я ж делаю CS=DS=SS=ES)делаю push 0 и джампаю (ассемблерной вставкой) на PSPдочерней: 100h.
Вот тогда отладка работает, но только тогда, когда прога завершается ret'ом, а ведь есть вероятность, что прога завершится int 20h или 4ch(если не ошибаюсь) int 21h. Что тогда? Думаю может перехватывать и эти ф-ции прерываний? Во всех ли случаях поможет? И что можно было бы еще сделать?

8.3K
10 ноября 2005 года
_edge [tkm]
48 / / 04.04.2005
перехватывать нужно не только int 20 (можно в psp,
но как инт надежней), ah=4c int21, ah=0 int21
(terminate, могу ошибаться), но и int 27, ah=30
int21 для перехвата попыток програм остаться
резидентом*.

нужно ли хватать что либо еще? все зависит от
цели -можно "дампить" дизассемблированый код
отлаживаемой таким образом программы в файл,
можно через трассировку снимать навесную защиту,
скажем, цикл расшифровки кода перед исполнением.

*подобные вопросы обсуждались на forum.sources.ru,
в разделе низкоуровневого прогр. также так есть
faq, полезная штука, советую изучить. для того,
чтобы увидеть все темы за существование раздела,
нужно изменить "отображать за последние 90 дней"
внизу.
11K
12 ноября 2005 года
shock
16 / / 30.10.2005
Цитата:
Originally posted by _edge [tkm]
перехватывать нужно не только int 20 (можно в psp,
но как инт надежней), ah=4c int21, ah=0 int21
(terminate, могу ошибаться), но и int 27, ah=30
int21 для перехвата попыток програм остаться
резидентом*.


Спасибо, не учел бы - теперь учту

Цитата:

все зависит от
цели -можно "дампить" дизассемблированый код
отлаживаемой таким образом программы в файл,
можно через трассировку снимать навесную защиту,
скажем, цикл расшифровки кода перед исполнением.


а вот это не понял - не могли бы поподробнее?

Цитата:

*подобные вопросы обсуждались на forum.sources.ru,
в разделе низкоуровневого прогр. также так есть
faq, полезная штука, советую изучить. для того,
чтобы увидеть все темы за существование раздела,
нужно изменить "отображать за последние 90 дней"
внизу.


смотрел в разделе Assembler->RE/Protection - там в основном дизасм и обучалова по SofIce, а по дебаггингу своими руками, да еще и под старый добрый x86 - ничего(во всяком случае я не нашел).
В факах, вроде, тоже ничего.

11K
12 ноября 2005 года
shock
16 / / 30.10.2005
А если пользоваться exec'ом, только предварительно перехватив int 21h с установкой в обработчике TF и последующим вызовом старого обработчика?(вариант с проверкой на ф-цию 4bh?)
8.3K
12 ноября 2005 года
_edge [tkm]
48 / / 04.04.2005
1. поподробнее. а для чего вам нужен отладчик? :] чтобы
отлаживать опытную программу -в отладчиках есть встроенный
дизассемблер. что же касается снятия навесных защит -
многие dos программы упакованы pklite, lzexe и подобными,
т.е. сначала нужно пройти код разжимателя, а затем,
к примеру, когда для *.com ip=0100, уже изучать содержимое.
на wasm.ru в разделе статей, также google.ru с запросом
наподобие "антиотладочные приемы".

2. перехват int21. да, можно. кстати, оригинальная идея.
в тему будет добавить что вызов ah=4b al=03 (load overlay)
не выполнит программу, а только загрузит и передаст все
необходимые параметры для ее запуска вручную.
8.3K
14 ноября 2005 года
_edge [tkm]
48 / / 04.04.2005
произвел обновление на своем сайте.

80x0309 -assembly snippets. статьи и сорцы по
решению типовых задач lowlevel programming*.
pcgpe -games programing encyclopedia. то же самое
но уже с уклоном на программинг игр :]
helppc -справочник по dos internals (структуры,
инты и их функции etc). настоятельно рекомендую.
avpve_d -avp viral encyclopedia for dos :] ессно,
на настоящий момент является динозавром, *однако
все еще представляет интерес.
11K
15 ноября 2005 года
shock
16 / / 30.10.2005
Цитата:
Originally posted by _edge [tkm]
1. поподробнее. а для чего вам нужен отладчик?


Ну, фактически это просто курсак, так что пока серьезных защит он ломать не должен. Дизассемблер к нему уже готов, только еще не до конца уверен стоит ли сразу дизассемблировать весь com или лучше после выполнения каждой комманды дизассемблировать кусок памяти от текущей комманды и дальше.
Да, и еще этот отладчик пока пишется только для x86, так что практической пользы в нем не много.

Цитата:

2. перехват int21. да, можно. кстати, оригинальная идея.
в тему будет добавить что вызов ah=4b al=03 (load overlay)
не выполнит программу, а только загрузит и передаст все
необходимые параметры для ее запуска вручную.


Цитата:
ah=4b al=03 (load overlay)


насчет этого я тоже задумывался, только я так и не понял, каким образом потом передается управление CALL? JMP? или еще как - в Зубкове об этом вообще ничего не сказано. И вообще, может какого другого автора посоветуете(Зубков хорош, но слишком краток)?
Я еще на Вашем сайте посмотрю инфу. Спасибо.

8.3K
16 ноября 2005 года
_edge [tkm]
48 / / 04.04.2005
гм.. зубков хорош, не могу не согласиться :]
но есть классика: peter norton и robert jourdain.
как называется первая книга, точно не помню. назв.
второй "programmers problem solver for ibm pc/at".
обе книги начала 90х, но это как нельзя лучше
подходит для подобных задач. еще существует
большой справочник по прерываниям. он так и
называется ralph brown's interrupt list.

загрузить но не выполнять ax=4b03. смотрим в
гугл, поиск "ah=4b load overlay". пример:
http://arco.inf-cr.uclm.es/~dvilla/mirror/helppc/int_21-4b.html

исходя из представленного, es:bx указывает на
блок параметров, в котором нужно явно указать
сегмент, куда dos будет загружать "потомка".
гм.. так я и думал.. "all registers except CS
and IP are destroyed". но это не проблема.

что касается дизассемблирования, если все сделано
правильно, дизассемблер должен определять длину
каждой инструкции. прикрутив дизассемблер к trace
и "скормив" ему код цикла, получим вереницу из
одних и тех же команд, т.к. ip будет меняться
в рамках цикла >:].

mov cx,1234
@1: ;упрощенно, внутри обычно есть еще команды
loop @1

посмотреть бы на ваш дизассемлер. я в течении
продолжительного времени работаю над подобной
задачей, и никак не найду подходящего решения..
11K
17 ноября 2005 года
shock
16 / / 30.10.2005
Цитата:
Originally posted by _edge [tkm]
...получим вереницу из одних и тех же команд, т.к. ip будет меняться в рамках цикла >:].

mov cx,1234
@1: ;упрощенно, внутри обычно есть еще команды
loop @1

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



пока дизассемблируется просто содержимое com файла - ведь он просто копируется в сегмент по смещению 100h.
Но думаю лучше дизассемблировать дамп памяти от текущего IP и дальше (по-моему так делает эмулирующий отладчик для КР580) на каждом шаге.
Сам дизассемблер дезассемблирует(?! а что ему еще делать:)?!) расшифровывая комманду и параметры по опредиленному формату- по коду комманды и ее модификаторов. Может сложно, но возможно.

8.3K
17 ноября 2005 года
_edge [tkm]
48 / / 04.04.2005
дизасм должен не просто дизасмить >:] он еще
длину инструкции обязан определять. если известен
размер текущей инструкции, нет проблем с дизасмом
следующей.. это касаемо "загрузить и дизассемблить
целиком".

что относительно пошагового дизассемблирования, в
проге может встретиться защита от отладки, которая
может задетектить трейс или убить обработчик int1.
даже сама прога может использовать int1 для своей
работы. самое лучшее решение с int1 -вывести на
консоль дизасм инструкции, ждать соотв. реакции
со стороны пользователя (скажем "enter"), и если
все ок, исполнить данную иструкцию и идти дальше.

статья по защите от отладки (древняя но пойдет):
searchlores.org/protec/inbarraz.txt

я не навязываю свое мнение, это imho. кстати, мой
мыл [email]none1@inbox.ru[/email]. если не является тайной :],
поделитесь исходником дизассемблера, пожалуйста.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог