Thread - как ее юзать

Тема в разделе "WASM.WIN32", создана пользователем warsem, 11 апр 2005.

  1. warsem

    warsem Сеня

    Публикаций:
    0
    Регистрация:
    26 янв 2005
    Сообщения:
    170
    Адрес:
    Германия, NRW
    почитал я тут вот это и мои руки стали чесаться.

    Вот только думаю как это дело будет работать если прогу закрыли. Т.е. ни как. А охото чтоб она остовалась.



    Я возможно не правильно понял? Но у меня такой ход мысли:

    <ul type=disc>

    <li>создаем кусок памяти(GlobalAlloc)

    <li>копируем процедуру туда(если у треда свой стек и регистры pusha/popa не нужен?)

    <li>создаем тред(CreateThread) с указателем на функцию

    <li>и з чистой совестью закрываем прогу.

    </ul>



    Будет работать, или я размечтался?
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    warsem

    Если программа завершится, т.е. завершится основной процесс, автоматически умрут все его треды. Надо отдельный процесс запускать через CreateProcess.
     
  3. warsem

    warsem Сеня

    Публикаций:
    0
    Регистрация:
    26 янв 2005
    Сообщения:
    170
    Адрес:
    Германия, NRW
    И что мне с этим процессом делать, если мне только тред нужен. Может чего посоветуешь?
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    warsem





    Будет, если создать тред в "удаленном" процессе, который должен оставаться работать :derisive:
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    warsem

    Процесс при создании сразу получает один "халявный" тред. А основной тред в свою очередь может создать ещё один или более тредов.
     
  6. warsem

    warsem Сеня

    Публикаций:
    0
    Регистрация:
    26 янв 2005
    Сообщения:
    170
    Адрес:
    Германия, NRW
    "Можно узнать, а в чем разница между процесом и тредом?

    И чем себя процес дескредитировал в твоих глазах?"


    хм.. Поставлю вопрос прямо. Хочу чтоб прога висела в памяти и выполняла работу, пока тачка просто работает. У z0mbie в FAQ последняя тема треды, но тема увы не раскрыта... А у Iczelion'а про это вообще ничего не говориться... Поэтому пока только одни догадки, и ни каких идей.



    "Будет, если создать тред в "удаленном" процессе, который должен оставаться работать :derisive:"

    а как сие сотворить? И что можно создать тред, который не будет ни кому принадлежать?



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

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    warsem



    Нет





    После завершения процесса, которому принадлежит данный тред - НИКАК.



    Нужно противостоять попыткам пользователя завершить процесс, спрятать процесс и т.д. Поиск по форуму.
     
  8. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576




    Создать thread через CreateRemoteThread в удаленном процессе, например, в виндовом explorer'е
     
  9. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    warsem

    Будет работать, или я размечтался?



    Это мой любимый способ оставить код резидентом.



    На примере 9х/Ме (под NT/XP я брезгую писать проги):

    1. Выделить память под код и данные выше 2Гб. Я использую для этих целей пару _PageReserve/_PageCommit вызываемые через VxDCall

    2. Скопировать туда что надо

    3. Затем сделать врезку в системе на этот код, чтобы он получал управление в нужный момент.

    Если нужно сделать обычный тред, то тогда идеальное место для перехвата/врезки -- это _ContextSwitch. После перехвата _ContextSwitch получаешь тред, выполняемый с самым высоким приоритетом во всех контекстах (надо только подождать переключения на нужный контекст). Естественно, сей "тред" никак не виден ОС и не убиваем. Этот механизм использовала StarForce для реализации "per-thread IDT".



    Для NT/XP всё конечно же по другому, но принципы должны оставаться верными.
     
  10. warsem

    warsem Сеня

    Публикаций:
    0
    Регистрация:
    26 янв 2005
    Сообщения:
    170
    Адрес:
    Германия, NRW
    хм. Из предложенного вижу перспективным спрятать процесс. Патчить код, слишком круто, я с 0-м кольцом еще не "знаком".



    Asterix

    т.е.? заразить эксплорер и при запуске создавать тред. Хм. Да, впринципе идея ничего, только эксплорер заражать не удобно, всякие там оверлеи. Но идея ясна, можно и что другое, постоянно запускаемое заражать.



    Идея Quantum: создав процесс и спрятав его, он будет пахать тихонько и не кто его не видет. Енто я правильно понял? т.е. в принципе и тред не нужен.
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    warsem



    Ты описание функции CreateRemoteThread смотрел?

    Я не предлагал заразить что-то лежащее на диске, explorer

    всегда запущен, и соответсвенно во время старта твоей

    проги(виря?) он тоже будет запущен, копируй код,

    создавай thread какой хочешь и глуши свою прогу,

    thread естно останется работать в процессе explorer
     
  12. warsem

    warsem Сеня

    Публикаций:
    0
    Регистрация:
    26 янв 2005
    Сообщения:
    170
    Адрес:
    Германия, NRW
    Asterix

    "...копируй код, создавай thread какой хочешь и глуши свою прогу, thread естно останется работать в процессе explorer..."

    Как это? Я создам тред, закрою процесс который его создал и тред останиться? Или как понять "глуши прогу", скрыть от глаз? Просто раннее Quantum

    говорил, что при закрыетие процеса дохнут все его треды.
     
  13. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    thread будет принадлежать "удаленному" процессу explorer и

    завершится только с завершением процесса explorer
     
  14. warsem

    warsem Сеня

    Публикаций:
    0
    Регистрация:
    26 янв 2005
    Сообщения:
    170
    Адрес:
    Германия, NRW
    Вау! Пойду пробовать...
     
  15. warsem

    warsem Сеня

    Публикаций:
    0
    Регистрация:
    26 янв 2005
    Сообщения:
    170
    Адрес:
    Германия, NRW
    Я тут сделал свои жалкие попытки... Вообщем у меня CreateRemoteThread глюково вызываеться.

    Я подозревая что не правильно ее вызываю.

    Это я нашел в win32.hlp(из борландовского лукошка):

    HANDLE CreateRemoteThread(

    <ul type=disc><li>HANDLE hProcess, //это ясно. Но сразу вопрос на будущее, нуль можно сунуть, или нужно этот долбанный GetModuleHandle вызывать?

    <li>LPSECURITY_ATTRIBUTES lpThreadAttributes, //оффсет на мега структуру(ниже о ней)

    <li>DWORD dwStackSize, //это длина стека

    <li>LPTHREAD_START_ROUTINE lpStartAddress, //это на начало функции. Да тут тоже вопрос. У тред свои регистры, свой стек, т.е. pusha/popa не нужны?

    <li>LPVOID lpParameter, //это вообще не понятно что за штука:dntknw:

    <li>DWORD dwCreationFlags, //какие еще флаги?

    <li>LPDWORD lpThreadId //сново не понятная чушь:dntknw:

    </ul>

    );

    Это та структура с атрибутами:

    typedef struct _SECURITY_ATTRIBUTES {<ul type=disc>

    <li> DWORD nLength; -чья длина? Треда чтоль?

    <li> LPVOID lpSecurityDescriptor; понял что если нуль то чтото случиться:dntknw:

    <li> BOOL bInheritHandle; тоже унбекант.

    </ul>} SECURITY_ATTRIBUTES;



    Вообщем тотальные проблемы с английским. Нигде никогда его не учил. Только знаю что такое input/print- из школьного курса бейсика:)



    ЗЫ Может бывают русские инфы по АПИ?
     
  16. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    HANDLE hProcess - нужен валидный хэндл процесса эксплорера, NULL не катит :)

    pusha/popa не нужны

    LPVOID lpParameter - это параметр, который ты можешь передать в свою ThreadProc (только один). Можно ничего не передавать - NULL

    ThreadProc proc lpParameter:lol: WORD

    DWORD dwCreationFlags - если NULL, тред стартует сразу после создания, если CREATE_SUSPENDED - спит, пока его не разбудят:)

    LPDWORD lpThreadId - это адрес переменной, куда вернется ID твоего треда. Если он не нужен (ID), можно NULL.

    DWORD nLength - размер структуры, а не треда: sizeof(SECURITY_ATTRIBUTES)



    А вообще лучше msdn, чем борландовский хэлп. Поподробней будет





    [​IMG] _2085248007__CreateRemoteThread.zip
     
  17. warsem

    warsem Сеня

    Публикаций:
    0
    Регистрация:
    26 янв 2005
    Сообщения:
    170
    Адрес:
    Германия, NRW
    Благодарю, буду дальше пробовать...
     
  18. warsem

    warsem Сеня

    Публикаций:
    0
    Регистрация:
    26 янв 2005
    Сообщения:
    170
    Адрес:
    Германия, NRW
    Это самое, а как работает GloabalAlloc, он после зарытия проги убивает кусок памяти или он остаеться занятым?
     
  19. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    warsem

    > "а как работает GloabalAlloc, он после зарытия проги убивает кусок памяти..."

    Угу, вся динамическая память погибает вместе с процессом.



    Похоже, ты упрощенно понимаешь задачу. Удаленный (remote) тред должен выполняться в адресном пространстве удаленного процесса, поэтому функция lpStartAddress должна существовать в этом процессе. А посему нужно ее сначала туда прописать.
     
  20. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    ... поэтому, для её вычисления нужно\можно использовать дельта-смещение