Size: a a a

Ассемблер

2021 May 21

C

Cofeefee in Ассемблер
В момент, когда я пушу регистры прилетает вызов из ещё одного потока и rsp слетает.
Пока думаю сделать при входе в собственную нереентерабельную функцию инкрементировать счетчик, переключать rsp на буфер по счетчику и там уже играть с мьютексами.

Примерно так (условный код)
inc [ThreadCallCounter]
mov rsp, StackBuffer [ThreadCallCounter]
push rcx rdx ....
источник

A

Aleksandr in Ассемблер
у разных потоков разный стек
источник

C

Cofeefee in Ассемблер
Но что странно, глядя на отдизассембленный код функции CInternetSession:GetHTTPConnection из mfc - там никакими мьютексами и не пахнет, а в моём коде как только начинаю в стек пихать сохраняемые регистры - прилетает из второй, третьей, n-ного потока вызов и всё, упали
источник

D

Den in Ассемблер
я читал в linux сложнее, там для третьего кольлца действительно свои юзерстеки но системный вызов обращается к kernel стэку а он один и когда из разных  user процессов происходят системные вызовы они юзают этот общий системный стек
источник

C

Cofeefee in Ассемблер
Поэтому я и собираюсь стек по счетчику потока переключать
источник

A

Aleksandr in Ассемблер
зачем его переключать?
источник

C

Cofeefee in Ассемблер
Mfc на ring3 сидит
источник

A

Aleksandr in Ассемблер
оставайся в своем стеке, сохраняй регистры и дергай за мьютекс
источник

D

Den in Ассемблер
про винду не знаю пока к сожалению вот сам сейчас изучаю
источник

C

Cofeefee in Ассемблер
Так если у меня два одновременно вызова приходят, как потом при восстановлении регистров из стека понять к какому потоку восстановление принадлежит? Только стек по счетчику переключать (точнее буфер под стек)
источник

A

Aleksandr in Ассемблер
твою мать, а
источник

A

Aleksandr in Ассемблер
ты из стека в стек прыгаешь? или оно само прыгает?
источник

A

Aleksandr in Ассемблер
в каком стеке сохранил - в том и восстановишь. оно магическим образом контекст менять не будет
источник

A

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

C

Cofeefee in Ассемблер
Не, оно само прыгает. В отладчике начинаешь трассировать собственный код, а его штормить начинает, то внезапно на несколько инструкций rip прыгает, пока не допер что это из нескольких потоков прилетает вызов собственного перехватчика - две банки кофе выдул.

Я понимаю что происходит(мря функция из нескольких потоков вызывается) и почему(потому что нереентерабельна, как DOS), осталось понять как избежать такого.
источник

A

Aleksandr in Ассемблер
дык и пускай себе, каждый поток остается в своем контексте
источник

d

disba1ancer in Ассемблер
Не 10, а 11
источник

C

Cofeefee in Ассемблер
А у меня ещё прокладка в виде ещё одной dll.

Thread1: call MainDll, call CInternetSession:GetHTTPConnection-> call OwnHookDLL: transfer to OriginalMFC|HandleBySelf

И еще ещё второй поток, третий, который эту Main.dll выщывают
источник

A

Aleksandr in Ассемблер
далеко у тебя твои исходники на посмотреть?
источник

С

Сергей in Ассемблер
Аааахахаха! Думал никто не обратит внимание
👍👍👍👍
источник