Фундаментальные основы хакерства


Идентификация аргументов функций - часть 27


; сегмент из стека даже не извлекался!

 

lea    di, [bp+var_100]

; Получаем указатель на локальный буфер

 

push   ss

; Заносим его сегмент в стек

 

push   di

; Заносим смещение буфера в стек

 

push   0FFh

; Заносим макс. длину строки

 

call   @$basg$qm6Stringt14Byte    ; Store      string

; Копируем строку в локальный буфер (значит, arg_0 – это строка).

; Правда, совершенно непонятно зачем. Неужто нельзя пользоваться ссылкой?

; Дурной-дурной этот Turbo-Pascal!

; Да что делать – в самом Паскале строки передаются по значению :-(

 

mov    di, offset unk_1E18

; Получаем указатель на буфер вывода

; Тут надобно познакомимся с системой вывода Паскаля – она весьма разительно

; отличается от Си.

; Во-первых, левосторонний порядок засылки аргументов в стек не позволяет

; организовать поддержку процедур с переменным числом аргументов

; (во всяком случае, без дополнительных ухищрений)

; Но ведь WriteLn и есть процедура с переменным числом параметров. Разве нет?!

; Вот именно, что нет!!! Никакая это не процедура, а оператор!

; Компилятор еще на стадии компиляции разбивает ее на множество вызовов

; процедур для вывода каждого аргумента по отдельности. Поэтому,

; в откомпилированном коде каждая процедура примет фиксированное количество

; аргументов. В нашем случае их будет три: первая для вывода суммы двух

; чисел – этим занимается процедура WriteLongint, вторая – для вывода символа

; пробела в символьной форме – этим занимается WriteChar

и, наконец, последняя

; для вывода строки – WriteSting

; Размышляем далее – под Windows непосредственно вывести строку в окно и тут же

; забыть о ней нельзя, т.к. окно в любой момент может потребовать перерисовки –

; операционная система не сохраняет его содержимого – в графической среде

; при высоком разрешении это привело бы к большим затратам памяти.

; Код, выводящий строку, должен уметь повторять свой вывод по запросу.

; Каждый, кто хоть раз программировал под Windows, наверняка помнит, что весь




- Начало -  - Назад -  - Вперед -