Сейчас на форуме: (+4 невидимых)

 eXeL@B —› Программирование —› Формат для передачи данных между потоками
. 1 . 2 . 3 . >>
Посл.ответ Сообщение

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

Создано: 02 января 2020 21:54
· Личное сообщение · #1

Хочу реализовать передачу данных между потоками через CreateThread

Вопрос состоит в том, как именно обернуть параметры функции.

Пример функции

Code:
  1.  bool Encrypt(const char* x1, const size_t x2, const unsigned char* x3, const unsigned char* x4, unsigned char* x5, size_t& x5)


Посоветуете что-то?



Ранг: 173.8 (ветеран), 208thx
Активность: 0.120.36
Статус: Участник

Создано: 02 января 2020 22:52
· Личное сообщение · #2

galenkane пишет:
передачу данных между потоками через CreateThread

... ну допустим. В lpParameter указатель на данные и как бы все. Зачем нужна непонятная "чудо-функция"?
Или вопрос должен звучать "как закриптовать данные", тогда контекст с потоками можно было не озвучивать.
Непонятно, б****!©



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

Создано: 02 января 2020 23:41
· Личное сообщение · #3

криптовать ничего не надо

Добавлено спустя 1 минуту
надо данные передавать на стек



Ранг: 158.4 (ветеран), 123thx
Активность: 0.140.49
Статус: Участник

Создано: 02 января 2020 23:45
· Личное сообщение · #4

galenkane пишет:
надо данные передавать на стек

Данные заносишь в структуру, адрес которой передаешь на стек. Больше никак.



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

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

Как из структуры потом достать данные?

Добавлено спустя 23 минуты
Сделал вот так
https://gist.github.com/lurumdare/d3a8558f544fe1cabf9f1fc2d6bdf179



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

Создано: 03 января 2020 10:10
· Личное сообщение · #6

galenkane, еще было бы неплохо освободить память из-под MessageBoxParameters




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 03 января 2020 15:08
· Личное сообщение · #7

Более ООП подход - файловые проекции. CreateFileMapping/OpenFileMapping. Для синхронизации можно использовать критические секции (один процесс) или события (разные процессы, можно и в одном, но будет медленнее). А вообще более детальное описание задачи, вероятно, помогло бы в поиске более качественного решения.

-----
Stuck to the plan, always think that we would stand up, never ran.




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

Создано: 03 января 2020 18:37
· Личное сообщение · #8

ARCHANGEL требуется работать с ООП и виртуальными функциями в потоках. Чтобы данные передавались между ними.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 03 января 2020 19:29
· Личное сообщение · #9

galenkane
Это всё ещё очень туманно

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 03 января 2020 19:46
· Личное сообщение · #10

ARCHANGEL

Крит секции могут быть глобальными, те для межпроцессной синхронизации. Вот только эти синхронизации использовались на младших версиях, затем их заменили на RWL, в частности SRWL. Так как в критсект нет разделения по типу доступа к ресурсам, а это не профайл.

rmn

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

galenkane

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

-----
vx




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

Создано: 03 января 2020 20:16
· Личное сообщение · #11

https://gist.github.com/lurumdare/8b6275107daf7283c0bb8a409045266a PoC на данный момент

хочется простоты на самом деле




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 03 января 2020 21:11
· Личное сообщение · #12

galenkane

Жуткая жуть, конечно, а не PoC. Потому я вам и предлагаю не костыли тут городить, а описать задачу. Практическую, которую вам нужно решить. Вряд ли на практике нужно так через жопу вызвать MessageBox.

-----
Stuck to the plan, always think that we would stand up, never ran.


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

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

Создано: 03 января 2020 22:51
· Личное сообщение · #13

ARCHANGEL задача хранить данные на стеке




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 04 января 2020 01:35
· Личное сообщение · #14

galenkane

Это чушь какая-то, а не задача. Вы уж меня простите за прямоту.

-----
Stuck to the plan, always think that we would stand up, never ran.




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

Создано: 04 января 2020 02:48
· Личное сообщение · #15

ARCHANGEL задача как бы есть

мб вы не поняли ее

главное чтобы они были на стеке




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 04 января 2020 09:38
· Личное сообщение · #16

galenkane пишет:
PoC на данный момент

вспомнилось




Ранг: 271.4 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 04 января 2020 10:08
· Личное сообщение · #17

