Сейчас на форуме: UniSoft, laslo, bartolomeo (+5 невидимых)

 eXeL@B —› Программирование —› Остановить Non-Alertable поток
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 05 ноября 2011 15:02 · Поправил: Hexxx
· Личное сообщение · #1

Как-то можно временно остановить Non-Alertable поток? Мне нужно ему в стек кое-чего прописать, а потом отпустить.

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 56.1 (постоянный), 9thx
Активность: 0.040
Статус: Участник

Создано: 05 ноября 2011 15:27
· Личное сообщение · #2

SuspendThread — не то?



Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 05 ноября 2011 15:55
· Личное сообщение · #3

Что делает поток ?



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 05 ноября 2011 16:34 · Поправил: Hexxx
· Личное сообщение · #4

vptrlx пишет:
SuspendThread — не то?

SuspendThread работает через APC. Дальше пояснять надо почему Non-Alertable не остановится?

Сообщение посчитали полезным: int
стыдно товарищ int

bowrouco пишет:
Что делает поток ?

Работает.

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 05 ноября 2011 17:05
· Личное сообщение · #5

Hexxx

> SuspendThread работает через APC.

Она работает не через APC, а через special-APC, точнее саспенд-апк. Сие доставляется при возврате из прерываний шедулером. Ну раз не известно какой поток(кпл), чего он делает и саспендтред не робит, то значит и гет/сетконтекстапк тоже работать не будут.. ничего больше не могу предложить.



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 05 ноября 2011 17:17 · Поправил: Hexxx
· Личное сообщение · #6

bowrouco пишет:
ничего больше не могу предложить.

Я могу предложить, но мне оно не нравится:
делаем Dpc процедуру которая крутится в цикле, дальше каждому процу даем ее. Все, все процы висят намертво, выполняя только эту DPC процедуру. Естественно один проц нужно оставить себе и задрать IRQL до DISPATCH, чтобы не переключилось.

Так работает, но мне так не нравится, потому что всю систему замораживаю...

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 05 ноября 2011 17:26 · Поправил: bowrouco
· Личное сообщение · #7

Hexxx
Значит тред ядерный. Так разрешите доставку апк

> Все, все процы висят намертво, выполняя только эту DPC процедуру.

С таким успехом можно IPI послать, в этом случае IRQL не имеет значения. В ней все потоки будут остановлены в системе, кроме текущего.

Всёже зачем вам стек потока, который не известно что выполняет ?



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 06 ноября 2011 01:05 · Поправил: Hexxx
· Личное сообщение · #8

Hexxx пишет:
Так разрешите доставку апк

Как именно?

bowrouco пишет:
Всёже зачем вам стек потока, который не известно что выполняет ?

Ответ на этот вопрос не связан с первоначальной темой. Я перебираю потоки если нахожу подходящий - правлю ему стек. Знание для каких целей, никак не поможет решить проблему блокирования потока.

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 56.1 (постоянный), 9thx
Активность: 0.040
Статус: Участник

Создано: 06 ноября 2011 01:33
· Личное сообщение · #9

Hexxx пишет:
SuspendThread работает через APC. Дальше пояснять надо почему Non-Alertable не остановится?

на заметку:
http://www.dcl.hpi.uni-potsdam.de/research/WRK/2009/01/what-does-suspendthread-really-do/index.html

А проблема-то в чём? некоторые потоки не саспендятся? Может и не надо саспендить те, которые не саспендятся, или искомый именно такой?



Ранг: 65.4 (постоянный), 10thx
Активность: 0.020
Статус: Участник

Создано: 06 ноября 2011 01:37
· Личное сообщение · #10

А почему саспед не работает? Должен работать даже для non-Alertable только надо переключится в системный процесс чтобы PreviousMode был KernelMode.



Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 06 ноября 2011 01:40 · Поправил: bowrouco
· Личное сообщение · #11

V0ldemAr
Может !IF или есчо какая причина.

> Знание для каких целей, никак не поможет решить проблему блокирования потока.

Наоборот, это самое главное и от этого зависит решение. Может можно смаршрутизировать или вообще не трогать стек.

Да и вообще есть такое понятие как баланс стека и два списка SFC и SEH, по ним можно найти текущий стековый фрейм и не нужно знать текущее значение Esp. Да и дно стека хранится в TSS/EPROCESS. Это наверно такой же лол h**p://rootkits.su/index.php/topic,24.msg471.html#msg471



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 06 ноября 2011 20:15 · Поправил: Hexxx
· Личное сообщение · #12

