Сейчас на форуме: rmn, Magister Yoda, vasilevradislav, tyns777, zombi-vadim (+6 невидимых) |
![]() |
eXeL@B —› Программирование —› Создание процесса вручную. |
Посл.ответ | Сообщение |
|
Создано: 15 августа 2008 21:47 · Личное сообщение · #1 Два дня сижу над этой бедой, может кто то уже сталкивался с этим. Корчое создаю процесс из юзер моде. Без сипользования CreateProcessA(W). Ну т.е. через NtCReateProcess. Обычные проги работают на отлично. ПОд обычными понимаю всякие калькуляторы и паинты. Но вот с МНОГОПОТОЧНЫМИ прогами проблема. Причем все усугубляется тем, что этот созданный процесс крайне проблематично отладить. Например если поставить там ИНТ 3, то дебаггер всеравно не стартанет. А если приаттачиться, то дебаггер создает для себя НОВЫЙ ПОТОК для остановки процесса, и ессно уже состояние процесса совсем другое, т.е. ошибка вылетит уже фиг знает где. Короче если не пытаться отлаждивать, то новый треды не работают в процессе, созданном через NtCreateProcess. Как я понял, причина в том, что новые процессы получает стартовый адрес 0х00000000. Ну и ессно падают. Кто нибудь поборосля с этой проблемой? Если вообще кто нибудь сталкивался. ![]() |
|
Создано: 15 августа 2008 23:46 · Личное сообщение · #2 Сам разобрался. Может кому пригодиться. Начальная точка запуска у потоков, не тот адрес, который является точкой входа у ПЕ файла, а совсем другое место. Тоже самое справделиво и для поков, созданных руками. Вот пример. context.Eip = 0x7C8106F5; - тут должен быть адрес BaseProcessStartThunk или BaseThreadStartThunk context.Eax = entryPoint - а вот тут уже ПАРАМЕТРОМ идет сам указатель на энтри поинт NtCreateThread(&hThread, THREAD_ALL_ACCESS, &obAttr, hProcess, &ClientID, &context, &stack, TRUE); Иначе содержимое стека кривое, и процесс ПАДАЕТ. ![]() |
|
Создано: 15 августа 2008 23:58 · Личное сообщение · #3 |
|
Создано: 16 августа 2008 00:10 · Личное сообщение · #4 |
|
Создано: 16 августа 2008 08:38 · Личное сообщение · #5 Раз уж всё равно юзаешь АПИ, самым разумным способом, думаю, будет просто взять и посмотреть, как это делает винда, потрассить нтдлл. В совокупности с сорцами винды и реактос, это не должно быть особо сложно. Когда я мельком смотрел, там создаётся руками отдельно процесс, отдельно потоки и ещё какие настройки, типа csrss уведомлений происходят. Ещё на васме были статьи по созданию процессов руками, но не помню, как там предлагалось реализовать. ![]() |
|
Создано: 17 августа 2008 14:09 · Личное сообщение · #6 |
|
Создано: 18 августа 2008 15:08 · Поправил: coderess · Личное сообщение · #7 |
|
Создано: 20 августа 2008 23:23 · Личное сообщение · #8 |
|
Создано: 28 августа 2008 02:02 · Личное сообщение · #9 Согласен, литература изветсная, и ее нужно все же читать и как правельно заметил просвещаться, а не просто купить и поставить на полку для коллекции. Вот то место про которое ведем реч из книги Неббета. NT::CONTEXT context = {CONTEXT_FULL}; context.SegGs = 0; context.SegFs = 0x38; context.SegEs = 0x20; context.SegDs = 0x20; context.SegSs = 0x20; context.SegCs = 0x18; context.EFlags = 0x3000; context.Esp = ULONG(stack.ExpandableStackBase) - 4; context.Eip = ULONG(sii.EntryPoint); Как думаешь тут все в порядке? ЗЫ: Сравни с кодом который я привел дял примера. ![]() |
![]() |
eXeL@B —› Программирование —› Создание процесса вручную. |