Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Ассемблер? Это просто! Учимся программировать


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler (Ассемблер)

Выпуск № 605
от 18.11.2006, 10:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 370, Экспертов: 29
В номере:Вопросов: 3, Ответов: 7


Вопрос № 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!
И найти не по маске а по прямому адресу!
Это возможно?

Приложение:

Отправлен: 12.11.2006, 13:18
Вопрос задал: Silinski I.L. (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: 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-й главы Олега Калашникова "Ассемблер? Это просто". В основном они касаются самой процедуры. Вот её оригинальный код:

Int_21h_proc proc
cmp ah,9
je Ok_09
jmp dword ptr cs:[Int_21h_vect]
Ok_09:
push ds
push dx

push cs
pop ds

mov dx,offset My_string
pushf
call dword ptr cs:[Int_21h_vect]

pop dx
pop ds
iret

Int_21h_vect dd ?

My_string db 'Њ®п бва®Є !$'

int_21h_proc endp

Во-первых не понятна сама строка 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
Комментарий оценки:
Луковкин Николай Иванович
Спасибо Вам за внимание....Я обязательно так и сделал бы, но товарищ К Касперский писал как раз на эту тему...он клёвый... .Про косяки отладчиков....Да тут мнего чиво сказать можно... типа каждый бит в команде что-то значит....хотелось бы не зубрить команды, а понять их, Вот такого бы да побольше !!!
Ещё раз срасибо...Почитайте на досуге....Впечатляет !!!


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.37 от 04.10.2006
Яндекс Rambler's Top100

В избранное