Шаг 120.
Локальные переменные

    На этом шаге мы рассмотрим определение локальных переменных.

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


Рис.1. Пример задания локальных переменных

    Взгляните на рисунок 1. Две переменные var_54 и var_28 являются, несомненно, массивами типа DWORD. Причем если на первый отводится 28H байт, т. е. 40 байт или 10 элементов массива, то на второй 54H-28H=2CH=44 или 11 элементов массива. И всего, следовательно, под локальные переменные зарезервировано 84 байта. А что означает команда add esp, 0FFFFFFACH? 0-0FFFFFFACH = 54H, что в десятичном исчислении и есть 84.

    Но вернемся опять к фрагменту из рисунка 1. Посмотрим, как выглядит начало функции main в дизассемблере W32Dasm.


Рис.2. Фрагмент программы в дизассемблере W32Dasm

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

    Текст исходной программы на языке C++ можно взять здесь.

    На следующем шаге мы рассмотрим идентификацию функций и процедур.




Предыдущий шаг Содержание Следующий шаг