Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ida.final.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
6 Mб
Скачать

Long GetFrameSize(long ea);

Возвращает полный размер стекового фрейма в байтах. Он вычисляется по следующей формуле:

FrameSize == FrameLvarSize + FrameArgsSize + FrameRegsSize + ReturnAddresSize

То есть сумме размеров локальных переменных, аргументов, сохраненных в стеке регистров и адреса возврата всех вместе взятых.

Подробнее о каждой из них можно прочитать в описании функций GetFrameLvaerSize, GetFrameArgsSize, GetFrameRegsSize.

Специальной функции, возвращающий значение размера адреса возврата не существует, однако, он может быть вычислен по следующей формуле:

ReturnAddresSize == FrameSize - FrameLvarSize + FrameArgsSize + FrameRegsSize

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

Примеры использования:

seg000:0000 start proc near

seg000:0000 call sub_0_A

seg000:0003 call sub_0_10

seg000:0006 call sub_0_16

seg000:0009 retn

seg000:0009 start endp

Message(“0x%X \n”,

GetFrameSize(0x10000)

);

2

seg000:0010 sub_0_10 proc near

seg000:0010 push bp

seg000:0011 push ax

seg000:0012 mov bp, sp

seg000:0014 pop bp

seg000:0015 retn

seg000:0015 sub_0_10 endp ; sp = -2

Message(“0x%X \n”,

GetFrameSize(0x10010)

);

6

Message(“0x%X \n”,

GetFrameRegsSize(0x10010)

);

4

Как видно, в последнем случае стековый фрейм состоял из адреса возврата и сохраненных в стеке регистров. Однако, если команды расположить по другому, то результат изменится:

seg000:000A sub_0_A proc near

seg000:000A push bp

seg000:000B mov bp, sp

seg000:000D push ax

seg000:000E pop bp

seg000:000F retn

seg000:000F sub_0_A endp ; sp = -2

Message(“0x%X \n”,

GetFrameSize(0x1000A)

);

4

Message(“0x%X \n”,

GetFrameRegsSize(0x1000A)

);

2

Все команды, лежащие «ниже» (то есть в более старших адресах) относительно команды mov bp, sp (которая и определят стековый фрейм) в него не попадают и можно безболезненно заносить (выталкивать) команды из стека, не боясь разрушить стековый фрейм.

Операнд

Пояснения

Ea

Линейный адрес, принадлежащий функции

Return

Завершение

Пояснения

!=BADADDR

Размер стекового фрейма в байтах

BADADDR

Ошибка

Long MakeFrame(long ea,long lvsize,long frregs,long argsize);

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

Они расположены во фрейме в следующей последовательности.

Стековый фрейм

Локальные переменные

Сохраненные регистры

Аргументы, переданные функции

Адрес возврата из функции

При успешном завершении функция возвращает ID структуры, обеспечивающий доступ ко всем вышеперечисленным элементам. В противном случае функция вернет ошибку BADADDR.

Операнд

Пояснения

Ea

Любой линейный адрес, принадлежащий функции

lvsize

Размер локальных переменных в стековом фрейме

frrgs

Размер сохраненных регистров в стековом фрейме

argsize

Размер аргументов, передаваемых функции

Return

Завершение

Пояснения

!=BADADDR

ID структуры, обеспечивающей доступ ко всем элементам стекового фрейма

BADADDR

Ошибка

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

Например:

.text:00401487 __setargv proc near

.text:00401487

.text:00401487 var_8 = dword ptr -8

.text:00401487 var_4 = dword ptr -4

.text:00401487

.text:00401487 push ebp

.text:00401488 mov ebp, esp

.text:0040148A push ecx

.text:0040148B push ecx

MakeFrame(0x401487,0,0,0);

.text:00401487 __setargv proc near

.text:00401487 push ebp

.text:00401488 mov ebp, esp

.text:0040148A push ecx

.text:0040148B push ecx

.text:0040148C push ebx

Аргументы же функции никогда не удаляются из стекового фрейма, даже при уменьшении размера выделенного для них региона до нуля. Однако, это нарушает целостность всего фрейма и локальных переменных, лежащих «выше»

.text:00401520 sub_0_401520 proc near

.text:00401520

.text:00401520

.text:00401520 arg_0 = dword ptr 8

.text:00401520 arg_4 = dword ptr 0Ch

.text:00401520 arg_8 = dword ptr 10h

.text:00401520 arg_C = dword ptr 14h

.text:00401520 arg_10 = dword ptr 18h

.text:00401520

.text:00401520 push ebp

.text:00401521 mov ebp, esp

.text:00401523 mov ecx, [ebp+arg_10]

.text:00401526 mov eax, [ebp+arg_C]

.text:00401529 push ebx

MakeFrame(0x401520,0,0,0);

.text:00401520 sub_0_401520 proc near

.text:00401520

.text:00401520

.text:00401520 arg_0 = dword ptr 8

.text:00401520 arg_4 = dword ptr 0Ch

.text:00401520 arg_8 = dword ptr 10h

.text:00401520 arg_C = dword ptr 14h

.text:00401520 arg_10 = dword ptr 18h

.text:00401520

.text:00401520 push ebp

.text:00401521 mov ebp, esp

.text:00401523 mov ecx, [ebp+arg_10]

.text:00401526 mov eax, [ebp+arg_C]

.text:00401529 push ebx

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]