Как получить доступ к стеку приостановленного потока, который еще не запущен? - PullRequest
2 голосов
/ 06 декабря 2011

Я хочу изменить стек вновь созданного удаленного потока, но после вызова CreateRemoteThread для создания потока в приостановленном состоянии стек не был выделен.

Я использую GetThreadContext, чтобы получитьадрес ESP после создания приостановленного потока, хотя, если я посмотрю на этот адрес в моем окне разборки в отладчике VS, он не был выделен.Кроме того, запись по этому адресу с использованием WriteProcessMemory каждый раз завершается неудачей.

Как я могу редактировать стек вновь созданного, но приостановленного удаленного потока?

Ответы [ 3 ]

1 голос
/ 06 декабря 2011

IIRC, у вас уже должен быть доступ к регистрам целевого потока, поэтому, если вы установите его одностадийный флаг и отмените его выполнение, будет выполнена одна инструкция, и вы вернете управление - но даже для запуска этогоодиночная инструкция, ее стек должен быть выделен.Это должно дать примерно такой же эффект, как ответ @ Edwin, но без необходимости изменять целевой поток.

1 голос
/ 07 декабря 2011

Когда вы получаете дескриптор потока, выделяется его стек (а также структура TIB).

Отладчик MSVS может показывать неверную информацию, поэтому не полагайтесь на нее.
Я не уверен, что контекст потока имеет правильные значения, возможно, он установлен позже.

Вы должны использовать TIB структуру для получения стековых адресов, если это действительно то, что вам нужно.

Если вы просто хотите вызвать функцию удаленно перед вызовом функции потока, вы можете использовать QueueUserAPC или RtlRemoteCall, оба работают, когда поток создается с флагом CREATE_SUSPENDED.

1 голос
/ 06 декабря 2011

То, что вы заявляете, кажется мне довольно логичным.Поскольку вы создали новый поток как приостановленный, еще не было вызова функции потока и, следовательно, нет стека.

Возможно, вы можете запустить поток как обычно и позволить потоку приостановить себя в качестве первой операции.быть сделано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...