Сейчас на форуме: (+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)


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



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

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

difexacaw пишет:
Скорее он не хочет говорить про то, что нам знать не нужно.

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




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

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

rmn

Те кто так как ты думает и допускают критические ошибки.

-----
vx




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

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

difexacaw





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

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

galenkane пишет:
Сделал вот так
https://gist.github.com/lurumdare/d3a8558f544fe1cabf9f1fc2d6bdf179

Если функция не завершается после создания потока, по передаче параметров пойдёт. Но там стоит Sleep() - никогда нельзя полагаться на то, что какой-то поток обязательно выполнится в такое-то время. Сделай просто указатель на объект глобальным!

Добавлено спустя 9 минут
galenkane пишет:
ARCHANGEL задача как бы есть

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

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

Чё тогда не вставить в конце main() и везде, где вызывается CreateThread() с передачей указателя на объект на стеке, простую функцию WaitForSingleObject(hThread, INFINITE). Кстати, malloc() получает адрес не из стека, а из кучи. Есть calloc(), она выделяет память прямо на стеке. Считаю опасной функцией для использования серьёзно на практике.

Вообще любую структуру можно именно на стеке инициализировать
Code:
  1. struct A
  2. {
  3. int a;
  4. int b;
  5. ...
  6. };
  7.  
  8. ...
  9.  
  10. main()
  11. {
  12. A a;
  13. a.= 0;
  14. a.= 1;
  15. ...
  16. }


Добавлено спустя 13 минут
rmn пишет:
Причем здесь вообще какой-то стек?


galenkane пишет:
главное чтобы они были на стеке


rmn, ну что непонятного? Ему просто так ОЧЕНЬ нужно.
Можно так сделать.

Добавлено спустя 16 минут
По-моему, ТС прежде, чем ставить задачи(или выполнять), нужно сначала разобраться, что такое стек, потоки и как они связаны.

-----
IZ.RU




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

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

DenCoder пишет:
Есть calloc(), она выделяет память прямо на стеке.

Ты с alloca() путаешь. calloc() выделяет также в куче, только заполняет выделенный блок нулями.




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

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

rmn, ну видел, но не использовал никогда )

-----
IZ.RU




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

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

DenCoder пишет:
но не использовал никогда )

Да и не надо. Компилер сам ее вставляет, если локальных переменных больше, чем на 4кб. Ты можешь просто без задней мысли писать
Code:
  1. int values[1024*1024*1024];

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




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

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

rmn

Визорами.. что бы с этим работать нужно многое знать и не базовые вещи. Зачем ты упоминаешь их там где это не уместо.

DenCoder

> Чё тогда не вставить в конце main() и везде, где вызывается CreateThread() с передачей указателя на объект на стеке

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

-----
vx




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

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

difexacaw пишет:
Задача не известна, нельзя даже что то предположить.

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

Добавлено спустя 6 минут
difexacaw пишет:
Зачем ты упоминаешь их там где это не уместо.

А ты?




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

Создано: 06 января 2020 02:26
· Личное сообщение · #11

rmn

> А ты?

Я не сую туда где это не уместно. Что ты всё про визоры, это лишь удобные инструменты.

-----
vx




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

Создано: 06 января 2020 04:41 · Поправил: galenkane
· Личное сообщение · #12

rmn залетел в тему без настроения

Добавлено спустя 1 минуту
последний PoC
https://gist.github.com/lurumdare/a3c2c8c52bb4f455a3c48d94111e5613

Добавлено спустя 5 минут
DenCoder указатель на объект глобальным? это как?




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

Создано: 06 января 2020 12:12 · Поправил: difexacaw
· Личное сообщение · #13

Дайте повангую, может есть готовое..

Code:
  1. NTSTATUS
  2. RtlRemoteCall(
  3.     HANDLE Process,
  4.     HANDLE Thread,
  5.     PVOID CallSite,
  6.     ULONG ArgumentCount,
  7.     PULONG Arguments,
  8.     BOOLEAN PassContext,
  9.     BOOLEAN AlreadySuspended
  10.     )
  11.  
  12. /*++
  13.  
  14. Routine Description:
  15.  
  16.     This function calls a procedure in another thread/process, using
  17.     NtGetContext and NtSetContext.  Parameters are passed to the
  18.     target procedure via its stack.
  19.  
  20. Arguments:
  21.  
  22.     Process - Handle of the target process
  23.  
  24.     Thread - Handle of the target thread within that process
  25.  
  26.     CallSite - Address of the procedure to call in the target process.
  27.  
  28.     ArgumentCount - Number of 32 bit parameters to pass to the target
  29.                     procedure.
  30.  
  31.     Arguments - Pointer to the array of 32 bit parameters to pass.
  32.  
  33.     PassContext - TRUE if an additional parameter is to be passed that
  34.         points to a context record.
  35.  
  36.     AlreadySuspended - TRUE if the target thread is already in a suspended
  37.                        or waiting state.
  38.  
  39. Return Value:
  40.  
  41.     Status - Status value
  42.  
  43. --*/


