|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
|
Акакий |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 6.7.2009 Репутация: нет Всего: нет |
Если кто может, пожалуйста, покажите пример на Delphi использования Nt(Zw)CreateProcess. Особенно интересует запись параметров(ком.строка, текущий каталог и т.п.) в РЕВ. Заранее спасибо
|
|||
|
||||
Riply |
|
|||
Опытный Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
У Nebbet`а в книге "Windows NT/2000: Native API Reference" есть примеры исходного кода с подробным описанием происходящего ( Example 6.1, Example 6.2 ) Книжку можно найти у Rouse_`а на http://rouse.drkb.ru/books.php Это сообщение отредактировал(а) Riply - 5.9.2011, 21:24 |
|||
|
||||
Акакий |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 6.7.2009 Репутация: нет Всего: нет |
Riply, спасибо конечно, но все это я видел еще в 200-лохматом годе, когда Клерк давал ссылки на исходники мелкомягких(на paste.org.ru по моему), да и у Зомби есть куча примеров на асме(правда там tls не обрабатывается)....вообще теории выше крыши Процесс и поток я создаю(через Int 2E), пишу секции, делаю контекст и все такое и процесс спокойненько себе создается....но не получается записать параметры. Замучался уже с сишными исходниками. К слову сказать, совершенно не обязательно уведомлять csrss. И товарищи, я не халявщик, но я !!!!!!!
ЗЗЗЗЫ!!!! И таки везде только одни обсуждения за боянистую тему про перехват NtCreateProcess и нигде нет как эту фукн-ю пользовать. И даже здесь http://forum.sources.ru/index.php?showtopi...p;#entry2741053, ув. Riply, Вы не приводите исходники самой интересной Вашей процедуры Proc_AllocAndWriteParameters(какая досада...) Это сообщение отредактировал(а) Акакий - 6.9.2011, 20:07 |
|||
|
||||
Riply |
|
||||
Опытный Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
Чудом раскопала исходники. В этой процедуре ничего особенного нет. Выделяем память в целевом, да пишем туда, что нужно Очень сложно выдергивать из проекта, бо она использует другие самодельные ф-ии, но вдруг поможет ?
P.S. В том топике говорила, еще раз повторю: отнюдь не факт, что здесь ошибок меньше чем строчек |
||||
|
|||||
Акакий |
|
||||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 6.7.2009 Репутация: нет Всего: нет |
итого мы делаем: 1) Var pp :RTL_USER_PROCESS_PARAMETERS; ImageFile :PUNICODE_STRING; //путь к ехе-шнику RtlCreateProcessParameters(@pp,ImageFile,Nil,CurrentDirectory,CommandLine,Nil,Nil,Nil,Nil,Nil); 2) формируем "блок окружения процесса",
pp.Environment:=pEnv; 3) пишем в процесс структуру RTL_USER_PROCESS_PARAMETERS: Var p2 :Pointer = Nil; ZwAllocateVirtualMemory(hProcess,p2,0,SizeOf(pp),...) ZwWriteVirtualMemory(hProcess,p2,pp,...) 4) получаем адрес РЕВ созданного процесса: Var pbi :PROCESS_BASIC_INFORMATION; ZwQueryInformationProcess(...,@pbi,...); и пишем в РЕВ(согласно его структуре) по смещению $10 адрес, по которому мы записали RTL_USER_PROCESS_PARAMETERS(т.е. указатель p2): ZwWriteVirtualMemory(hProcess,pbi.PebBaseAddress+$10,p2,4,...) ЗЫ ну и теперь дело остается за малым - в очередной раз убедиться, что все это не работает...(3 раза тьфу чтоб не сглазить) Это сообщение отредактировал(а) Акакий - 7.9.2011, 14:39 |
||||
|
|||||
Riply |
|
|||
Опытный Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
Акакий, с первого взгляда, вроде, похоже на правду.
|
|||
|
||||
Акакий |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 6.7.2009 Репутация: нет Всего: нет |
небольшая неточность - неверно определяется размер окружения - не учитываются нули в конце строк, нужно так:
|
|||
|
||||
Riply |
|
|||
Опытный Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
1. Почему or ? Вроде надо and. 2. Почему +1, а не SizeOf(CHAR) ? (и здесь аналогично: "Env1+2") |
|||
|
||||
Акакий |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 6.7.2009 Репутация: нет Всего: нет |
Мы ищем в последовательности байтов(на начало которой указывает Env1) два нуля подряд. Поэтому пока какой-нибудь из 2-х соседних байтов не ноль((Env2^<>#0) or (PChar(DWord(Env2)+1)^<>#0)) делаем Inc. В итоге получаем размер окружения, равный Env2-Env1+2(+2, т.к. в самом конце оставляем 2 нуля). |
|||
|
||||
Акакий |
|
||||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 6.7.2009 Репутация: нет Всего: нет |
все создается, процесс, поток и т.д., проходит примерно секунда и за сим процесс уходит в мир иной... Это сообщение отредактировал(а) Акакий - 11.9.2011, 19:00 |
||||
|
|||||
Акакий |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 6.7.2009 Репутация: нет Всего: нет |
Иго-го!!!! Оказывается, приложение можно запустить, вообще не вызывая Nt/ZwCreateProcess/Int $2E/call fs:[$C0]. И притом сделать это из ring3!!!! Проверено на WinXP32/64bit и Win7 32/64bit. Иго-го!!!!
|
|||
|
||||
kami |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
||||
|
||||
Акакий |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 6.7.2009 Репутация: нет Всего: нет |
Натурально ничего сверхъестественного, мне до Воланда и его свиты, как Акакию до собора парижской богоматери и даже дальше... вообщем - далеко очень Берем сисер и смотрим, что происходит по адресу, записанному в IDT по смещению $170 при eax=$2F Думаем, бросаем думать, снова думаем, вспоминаем про CloseHandle, DuplicateHandle и SetInformationThread, и догадываемся, как можно сделать почти то же самое в р3. Только не все так гладко, как сладко... Созданный таким образом процесс имеет ограничения: - в процессе не будут работь следующие API: CreateProcess, Sleep/NtDelayExecution/WaitForSingleObject, WaitForDebugEvent, ContinueDebugEvent; - из предыдущего, в числе прочего, следует, что такой процесс будет полностью съедать ресурсы 1 ядра CPU. Но выход из ситуации все же есть - вызывать для потоков нашего процесса SuspendThread/ResumeThread из другого процесса, кроме того, то же самое можно делать из потоков, внедренных в процесс извне(но не из созданных самим процессом) |
|||
|
||||
Правила форума "Delphi: WinAPI и системное программирование" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |