Сейчас на форуме: rmn, Magister Yoda, vasilevradislav, tyns777, zombi-vadim (+6 невидимых)

 eXeL@B —› Программирование —› Создание процесса вручную.
Посл.ответ Сообщение

Ранг: 7.9 (гость)
Активность: 0=0
Статус: Участник

Создано: 15 августа 2008 21:47
· Личное сообщение · #1

Два дня сижу над этой бедой, может кто то уже сталкивался с этим. Корчое создаю процесс из юзер моде. Без сипользования CreateProcessA(W). Ну т.е. через NtCReateProcess. Обычные проги работают на отлично. ПОд обычными понимаю всякие калькуляторы и паинты. Но вот с МНОГОПОТОЧНЫМИ прогами проблема. Причем все усугубляется тем, что этот созданный процесс крайне проблематично отладить. Например если поставить там ИНТ 3, то дебаггер всеравно не стартанет. А если приаттачиться, то дебаггер создает для себя НОВЫЙ ПОТОК для остановки процесса, и ессно уже состояние процесса совсем другое, т.е. ошибка вылетит уже фиг знает где. Короче если не пытаться отлаждивать, то новый треды не работают в процессе, созданном через NtCreateProcess. Как я понял, причина в том, что новые процессы получает стартовый адрес 0х00000000. Ну и ессно падают. Кто нибудь поборосля с этой проблемой? Если вообще кто нибудь сталкивался.



Ранг: 7.9 (гость)
Активность: 0=0
Статус: Участник

Создано: 15 августа 2008 23:46
· Личное сообщение · #2

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

context.Eip = 0x7C8106F5; - тут должен быть адрес BaseProcessStartThunk или BaseThreadStartThunk
context.Eax = entryPoint - а вот тут уже ПАРАМЕТРОМ идет сам указатель на энтри поинт

NtCreateThread(&hThread, THREAD_ALL_ACCESS, &obAttr, hProcess, &ClientID, &context, &stack, TRUE);

Иначе содержимое стека кривое, и процесс ПАДАЕТ.




Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 15 августа 2008 23:58
· Личное сообщение · #3

Слабо загрузить и запустить exe в своем процессе в отдельном потоке?

-----
have a nice day




Ранг: 7.9 (гость)
Активность: 0=0
Статус: Участник

Создано: 16 августа 2008 00:10
· Личное сообщение · #4

А это тут причем вообще?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 16 августа 2008 08:38
· Личное сообщение · #5

Раз уж всё равно юзаешь АПИ, самым разумным способом, думаю, будет просто взять и посмотреть, как это делает винда, потрассить нтдлл. В совокупности с сорцами винды и реактос, это не должно быть особо сложно. Когда я мельком смотрел, там создаётся руками отдельно процесс, отдельно потоки и ещё какие настройки, типа csrss уведомлений происходят. Ещё на васме были статьи по созданию процессов руками, но не помню, как там предлагалось реализовать.



Ранг: 7.9 (гость)
Активность: 0=0
Статус: Участник

Создано: 17 августа 2008 14:09
· Личное сообщение · #6

Ты думаешь я такой маньяк, что делал это совсе не смотря как делает винда или как в сорцах NT4/2000/ReactOs ? Просто сорцы этой функции огромные, и всегда можно что то неучесть.




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 18 августа 2008 15:08 · Поправил: coderess
· Личное сообщение · #7

[DEL]

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes





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

Создано: 20 августа 2008 23:23
· Личное сообщение · #8

В книге Гарри Небета про Native API есть пример реализации CreateProcessA(W) используя эти самые Native API, читай и просвещайся - литература известная, думаю, сам найдёшь

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




Ранг: 7.9 (гость)
Активность: 0=0
Статус: Участник

Создано: 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 —› Программирование —› Создание процесса вручную.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати