Техника защиты компакт-дисков от копирования



              

"Раскрутка" стека - часть 4


Листинг 11 адрес возврата из праматеринской функции

Первое двойное слово –— это значение регистра ESI, который нам предстоит вручную восстановить; второе –— адрес возврата из функции. Нажатием <Ctrl>+<-G>, "0x6C2923D8" мы продолжаем "раскручивать" стек (листинг 3.12).:

Листинг 3.12. Дизассемблерный листинг прапраматеринской функции

6C2923D8             jmp             6C29237B

6C29237B             mov             eax,ebx

6C29237D             pop             esi

6C29237E             pop             ebx

6C29237F             pop             ebp

6C292380             ret             1Ch

Листинг 12 дизассемблерный листинг пра-праматеринской функции

Вот мы и добрались до восстановления регистров! Сместившись на одно двойное слово вправо (оно только что было вытолкнуто из стека командой RET), переходим в окно "Registers" и восстанавливаем регистры ESI, EBX, EBP, извлекая сохраненные значения из стека (листинг 3.13).:

Листинг 3.13. Содержимое регистров, ранее сохраненных в стеке вместе с адресом возврата

0012F500  77E61D49  6C2923D8  00403458

ß

6C29237D:pop esi

0012F50C  00000111  0012F540  6C2922AE ß6C29237E:pop ebx/pop ebp/ret 1Ch

Листинг 13 содержимое регистров, ранее сохраненных в стеке вместе с адресом возврата

Как вариант можно переместить регистр EIP на адрес 6C29237Dh, а регистр ESP на адрес 12F508h, после чего нажать на клавишу <F5> для продолжения выполнения программы. И этот прием действительно срабатывает! Причем, реанимированная программа уже "не ругается" на ошибку последней операции (как это было при восстановлении путем принудительного выхода из функции), а просто ее не выполняет. Красота!




Содержание  Назад  Вперед