Я меняю в стеке один из адресов возврата. Пока поток выполняется он может изменить стек, и не важно как ты до стека доберешься. Важно именно остановить выполнение.

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 06 ноября 2011 22:33 · Поправил: bowrouco
· Личное сообщение · #13

Hexxx
Почитайте руткитсы. Отложенная передача управления сейчас механизм единственно актуальный для юзания в руткитах. Это столь гибкая технология, что позволяет заменить фактически всё ядро так, что подмену никто не заметит. В основе лежит 3 типа маршрутизации. Ваша задача сводится к этому решению, ну если нормально решать без извратов типа DPC. Проблема в не желании рассматривать механизм. На руткитсы ссылка была как прикол, там аверы добавили комент в свой говнокод типо мега привад и при попытке ресерча меня отправят в газовую камеру
Также и у вас - вы не говорите цель и изначальную задачу, а пытаетесь решить задачу совершенно не приемлемым способом. Аналогично как и патчи - все их юзают, да дерьмо конечно, но они не могут понять что заглянув внутрь, глубже откроется истина.
Замена адресов возврата это S-маршрутизация. В вашем же случае вы решили использовать W-маршрутизацию, тоесть потоковое переключение, хотя и немного извращённое. S-rt выполняется обычно в текущем потоке до перехода на целевой код, причём NL понижается, это важно. Поэтому я сразу и спросил про вашу конкретную цель.

Сабж http://indy-vx.narod.ru/Bin/IDPxSrt.zip

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



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 06 ноября 2011 23:14 · Поправил: Hexxx
· Личное сообщение · #14

bowrouco пишет:
пытаетесь решить задачу совершенно не приемлемым способом

После таких слов вспоминается баш:
xxx: Словно умудренные жизненным опытом стервятники в пустыне, они смотрят вслед проползающим путникам. На вопрос, где можно напиться, они долго обсуждают, нужна ли тебе вода и неизменно приходят к выводу, что нет, тебе, брат, вода ни к чему. Неспешно перечисляют причины, по которым тебе лучше жить без воды. И ни один из них не покажет в какой стороне колодец.

почитаю конечно про эти маршрутизации, но помоему это не совсем то...

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 06 ноября 2011 23:25
· Личное сообщение · #15

Hexxx
Потомучто вы не просите воды, ибо секретно.



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 07 ноября 2011 00:10 · Поправил: Hexxx
· Личное сообщение · #16

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

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 07 ноября 2011 00:19
· Личное сообщение · #17

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

> способ остановить поток

Поток остановлен если он отложен(задача переключена), это временно, в это время его контекст доступен, это инициируется при исключениях, прерываниях. APC, DPC, IPI, BUGCHECK, MmAccessFault() etc. это второстепенные механизмы, можно инициировать их при необходимости. Стек потока доступен в любой момент времени, он выгружаемый, но этим ядро рулит и не значительно на низких IRQL.



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 07 ноября 2011 00:54 · Поправил: Hexxx
· Личное сообщение · #18

В стеке хз-скольких потоков в системе есть адрес моего драйвера, из-за того что я юзаю один хитрый хук. Когда мне нужно выгрузиться, я не могу вечно ждать когда потоки вернутся. Поэтому я убираю свой адрес из стека, пробегаясь по всем потокам и исправляя их стек. А чтобы никто вдруг случайно не дернулся и не перезаписал стек, который я правлю, я замораживаю всю систему.

bowrouco пишет:
можно инициировать их при необходимости

Пока слабо представляю как можно без последствий на скаку тормознуть отдельный поток

p.s. вы случаем не Clerk aka Indy? Потому что терминологию s-маршрутизация и w-маршрутизация, насколько я смог нагуглить, использует только он. Форсит мем И да, мне эта технология походу не подойдет, мне не нужно получать управление через стек.

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 07 ноября 2011 01:18
· Личное сообщение · #19

Hexxx

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

Я уже понял по краткому описанию.

Не могу представить зачем такая манипуляция нужна, стаб в пуле не требует ресурсов. Тогда я бы поступил так - понизил IRQL до пассива, перечислил все потоки в системе(слепок ?), получил ссылку на обьект для каждого, извлёк ссылку на стек из обькта, просканил стек вниз для поиска ссылки там, либо извлёк её из SFC, выполнив бектрейс. Для этого не нужно останавливать ось. Но всёже поступать таким образом очень не тру, даже не годно. Пересмотрите механизм ваших "хуков".



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 07 ноября 2011 12:56 · Поправил: Hexxx
· Личное сообщение · #20

bowrouco пишет:
просканил стек вниз для поиска ссылки там

на живом потоке? как?

