Как обмануть систему и создать еще 2 потока в DllMain ?

Тема в разделе "WASM.WIN32", создана пользователем intel_x128, 27 май 2009.

  1. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    САБЖ
    Знаю что по правилам нельзя, но надо!
    Вопрос - как?

    Нужны именно потоки, а не фиберы...
     
  2. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    intel_x128
    А технически что тебе мешает?
     
  3. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    CreateThread, CreateRemoteThread или нативные юзай, а потом уже лечи симптомы...
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Поиск на форуме.
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Вот нашло:
    http://wasm.ru/forum/viewtopic.php?id=31189
     
  6. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    Clerk
    отлично, то что надо!
    спасибо :)
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Можно вручную анлокнуть ресурс.
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    n0name
    Нельзя, рекурсивный вызов получится. Таже InitRoutine но с другой причиной будет вызвана, когда модуль есчо не инициализирован. Освободить просто вручную:
    Код (Text):
    1.     invoke RtlLeaveCriticalSection, addr LdrpLoaderLock
    Либо вызвать LdrUnlockLoaderLock(). Не пробовал, но думаю что нормально не отработает после этого.
    Сразу после освобождения критической секции загрузчик выполняет вызов очистку очереди потока, посредством доставки апк, если они есть в очереди(NtTestAlert), тоесть есчо до начала исполнения потоком кода, адрес которого указан как стартовый адрес потока(до исполнения NtContinue в KiUserApcDispatcher()) будет доставлена апк. Ставим в InitRoutine, когда вызов с причиной DLL_PROCESS_ATTACH апк в очередь и отпускаем поток обрабатывать лодер далее, после инициализации лоадера будет доставлена апк, но только для текущего треда, так как второй тред ждёт на симафоре в критической секции с запрещённой обработкой апк(Alertable = False), тоесть это ничего не даёт.
    Новый тред начинается с апк и первая - LdrInitializeThunk(), которую ядро ставит в очередь, тоесть пока не будет отработана эта, другая не будет доставлена, нативный тред ничего не даст, нет возможности указать регистр Eax для потока, который создан в остановленном состоянии(чистить очередь потока нет возможности).
    Обработка исключения это лучшее решение видимо, конечно можно сплайс выполнить, но это не катируется както..
     
  9. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    А какие могут быть симптомы? я всегда просто создавал через CreateThread и никаких глюков небыло.
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    2FED
    Пока главный тред не отработает(он будет держать крит. секцию лоадера), остальные в этой секции будут его ждать, тоесть пока основной поток не вернётся остальные не будут ничего выполнять.
     
  11. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Можно в начале DllMain создать поток и завершить DllMain а из созданного потока создать поток DllMain пропустив создание потока и завершение. Тем самым получаем работающий DllMain и другой поток. Вот тока нахера создавать в DllMain потоки и еб*ть моск. Скорее всего это какаято сущность, которая подгружается к приложению, которое её совсем не ждёт... Тогда будет проще в твоей DLL экспортировать функцию и пропатчить entrypoint подопытного для вызова этой заглушки. DLL подгружается и из неё вызывается функция, дальше всё как и должно было быть без неё.
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    punxer
    Например если при инициализации вызвать диалог выбора файла(GetOpenFileName() и тп), а функция создаёт несколько тредов, это приведёт к дедлоку, все потоки заблокируются и никакое окно не появится.
     
  13. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Clerk Знаю. На то она и нужна инициализаия... Думаю лучше на самом деле патчить исполняемый файл, что бы он вызвал фанкцию из DLL. ИМХО ,наверное, самый простой и оправданный подход из возможных.