Стек
-
В этой теме рассказано о том что такое стек потока
Стек потока представляет собой временное хранилище данных для работы с ними. Данные могут быть помещены в стек и достаны из него с помощью разных инструкций ассемблера. Стек на самом деле является просто выделенной памятью.
Поток получает странницу памяти представляющую стек при создании и хранит текущее смещение (адрес) стека в регистре esp.
Изначально стек пустой, то есть имеет нулевые значения. Для взаимодействия со стеком есть специальные инструкции:push
- Сдвинуть адрес стека (вычесть из esp) и записать в него значение. В 64 битных процессах сдвигает стек на 8 байт, в 32 битных процессах на 4 байта.push 5 //Сдвигает стек (значение адреса в esp) и записывает по адресу стека число 5 push [адрес] //Тоже самое, но загружает значение из адреса push eax //Тоже самое, но загружает значение регистра
pop
- Прочитать из стека и сдвинуть адрес стека (добавить к esp) и записать в него значение. Правила такие же как у push по разрядности процессов.push 5 pop eax //Выгружает из стека число 5 в регистр eax, теперь в нём число 5 push 6 pop [адрес] //Выгружает из стека число 6 по адресу
Использование обычных команд для работы со стеком
//Аналог push 5, это то что он делает sub esp,4 mov [esp],5 //Аналог pop eax, это то что он делает mov eax,[esp] add esp,4 //Загрузка и чтение нескольких разных значений из стека push 5 push 4 push 8 mov eax,[esp] //eax = 8 mov ecx,[esp+4] //ecx = 4 mov ebx,[esp+8] //ebx = 5 add esp,#12 //Или add esp,C в шестнадцатеричной системе счисления //Пример замены значения в стеке и выгрузки командой pop push 5 mov [esp],8 pop eax //eax = 8
В Cheat Engine стек можно увидеть при выполнении отладки процесса, о которой рассказано в следующих статьях.