Хз проблема в чем. Создай структуру, объяви локальную переменную этого типа, заполни, передай указатель на нее в lpParameter. Не забывай, что как только в текущем потоке завершится функция, в локальных переменных которой лежит это структура, папе сделают укол. Тебе советы по синтаксису твоего ЯП чтоли нужны?

-----
2 оттенка серого




Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 04 января 2020 10:13
· Личное сообщение · #18

galenkane
Твой "stackprotect" это один большой лулз с use-after-free как бонус. Нужно больше С++ кастов и прочей абсолютно ненужной здесь ООП мишуры. Без этого ты эти ссаные вин апи не дернешь однозначно.

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


Ранг: 271.4 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 04 января 2020 10:18 · Поправил: f13nd
· Личное сообщение · #19

В качестве альтернативы можешь рассмотреть WM_COPYDATA(PostThreadMessage). Ходят слухи, что даже между процессами можно данные ею передавать. Это будет всяко грамотней.

-----
2 оттенка серого




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

Создано: 04 января 2020 18:41
· Личное сообщение · #20

Alchemistry так-то на это не обращайте внимание.

f13nd спасибо гляну




Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 05 января 2020 01:51 · Поправил: difexacaw
· Личное сообщение · #21

f13nd

> WM_COPYDATA

В этом смысл - посылка нотифи в ожидающий обьект, поток выйдет из сна и получит данные; при этом событии стек сместится вниз, так как всякое сообщение доставляется как обратный вызов ядра с параметрами. Тоесть никаких траблов со стеком не произойдёт, в отличие от прямой записи в локальную переменную. Это отличается от обычного чтения данных, те например поток входит в сервис передавая указатель на чужую локаль, куда ядро запишет данные. Так нельзя делать, это создание уязвимости.

Если у тс есть окна, то он первым делом начнёт передавать таким образом указатели опять же на локальные переменные, при этом открыв возможность атаки - тогда из другого процесса можно передать произвольный указатель. Так и была когда то давно реализована атака на shelltray.

Тема походу про написание дырявого кода.

-----
vx




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

Создано: 05 января 2020 02:32
· Личное сообщение · #22

WM_COPYDATA для двух процессов?

Как быть с потоками?




Ранг: 271.4 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 05 января 2020 09:30
· Личное сообщение · #23

difexacaw пишет:
В этом смысл - посылка нотифи в ожидающий обьект, поток выйдет из сна и получит данные; при этом событии стек сместится вниз, так как всякое сообщение доставляется как обратный вызов ядра с параметрами.

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

-----
2 оттенка серого





Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 05 января 2020 13:01
· Личное сообщение · #24

f13nd

Потому что:

> задача хранить данные на стеке

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

-----
vx




Ранг: 158.4 (ветеран), 123thx
Активность: 0.140.49
Статус: Участник

Создано: 05 января 2020 13:44
· Личное сообщение · #25

difexacaw пишет:
А для этого нужно передать в функцию обмена данными указатель на эту область...

... и размер данных. И винда скопирует эти данные в другой контекст. Так же, как ты можешь использовать WM_SETTEXT с другим окном, при этом если окно в другом процессе, туда улетает LPARAM не из твоего адресного пространства.




Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 05 января 2020 13:56
· Личное сообщение · #26

rmn

И при выходе из функции обмена локальные данные будут уничтожены, так как стек сместится вверх. Можно зарезервировать место на стеке и туда копировать данные, но зачем. Где хранить указатель на этот буфер, в тлс.. тогда зачем нужен буфер на стеке.

-----
vx




Ранг: 158.4 (ветеран), 123thx
Активность: 0.140.49
Статус: Участник

Создано: 05 января 2020 14:02
· Личное сообщение · #27

difexacaw
Причем здесь вообще какой-то стек?




Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 05 января 2020 14:04
· Личное сообщение · #28

rmn

Откуда же мне знать, так нужно

-----
vx




Ранг: 158.4 (ветеран), 123thx
Активность: 0.140.49
Статус: Участник

Создано: 05 января 2020 14:10
· Личное сообщение · #29

difexacaw
Кому нужно? ТС просто идиот и не может внятно сформулировать задачу. В примере, что он выше привел, никакого "хранения на стеке" нет; выделяется структура с параметрами на куче и ее адрес передается в функции потоков. Единственная проблема там в том, что он неправильно управляет временем жизни структуры и все это упадет с эксепшеном, если луна в ненужной фазе будет.




Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 05 января 2020 20:27
· Личное сообщение · #30

rmn

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

-----
vx



. 1 . 2 . 3 . >>
 eXeL@B —› Программирование —› Формат для передачи данных между потоками
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати