Русский / Russian English / Английский

Сейчас на форуме: (+3 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

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

Ранг: 24.5 (новичок)
Статус: Участник

Создано: 2 января 2020 21:54 New!
Цитата · Личное сообщение · #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)


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

Ранг: 148.0 (ветеран)
Статус: Участник

Создано: 5 января 2020 20:51 New!
Цитата · Личное сообщение · #2

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

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


Ранг: 325.1 (мудрец)
Статус: Участник

Создано: 5 января 2020 20:56 New!
Цитата · Личное сообщение · #3

rmn

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

Ранг: 148.0 (ветеран)
Статус: Участник

Создано: 5 января 2020 21:18 New!
Цитата · Личное сообщение · #4

difexacaw


Ранг: 322.2 (мудрец)
Статус: Участник

Создано: 5 января 2020 21:51 New!
Цитата · Личное сообщение · #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 минут
По-моему, ТС прежде, чем ставить задачи(или выполнять), нужно сначала разобраться, что такое стек, потоки и как они связаны.

Ранг: 148.0 (ветеран)
Статус: Участник

Создано: 5 января 2020 22:21 New!
Цитата · Личное сообщение · #6

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

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


Ранг: 322.2 (мудрец)
Статус: Участник

Создано: 5 января 2020 22:24 New!
Цитата · Личное сообщение · #7

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

Ранг: 148.0 (ветеран)
Статус: Участник

Создано: 5 января 2020 22:28 New!
Цитата · Личное сообщение · #8

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

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

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


Ранг: 325.1 (мудрец)
Статус: Участник

Создано: 6 января 2020 01:18 New!
Цитата · Личное сообщение · #9

rmn

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

DenCoder

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

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

Ранг: 148.0 (ветеран)
Статус: Участник

Создано: 6 января 2020 02:08 New!
Цитата · Личное сообщение · #10

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

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

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

А ты?


Ранг: 325.1 (мудрец)
Статус: Участник

Создано: 6 января 2020 02:26 New!
Цитата · Личное сообщение · #11

rmn

> А ты?

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

Ранг: 24.5 (новичок)
Статус: Участник

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

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

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

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


Ранг: 325.1 (мудрец)
Статус: Участник

Создано: 6 января 2020 12:12 · Поправил: difexacaw New!
Цитата · Личное сообщение · #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. --*/


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


Ранг: 669.3 (! !)
Статус: Участник
ALIEN Hack Team

Создано: 6 января 2020 13:09 New!
Цитата · Личное сообщение · #14

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

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


Ранг: 325.1 (мудрец)
Статус: Участник

Создано: 6 января 2020 13:19 New!
Цитата · Личное сообщение · #15

ARCHANGEL

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

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

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

Ранг: 24.5 (новичок)
Статус: Участник

Создано: 6 января 2020 20:38 New!
Цитата · Личное сообщение · #16

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


Ранг: 322.2 (мудрец)
Статус: Участник

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

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

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

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

Ранг: 24.5 (новичок)
Статус: Участник

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

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

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

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

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


Ранг: 322.2 (мудрец)
Статус: Участник

Создано: 6 января 2020 23:03 New!
Цитата · Личное сообщение · #19

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

WaitForSingleObject(hTtread, INFINITE)

Ранг: 148.0 (ветеран)
Статус: Участник

Создано: 6 января 2020 23:08 New!
Цитата · Личное сообщение · #20

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

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


Ранг: 322.2 (мудрец)
Статус: Участник

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

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

Ранг: 148.0 (ветеран)
Статус: Участник

Создано: 6 января 2020 23:17 New!
Цитата · Личное сообщение · #22

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

Ранг: 24.5 (новичок)
Статус: Участник

Создано: 6 января 2020 23:40 New!
Цитата · Личное сообщение · #23

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


Ранг: 325.1 (мудрец)
Статус: Участник

Создано: 6 января 2020 23:41 New!
Цитата · Личное сообщение · #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.                 }


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

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

Ранг: 148.0 (ветеран)
Статус: Участник

Создано: 6 января 2020 23:43 New!
Цитата · Личное сообщение · #25

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

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

Ранг: 24.5 (новичок)
Статус: Участник

Создано: 6 января 2020 23:46 New!
Цитата · Личное сообщение · #26

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


Ранг: 325.1 (мудрец)
Статус: Участник

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

galenkane

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

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


Ранг: 322.2 (мудрец)
Статус: Участник

Создано: 7 января 2020 00:02 New!
Цитата · Личное сообщение · #28

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


Угу )

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

CrtStartup
main
CrtCleanup )


Ранг: 325.1 (мудрец)
Статус: Участник

Создано: 7 января 2020 00:05 New!
Цитата · Личное сообщение · #29

DenCoder

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


Ранг: 322.2 (мудрец)
Статус: Участник

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

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

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


Ранг: 325.1 (мудрец)
Статус: Участник

Создано: 7 января 2020 00:12 New!
Цитата · Личное сообщение · #31

DenCoder

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

Видеокурс ВЗЛОМ