bowrouco пишет:
Пересмотрите механизм ваших "хуков".

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

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 07 ноября 2011 13:36 · Поправил: bowrouco
· Личное сообщение · #21

Hexxx

> на живом потоке? как?

Любой живой поток имеет стек. Стек такого потока в любой момент времени может быть двух типов обычный или процессорный(DPC-стек). Второй хардварный, например для обработки сисколов или доставки DPC. Стек описан в обьекте, это аллоцированный стек(там обычно т-фрейм лежит), текущие границы стека, в их пределах стек всегда валиден(хотя и может быть выгружен) и дно стека для шедулера(при переключении на другую задачу туда сохраняется текущий Esp). Также для рабочих потоков стек описан в TSS, он туда загружается шедулером. Единственная проблема может быть с теневыми колбеками - стек переключается, поэтому наверно придётся для таких потоков(gui) развернуть стек колбеков.

> не могу отказаться я от него...
Что мешает использовать не выгружаемую память для стаба ?



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 07 ноября 2011 14:06 · Поправил: Hexxx
· Личное сообщение · #22

Для меня проблема в том, что когда я сканирую стек потока, поток продолжает выполняться. Т.е. пока я досканирую стек, поток может уже там все перезаписать. И я или перезапишу стек параллельно с ним или вычитаю какую-то хрень. Нельзя заниматься чтением и записью пока потоки бегают.
Остальные описанные вещи, меня не напрягают.

bowrouco пишет:
Что мешает использовать не выгружаемую память для стаба ?

политика партии

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 07 ноября 2011 14:16
· Личное сообщение · #23

У меня недавно была похожая проблема, тупо поставил бряк из TitanEngine и все.



Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 07 ноября 2011 14:26
· Личное сообщение · #24

Hexxx
> Т.е. пока я досканирую стек, поток может уже там все перезаписать.
А разница, если не известно что в стеке. Там либо есть ваше значение, либо его нет и без разницы что поток остановлен.

> политика партии
Ну да, наверно единственная причина



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 07 ноября 2011 14:36 · Поправил: Hexxx
· Личное сообщение · #25

bowrouco пишет:
А разница, если не известно что в стеке. Там либо есть ваше значение, либо его нет и без разницы что поток остановлен.

т.е. чихать мы хотели на гонки потоков...

Vovan666 пишет:
тупо поставил бряк из TitanEngine и все.

Тупо в kernel mode? Интересно как... TitanEngine уже в ring-0 работает...

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 07 ноября 2011 14:43 · Поправил: bowrouco
· Личное сообщение · #26

Hexxx
Имхо вам в ядро есчо рановато лезть).



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 07 ноября 2011 14:50 · Поправил: Hexxx
· Личное сообщение · #27

bowrouco пишет:
Имхо вам в ядро есчо рановато лезть).


тро-ло-ло ло-ло-ло охо-хо-хо охо-хо-хо!

И все же интересно почему такое гиперобобщение на основе одного факта?

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 07 ноября 2011 16:11 · Поправил: bowrouco
· Личное сообщение · #28

Hexxx

> почему такое гиперобобщение на основе одного факта?

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




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 07 ноября 2011 16:40
· Личное сообщение · #29

Насколько мне известно Отложенная передача управления действительно очень гибкая, сам майкрософт писал это в доке, ресирч доки, нужно искать что то типо KiInsertDeferredReadyList по теме шедулинга, там меняли стэк как раз таким образом.

bowrouco пример руткита есть какой-нибудь?

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube


| Сообщение посчитали полезным: Hexxx

Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 07 ноября 2011 20:53
· Личное сообщение · #30

bowrouco пишет:
Потому что эта задача нормально не решается. Причина в вашем кривом механизме, иначе не потребовалось бы такое делать. А раз вы не смогли механизм построить корректно, то следовательно и не разбираетесь вообще в оси, так как манипуляции с потоками по своей сути не отличаются в юзермоде и ядре. Вот получается что и обсуждать это смысла нет.

Спасибо за диагноз док. А теперь моя очередь: по предложенной задаче вы сначала повели меня не туда куда надо, потом долго выясняли для чего мне это, хотя это было не важно, как я и изначально сказал, когда убедились, что я все-таки знаю чего хочу, не смогли предложить никакого решения, решили меня приравнять к ламеру. Хотелось блеснуть умом, а не вышло.
Т.е. вы скорее всего теоретически что-то знаете про ос, но на практике вы эдакий касперски.

-----
Реверсивная инженерия - написание кода идентичного натуральному


| Сообщение посчитали полезным: reversecode
. 1 . 2 . >>
 eXeL@B —› Программирование —› Остановить Non-Alertable поток
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати