Вопрос № 62288: Здравствуйте уважаемые эксперты Помогите в написание программы под DOS!
Ну меня интерисует именно com а не exe!
И найти не по маске а по прямому адресу!
Это возможно?
..Вопрос № 62296: Здравствуйте уважаемые эксперты!
Не смог разобраться с некоторыми вопросами из 10-й главы Олега Калашникова "Ассемблер? Это просто". В основном они касаются самой процедуры. Вот её оригинальный код:
Int_21h_proc proc
cmp ...Вопрос № 62410: Здравствуйте, эксперты....
Прочитал К Касперского "Тонкости дизассемблирования" http://lib.aldebaran.ru/author/ kaspersky_kris/kaspersky_kris_tonkosti_dizassemblirovaniya/ kaspersky_kris_tonkosti_dizassemblirovaniya__0.html.. Круто !!!....
Вопрос № 62.288
Здравствуйте уважаемые эксперты Помогите в написание программы под DOS!
Ну меня интерисует именно com а не exe!
И найти не по маске а по прямому адресу!
Это возможно?
Отвечает: IceWolf
Здравствуйте, Silinski I.L.!
Текст программы с комментариями в приложении.
На сайте Олега Калашникова есть <a href="http://www.kalashnikoff.ru/Assembler/prog/helpassm.exe">отличный справочник</a> по функциям MS-DOS.
С уважением IceW0|f.
Приложение:
--------- И да покарает пингвин мелких и мягких!
Ответ отправил: IceWolf (статус: 2-ой класс)
Ответ отправлен: 12.11.2006, 15:07
Отвечает: Lonely Wolf
Здравствуйте, Silinski I.L.!
А зачем искать файл,если известно имя, при отсутствии файла ДОС выдаст ошибку.
Приложение:
--------- Ассемблер FOREVER!!!
Ответ отправил: Lonely Wolf (статус: Студент)
Ответ отправлен: 12.11.2006, 19:01
Вопрос № 62.296
Здравствуйте уважаемые эксперты!
Не смог разобраться с некоторыми вопросами из 10-й главы Олега Калашникова "Ассемблер? Это просто". В основном они касаются самой процедуры. Вот её оригинальный код:
Во-первых не понятна сама строка dword ptr cs:[Int_21h_vect]
Чей регистр CS - оригинального обработчика 21-го прерывания или же нашего собственного?
Строка pushf зачем нужна если в книге говорится о том, что при вызове прерываний процессор сам сохраняет cs:ip и флаги да и команда iret чем отличается от popf?
И наконец как понять:
mov word ptr Int_21h_vect,bx
mov word ptr Int_21h_vect+2,es
Что значит vect+2? Указывает на смещение? Да и вообще эти две строки нам необходимы при вызове dword ptr cs:[Int_21h_vect]?
Вопросов много и очень надеюсь на простое объяснение без тяжёлых терминов.
Заранее спасибо!
Отправлен: 12.11.2006, 14:05
Вопрос задал: Paltus (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: IceWolf
Здравствуйте, Paltus!
Давайте по порядку:
dword ptr cs:[Int_21h_vect]-указание на двойное слово, которое лежит в переменной Int_21h_vect. Регистр CS ввегда указывает на текущий сегмент-т.е.сегмент, в котором находится выполняемая инструкция. Так как код и данные у нас в одном сегменте мы ссылаемся на то, что лежит в сегменте CS (здесь и кода и данных одновременно). Просто же написать dword ptr Int_21h_vect мы не можем, т.к. по умолчанию мы обратимся в DS:[Int_21h_vect], но регистр ds в этот момент укизывает на другой сегмент, и нужного значения мы не
получим(переменная то в другом сегменте).
mov word ptr Int_21h_vect,bx
mov word ptr Int_21h_vect+2,es
В Int_21h_vect у нас храниться адрес оригинального обработчика 21h прерывания-двойное слово-сегмент:смещение. Но из-за принципа "младщий байт по младшему адресу в первое слово кладём смещение, а во второе(+2 -т.к. слово-2 байта)-сегмент. Т.к. мы кладем слова, а не байты в памяти ни переврнуться. Пример:
пусть в bx было 1122h, а в es 3344h.Тогда дамп памяти будет выглядеть так: 22 11 44 33. jmp dword ptr cs:[Int_21h_vect] "возьмёт" из памяти ДВОЙНОЕ СЛОВО, перевернёт и передаст управтение на 3344:1122. MOV'ы кладут в переменную тот самый адрес(в моем примере в Int_21h_vect слово 1122h, а в Int_21h_vect+2 -3344h.
pushf
Посмотрите как мы вызываем прерывание: call dword ptr cs:[Int_21h_vect] не int'ом, а call'ом. Отличие в том, что int перед адресом возврата толкает в стек регистр флагов, а call нет. Но выход из оригинального прерывания по-прежнему команда iret, а не ret, который используется в связке с call'ом. Iret после выхода из прерывания должен восстановить из стека регистр флагов, но как же он его восстанавит, если call его не сохранил. Вот и сохраняем мы его сами командой pushf, а извлекает его из стека команда iret.
Call dword ptr [адрес]<=>push ip
push cs
jmp dword ptr адрес
int xx <=>pushf
push ip
push cs
jmp dword ptr 0:[xx*4]
iret <=>pop cs
pop ip
popf
ret <=>pop cs
pop ip
Команды push/pop ip не существует, это все только для объяснения того, что делают команды. Пользуйтесь отладчиком-понимание придёт быстрее. Надеюсь я вам помог, ещё больше надеюсь, что вас не запутал.
С уважением IceW0|f.
--------- И да покарает пингвин мелких и мягких!
Ответ отправил: IceWolf (статус: 2-ой класс)
Ответ отправлен: 12.11.2006, 19:01
Отвечает: Lonely Wolf
Здравствуйте, Paltus!
Все на самом деле очень просто. dword ptr cs:[Int_21h_vect] означает что надо прыгнуть(вызвать) на метку используя сегмент и смещение - дальний прыжок. CS сегмент нашего кода где располагается наш обработчик. PUSHF нужна перед call dword ptr cs:[Int_21h_vect] т.к. мы вызываем истинный int 21h. Прерывание заканчивается iret(вытаскиваем сегмент смещение и регистр флагов), а при call dword ptr cs:[Int_21h_vect] регистр флагов не сохраняется, надо его сохранить в стеке вручную.
mov word ptr Int_21h_vect,bx
mov word ptr Int_21h_vect+2,es
PTR это приведение типов, bx и es это слова т.е.2 байта. А переменная Int_21h_vect - dd, 2 слова, 4 байта. Вот мы и записываем сначала bx, а потом , что бы не затереть уже записанное сдвигаемся на слово(2 байта) и записываем переменную es.
--------- Ассемблер FOREVER!!!
Ответ отправил: Lonely Wolf (статус: Студент)
Ответ отправлен: 12.11.2006, 19:02
Вопрос № 62.410
Здравствуйте, эксперты....
Прочитал К Касперского "Тонкости дизассемблирования" http://lib.aldebaran.ru/author/ kaspersky_kris/kaspersky_kris_tonkosti_dizassemblirovaniya/ kaspersky_kris_tonkosti_dizassemblirovaniya__0.html.. Круто !!!., но возник вопрос., где можно качнуть справочник... типа машинные коды -- intel-ассемблер-команды...
Спасибо
Отправлен: 13.11.2006, 09:03
Вопрос задал: Alex_c (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Вiктор
добрый день, Alex_c!
скачать справочник можно с официального сайта интел (на английском). Нормальное описание. Точного адреса и названия документа не помню.
--------- ни дня без строчки (но не получается)
Ответ отправил: Вiктор (статус: 8-ой класс)
Ответ отправлен: 13.11.2006, 11:26 Оценка за ответ: 4 Комментарий оценки: ...точно..., а русская где-то есть ??
Отвечает: IceWolf
Здравствуйте, Alex_c!
Это по командам:
80386: http://www.kalashnikoff.ru/Assembler/prog/i80386.exe Язык-русский
80486: http://www.kalashnikoff.ru/Assembler/prog/i80486.exe Язык-русский
MMX : http://asm.shadrinsk.net/cgi-bin/pl/proba.pl?6 Язык-русский
Pentium: http://asm.shadrinsk.net/pentium.htm Язык-русский
Про формирование машинных кодов написано, например, в книге Юрова
http://openlib.org.ua/ru/download/books/10/0/
Посмотите на http://openlib.org.ua/ , там много книг по ассемблеру, может подберёте ещё что-нибудь.
С уважением IceW0|f.
--------- И да покарает пингвин мелких и мягких!
Ответ отправил: IceWolf (статус: 2-ой класс)
Ответ отправлен: 13.11.2006, 17:49 Оценка за ответ: 5 Комментарий оценки: Спасибо!! Товарищ...COOl Ice wolf ..за помощь...
Отвечает: Луковкин Николай Иванович
Здравствуйте, Alex_c!
Я очень рад что Вы прочитали эту статью!
Кроме этого у него есть статья, а лучше прочитать книгу:
"Образ мышления IDA" Вам станет ясно и понятно принцип работы и команды в работе с этим замечательным дизассемблером!
По поводу Вашего вопроса я могу Вам сказать одно - запускаете программу в отладчике (например OllyDbg), смотрим адрес, затем идет машинный код, после чего команда ассемблера.
Т.е. такая команда:
009C905E 55 PUSH EBP
или
009C908E 61 POPAD
или
009C9065 60 PUSHAD
Если Вы очень часто практикуетесь с отладчиком (OllyDbg или SoftICE), с целью изучения написанной Вами программы, мой совет:
1. Запоминайте машинный код, т.е. если машинный код будет смотрется в отладчике как - 61, 100% что после этого кода последует команда POPAD (и ни какая другая)!!!
2. Я знаю человека (профессионала)! который может читать ассемблерный листинг программы только по машинному коду - это суперкласс!!!
--------- Главным критерием эффективности того или иного пути может служить лишь то, достиг или нет крекер конечного результата!!!
Ответ отправил: Луковкин Николай Иванович (статус: 3-ий класс)
Ответ отправлен: 14.11.2006, 13:30 Оценка за ответ: 4 Комментарий оценки: Луковкин Николай Иванович Спасибо Вам за внимание....Я обязательно так и сделал бы, но товарищ К Касперский писал как раз на эту тему...он клёвый... .Про косяки отладчиков....Да тут мнего чиво сказать можно... типа каждый бит в команде что-то значит....хотелось бы не зубрить команды, а понять их, Вот такого бы да побольше !!! Ещё раз срасибо...Почитайте
на досуге....Впечатляет !!!