Но лучше такое не юзать, это идёт поперёк защиты.

-----
vx





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

Создано: 06 января 2020 13:09
· Личное сообщение · #14

можно спорить до бесконечности. Но. Постановки задачи так и не было. Разместить данные на стеке - зачем? Зачем для этого потоки? Потоки в одном или в разных процессах?

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

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





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

Создано: 06 января 2020 13:19
· Личное сообщение · #15

ARCHANGEL

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

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

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

-----
vx




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

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

ARCHANGEL задача поставлена, держать данные на стеке. Алгоритмы не при чем. Обсуждаемое рассматривается как механизм защиты.




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

Создано: 06 января 2020 21:46 · Поправил: DenCoder
· Личное сообщение · #17

galenkane пишет:
DenCoder указатель на объект глобальным? это как?

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

Добавлено спустя 3 минуты
Чтобы передавать из main() локальные данные в функцию в другом потоке, функцию ожидания нужно вставить. Или ждёшь нажатия клавиши, или пакета по сети, по USB, или (проще будет) ждёшь завершения потока, в который передал указатель на локальные данные из главного потока.

-----
IZ.RU




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

Создано: 06 января 2020 21:57 · Поправил: galenkane
· Личное сообщение · #18

DenCoder пытался сделать на примере ожидание потока, что-то пошло не так. Создавал поток ожидающим, давал ему приоритет, потом вызывал ResumeThread. Не работает.

Добавлено спустя 4 минуты
Опишу задачу.

Есть много ООП.
Код делаем с виртуальными функциями.
Эти самые функции вызываем в потоках. Допустим три-четыре потока с синхронизацией. И крутим данные между ними.

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




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

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

galenkane пишет:
Создавал поток ожидающим, давал ему приоритет, потом вызывал ResumeThread.

WaitForSingleObject(hTtread, INFINITE)

-----
IZ.RU




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

Создано: 06 января 2020 23:08
· Личное сообщение · #20

galenkane пишет:
И чтобы отследить такое, придется изрядно постараться.

Не придется. Достаточно будет запустить код под визором и все выборки данных всплывут на поверхность




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

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

galenkane, да логику включи - main() завершится, что станет с "данными на стеке"? Если при этом запущенный поток ещё не успел их обработать или даже принять? Тебе об этом пытаются подсказать, но как будто даже не пытаешься понять никого.

-----
IZ.RU




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

Создано: 06 января 2020 23:17
· Личное сообщение · #22

DenCoder
Ну вот он и спрашивает, как локальные данные перекидывать из одного стека в другой. Якобы это реверсера сильно затормозит, лол.



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

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

rmn каждый реверсер использует визоры. Ну да. Особенно если прога накрыта виртуальной машиной.




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

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

DenCoder

> main() завершится, что станет с "данными на стеке"?

Интересный вопрос кстати. Обычно ведь не происходит понижения вложенности, те возврата из серии процедур до завершения потока. А удаление стека настраивается:

Code:
  1.                 if (Teb->FreeStackOnTermination) {
  2.                     
  3.                     Zero = 0;
  4.                     BaseAddress = Teb->DeallocationStack;
  5.                     ZwFreeVirtualMemory (NtCurrentProcess (),
  6.                                          &BaseAddress,
  7.                                          &Zero,
  8.                                          MEM_RELEASE);
  9.                 }


> Допустим три-четыре потока с синхронизацией. И крутим данные между ними.

Если потоки в одном АП, то достаточно глобальной переменной и локальной синхронизации.

-----
vx




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

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

galenkane пишет:
Особенно если прога накрыта виртуальной машиной.

Ты что не знаешь? Визорам виртуальные машины нипочем



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

Создано: 06 января 2020 23:46
· Личное сообщение · #26

difexacaw подскажите по локальной синхронизации, как сделать.




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

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

galenkane

slim-RWL, единственный способ сделать быстро. Иначе есть сотни всяких синхронизаций, семафоры евенты etc.

Вот тут --> Link <--

-----
vx





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

Создано: 07 января 2020 00:02
· Личное сообщение · #28

difexacaw пишет:
Обычно ведь не происходит понижения вложенности, те возврата из серии процедур до завершения потока.


Угу )

Но как там говорится, что имеет начало, имеет и конец! )

CrtStartup
main
CrtCleanup )

-----
IZ.RU





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

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

DenCoder

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

-----
vx





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

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

difexacaw пишет:
тс ведь сам код собирает и может это контролировать.

Мог бы - вопроса тогда и не стояло )

-----
IZ.RU





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

Создано: 07 января 2020 00:12
· Личное сообщение · #31

DenCoder

Я всё равно не понял какая задача. Если понимаешь, то напиши.

-----
vx



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