# #assembly #stack #x86-64 #callstack #cheat-engine
Вопрос:
Я переворачиваю эту программу x64 и пытаюсь вызвать функцию этой целевой программы через отладчик. Каждый раз, когда я нажимаю «Ударь меня» , числовое значение вычитается.
Я нашел вызывающего эту функцию (я добавил в нее точку останова, и она прерывается, когда я нажимаю кнопку «Ударь меня»). Вот он, соответствующий код:
Я знаю, что соглашение о вызове x64 заключается в передаче аргументов через RCX, RDX, R8 и R9. Я хочу вызвать эту функцию программно, и я планирую сделать это, выделив программе память (через функцию отладчика) и введя соответствующий код вызова «ударь меня». После того, как я создам поток на нужном адресе выделенной памяти (это вызовет функцию «ударь меня» программно).
Это код, который я написал:
но сразу после этого (создание потока 0x014D0000
) программа завершает работу. Почему? Я что-то упускаю?
Комментарии:
1. Вам также необходимо выделить теневое пространство в стеке и, возможно, позаботиться о выравнивании стека до 16 байт. Для получения подробной информации обратитесь к соответствующим документам ABI. Вероятно, в вики-теге [x86] тоже есть полезный вопрос, связанный с этим.
2. @fuz, теневое пространство AFAIK не требуется (это просто для целей отладки).
3. Нет. Функции могут хранить произвольные данные в теневом пространстве. И при включенной оптимизации вполне вероятно, что они это сделают.
4. @fuz хорошо. Я понятия не имею, как это создать. Может быть, вы могли бы показать мне пример его создания? Я выделяю место в стеке, чтобы создать теневое пространство (
sub rsp,32
). Достаточно ли вычесть 32 байта из стека потока? Кроме того, как я должен заполнить это пространство? Не стесняйтесь отвечать.