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

Long GetSpd(long ea);

Возвращает значение регистра SP (ESP) в произвольной точке функции относительно его оригинального значения.

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

Для специфичных случаев предусмотрена ручная коррекция (смотри описание функции SetSpDiff) но в большинстве случаев IDA и сама справляется с этой задачей.

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

.text:004010FF __amsg_exit proc near

.text:004010FF

.text:004010FF

.text:004010FF arg_0 = dword ptr 4

.text:004010FF

.text:004010FF cmp dword_0_408758, 2

.text:00401106 jz short loc_0_40110D

.text:00401108 call __FF_MSGBANNER

.text:0040110D

.text:0040110D loc_0_40110D:

.text:0040110D push [esp+arg_0]

.text:00401111 call __NMSG_WRITE

.text:00401116 push 0FFh

.text:0040111B call off_0_408050

.text:00401121 pop ecx

.text:00401122 pop ecx

.text:00401123 retn

.text:00401123 __amsg_exit endp

.text:00401123

Message(“%d \n”,

GetSpd(0x4010FF)

);

0

Message(“%d \n”,

GetSpd(0x401111)

);

-4

Message(“%d \n”,

GetSpd(0x401116)

);

-8

Message(“%d \n”,

GetSpd(0x401122)

);

-4

Message(“%d \n”,

GetSpd(0x401123)

);

0

В точке входа в функцию значение SP (ESP) всегда равно нулю. Затем, в нашем примере, оно изменяется командой push, заносящей в стек двойное слово.

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

Относительное значение ESP

Адрес

Инструкция

0

.text:0040110D

push [esp+arg_0]

-4

.text:00401111

call __NMSG_WRITE

В точке выхода из функции значение SP (ESP) так же должно равняться нулю. В противном случае стек был бы несбалансированным, и команда возврата вытолкнула из стека не адрес возврата, а что-то совсем иное.

В таком случае вероятнее всего, что IDA не смогла отследить все инструкции, модифицирующие значения стекового регистра (или сделала это неправильно). Рекомендуется обнаружить это место и скорректировать его вызовом SetSpDiff.

Операнд

Пояснения

Ea

Линейный адрес в теле функции

Return

Относительное значение стекового регистра SP (ESP)

Long GetSpDiff(long ea);

Возвращает относительное изменение стекового регистра SP (ESP) командой, расположенной по линейному адресу ‘ea’.

Например:

.text:004010FF __amsg_exit proc near

.text:004010FF

.text:004010FF

.text:004010FF arg_0 = dword ptr 4

.text:004010FF

.text:004010FF cmp dword_0_408758, 2

.text:00401106 jz short loc_0_40110D

.text:00401108 call __FF_MSGBANNER

.text:0040110D

.text:0040110D loc_0_40110D:

.text:0040110D push [esp+arg_0]

.text:00401111 call __NMSG_WRITE

.text:00401116 push 0FFh

.text:0040111B call off_0_408050

.text:00401121 pop ecx

.text:00401122 pop ecx

.text:00401123 retn

.text:00401123 __amsg_exit endp

Message(“%d \n”,

GetSpd(0x4010FF)

);

0

Message(“%d \n”,

GetSpd(0x401111)

);

-4

Message(“%d \n”,

GetSpd(0x401116)

);

-8

Message(“%d \n”,

GetSpd(0x401122)

);

-4

Message(“%d \n”,

GetSpd(0x401123)

);

0

Относительное значение ESP

Адрес

Инструкция

0

.text:0040110D

push [esp+arg_0]

-4

.text:00401111

call __NMSG_WRITE

Как и в случае с GetSpd необходимо задавать адрес начала следующей команды или точнее, конца текущей.

Операнд

Пояснения

Ea

Линейный адрес конца команды в теле функции

Return

Относительное изменение стекового регистра SP (ESP)

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