Программный вызов функции памяти внешней программы

# #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 байта из стека потока? Кроме того, как я должен заполнить это пространство? Не стесняйтесь отвечать.